【学习总结|DAY027】JAVA操作数据库

在后端开发中,Java 操作数据库是核心技能。本文将详细介绍 JDBC、MyBatis 及 SpringBoot 配置文件相关知识,并给出实用代码示例。

一、JDBC(Java DataBase Connectivity)

(一)简介

JDBC 是 sun 公司定义的操作关系型数据库的 API 规范。它如同一个标准接口,各数据库厂商实现此接口并提供驱动 jar 包。例如,我们在使用 MySQL 数据库时,需引入mysql-connector-j依赖。在代码中,通过Class.forName("com.mysql.cj.jdbc.Driver");注册驱动(在较新版本的 JDBC 中,这一步骤可省略),然后利用DriverManager.getConnection(url, user, password);获取数据库连接,其中url是数据库连接地址,如jdbc:mysql://localhost:3036/webuserpassword分别是数据库用户名和密码。

(二)查询数据

假设我们有user表,包含idusernamepassword等字段,现要查询usernamedaqiaopassword123456的用户信息。首先创建 maven 项目并引入相关依赖,同时准备好User实体类。代码如下:

java 复制代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcQueryExample {
    public static void main(String[] args) throws Exception {
        // 注册驱动(可省略)
        Class.forName("com.mysql.cj.jdbc.Driver");
        // 获取连接
        String url = "jdbc:mysql://localhost:3306/web01?serverTimezone=UTC";
        String user = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, user, password);
        // 获取Statement
        Statement stmt = conn.createStatement();
        // 执行SQL查询
        ResultSet resultSet = stmt.executeQuery("SELECT * FROM user WHERE username = 'daqiao' AND password = '123456'");
        // 处理结果
        while (resultSet.next()) {
            int id = resultSet.getInt("id");
            String username = resultSet.getString("username");
            String password = resultSet.getString("password");
            // 可继续获取其他字段信息
            System.out.println("id: " + id + ", username: " + username + ", password: " + password);
        }
        // 释放资源
        resultSet.close();
        stmt.close();
        conn.close();
    }
}

这里使用Statement执行 SQL 语句,通过ResultSetnext()方法逐行获取数据,并根据列名或编号获取具体字段值。

(三)增删改数据

以更新用户密码为例,将id1的用户密码更新为1234567890。代码如下:

java 复制代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcUpdateExample {
    public static void main(String[] args) throws Exception {
        // 准备工作
        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/web";
        Connection connection = DriverManager.getConnection(url, "root", "root@1234");
        Statement statement = connection.createStatement();
        // 执行SQL更新
        int rowsAffected = statement.executeUpdate("update user set password = '1234567890' where id = 1");
        System.out.println("受影响行数: " + rowsAffected);
        // 释放资源
        statement.close();
        connection.close();
    }
}

执行DML语句(如INSERTUPDATEDELETE)时,使用executeUpdate()方法,它返回受影响的行数。

(四)预编译 SQL

预编译 SQL 能防止 SQL 注入且性能更高。例如查询usernamepassword动态变化的用户信息:

java 复制代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JdbcPreparedStatementExample {
    public static void main(String[] args) throws Exception {
        // 获取连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/web", "root", "1234");
        // 预编译SQL
        PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM user WHERE username =? AND password =?");
        pstmt.setString(1, "linchong");
        pstmt.setString(2, "123456");
        // 执行查询
        ResultSet resultSet = pstmt.executeQuery();
        // 处理结果
        while (resultSet.next()) {
            int id = resultSet.getInt("id");
            String username = resultSet.getString("username");
            // 输出字段值
            System.out.println("id: " + id + ", username: " + username);
        }
        // 释放资源
        resultSet.close();
        pstmt.close();
        conn.close();
    }
}

这里使用PreparedStatement,通过setString()等方法设置参数,避免了 SQL 注入风险,且在多次执行类似 SQL 语句时,数据库可缓存编译后的语句,提高性能。

二、MyBatis

(一)简介

MyBatis 是优秀的持久层框架,简化了 JDBC 开发。它起源于 Apache 的 iBatis 项目,历经迁移和发展。其官网为https://mybatis.org/mybatis-3/zh_CN/index.html

(二)入门程序

以查询所有用户数据为例,首先创建 SpringBoot 工程并引入 MyBatis 相关依赖,准备user表和User实体类,在application.properties中配置数据库连接信息,如:

java 复制代码
spring.datasource.url=jdbc:mysql://localhost:3306/web
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=1234

然后编写 MyBatis 的持久层接口UserMapper

java 复制代码
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;

@Mapper
public interface UserMapper {
    @Select("select * from user")
    public List<User> findAll();
}

在测试类中(需添加@SpringBootTest注解),可通过@Autowired注入UserMapper并调用findAll()方法获取用户数据。

(三)JDBC 与 MyBatis 对比

JDBC 代码存在硬编码、繁琐、资源浪费和性能降低等问题。例如查询用户数据时,需手动创建连接、处理结果集和释放资源。而 MyBatis 通过简单的接口定义和配置,大大简化了操作,提高了开发效率。

(四)数据库连接池

数据库连接池负责管理数据库连接,如 Druid(阿里巴巴开源)、C3P0、DBCP、Hikari(SpringBoot 默认)等。以 Druid 为例,引入druid-spring-boot-starter依赖,并在application.properties中配置:

java 复制代码
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/web
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=1234

连接池可重用连接、提升系统响应速度并避免连接遗漏。

(五)增删改查操作

  • 删除用户
java 复制代码
import org.apache.ibatis.annotations.Delete;

@Mapper
public interface UserMapper {
    @Delete("delete from user where id = #{id}")
    public void deleteById(Integer id);
}
  • 添加用户
java 复制代码
import org.apache.ibatis.annotations.Insert;

@Mapper
public interface UserMapper {
    @Insert("insert into user(username,password,name,age) values(#{username},#{password},#{name},#{age})")
    public void insert(User user);
}
  • 更新用户
java 复制代码
import org.apache.ibatis.annotations.Update;

@Mapper
public interface UserMapper {
    @Update("update user set username=#{username}, password=#{password}, name=#{name}, age=#{age} where id=#{id}")
    public void update(User user);
}
  • 查询用户
java 复制代码
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface UserMapper {
    @Select("select * from user where username=#{username} and password=#{password}")
    public User findByUsernameAndPassword(@Param("username") String uname, @Param("password") String pwd);
}

在 MyBatis 中,#{}是占位符,会生成预编译 SQL,安全且性能高;${}是拼接符,存在 SQL 注入风险,常用于表名、字段名动态设置。

(六)XML 映射配置

MyBatis 支持 XML 配置 SQL 语句,规则如下:

  • XML 映射文件与 Mapper 接口同包同名。
  • XML 文件的namespace属性为 Mapper 接口全限定名。
  • XML 文件中sql语句的id与 Mapper 接口方法名一致且返回类型一致。例如:
XML 复制代码
<mapper namespace="com.itheima.mapper.UserMapper">
    <select id="findAll" resultType="com.itheima.pojo.User">
        select id, username, password, name, age from user
    </select>
</mapper>

一般简单增删改查可用注解,复杂 SQL 功能建议用 XML 配置。

三、SpringBoot 配置文件

SpringBoot 支持application.propertiesapplication.yamlapplication.yml配置文件。application.properties格式较为臃肿、层级结构不清晰。application.yamlapplication.yml简洁且以数据为中心,使用缩进表示层级关系,数值前需空格,注释用#。例如:

java 复制代码
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/web01
    username: root
    password: 1234
  mybatis:
    configuration:
      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

yml文件中,若配置项值以0开头,需用''引起来,防止被解析为八进制。

通过对以上 Java 操作数据库技术的学习和实践,我们能更好地应对后端开发中的数据持久化需求,提升开发效率和应用性能。在实际项目中,可根据具体场景灵活选择 JDBC、MyBatis 及合适的配置方式,构建稳定可靠的后端系统。

相关推荐
啊烨疯狂学java5 分钟前
EasyExcel监听器详解
java·easyexcel
北极糊的狐1 小时前
SQL中,# 和 $ 用于不同的占位符语法
java·开发语言
小龙在山东2 小时前
memcached的基本使用
数据库·缓存·memcached
亦世凡华、2 小时前
MySQL--》快速提高查询效率:SQL语句优化技巧与实践
数据库·经验分享·sql·mysql·sql优化
漫漫不慢.2 小时前
九进制转10进制
java·开发语言
大小科圣2 小时前
windows配置jdk
java·开发语言
不是二师兄的八戒3 小时前
深入 Redis:高级特性与最佳实践
数据库·redis·缓存
鲤籽鲲3 小时前
C# 内置值类型
android·java·c#
顾北辰203 小时前
利用Deeplearning4j进行 图像识别
java·spring boot·机器学习
杂货铺的小掌柜3 小时前
spring mvc源码学习笔记之一
学习·spring·mvc