Springboot mybatis与jdbc学习
字数 2080 2025-11-04 20:48:53

Spring Boot 整合 JDBC 与 MyBatis 教学文档

第一部分:JDBC 数据库操作

一、JDBC 简介

1. 核心概念

  • JDBC:全称为 Java DataBase Connectivity,是 Java 语言中用于规范客户端程序如何访问关系型数据库的应用程序接口。它提供了一套标准的 API,用于执行 SQL 语句。
  • 驱动:JDBC 本身是接口,具体的实现由各个数据库厂商提供,这些实现就是 JDBC 驱动。开发者需要引入对应数据库的驱动 Jar 包。

2. 核心步骤
使用 JDBC 操作数据库通常遵循以下固定步骤:

  1. 注册驱动
  2. 获取数据库连接
  3. 创建语句执行对象
  4. 执行 SQL 语句
  5. 处理结果集
  6. 释放资源

二、JDBC 入门程序

1. 环境准备

  • 创建一个 Maven 项目。
  • pom.xml 文件中引入 MySQL 驱动依赖。
  • 准备数据库表。

2. 代码实现(以 DML 语句为例,如 UPDATE)

// 1. 注册驱动 (新版本驱动可省略此步,但显式声明更规范)
Class.forName("com.mysql.cj.jdbc.Driver");

// 2. 获取数据库连接
// 格式:jdbc:mysql://主机地址:端口号/数据库名?参数键值对
String url = "jdbc:mysql://localhost:3306/db_test?useSSL=false&serverTimezone=UTC";
String username = "your_username";
String password = "your_password";
Connection connection = DriverManager.getConnection(url, username, password);

// 3. 创建 Statement 语句执行对象
Statement statement = connection.createStatement();

// 4. 执行 SQL 语句 (此处为 DML 更新语句)
String sql = "UPDATE user SET age = 25 WHERE id = 1";
int affectedRows = statement.executeUpdate(sql); // 返回受影响的行数
System.out.println("更新了 " + affectedRows + " 行数据。");

// 5. 释放资源 (务必进行,反向关闭)
statement.close();
connection.close();

三、执行 DQL 查询语句

执行查询语句需要使用 PreparedStatementResultSet

// 假设已经获取了 Connection 对象 conn

// 使用预编译 SQL 语句,防止 SQL 注入
String sql = "SELECT id, username, password, name, age FROM user WHERE username = ? AND password = ?";
// 3. 获取 PreparedStatement 对象,并预编译 SQL
PreparedStatement pstmt = conn.prepareStatement(sql);

// 为 SQL 语句中的占位符 ‘?’ 设置参数 (索引从1开始)
pstmt.setString(1, "daqiao"); // 设置第一个问号的值为 "daqiao"
pstmt.setString(2, "123456"); // 设置第二个问号的值为 "123456"

// 4. 执行查询,返回 ResultSet 结果集
ResultSet rs = pstmt.executeQuery();

// 5. 处理结果集
// ResultSet 对象内部有一个指针,初始指向第一行数据之前
// rs.next() 方法将指针移动到下一行,如果存在下一行则返回 true,否则返回 false
while (rs.next()) {
    // 通过列名或列索引从当前行获取数据
    User user = new User();
    user.setId(rs.getInt("id"));
    user.setUsername(rs.getString("username"));
    user.setPassword(rs.getString("password"));
    user.setName(rs.getString("name"));
    user.setAge(rs.getInt("age"));

    System.out.println(user);
}

// 6. 释放资源
rs.close();
pstmt.close();
conn.close();

四、SQL 预编译(PreparedStatement)

1. 优势

  • 性能更高:SQL 语句会被数据库预编译并缓存。当多次执行相同结构的 SQL(仅参数不同)时,数据库会直接使用缓存的编译结果,无需再次编译,效率显著提升。
  • 防止 SQL 注入:这是最重要的安全优势。

2. 原理
预编译的核心在于:SQL 语句在发送到数据库时,其中的参数使用占位符 ? 代替。数据库的解析/编译阶段只处理 SQL 的结构(将占位符视为参数标记),而不处理具体的参数值。后续传入的用户数据仅仅作为“值”绑定到这些占位符上。因此,用户输入的数据在解析阶段不可能成为 SQL 语法的一部分,从根本上杜绝了 SQL 注入攻击。

示例:

-- 普通 Statement,存在拼接,易被注入
String sql = "SELECT ... FROM user WHERE username = '" + inputName + "'";

-- PreparedStatement,使用占位符
String sql = "SELECT ... FROM user WHERE username = ?";
pstmt.setString(1, inputName); // 无论 inputName 是什么,都只会被当作一个字符串值

第二部分:MyBatis 框架

一、MyBatis 简介

MyBatis 是一个优秀的持久层框架,它封装了 JDBC 的繁琐操作,使开发者只需关注 SQL 语句本身,而不需要花费精力去处理注册驱动、创建连接、手动设置参数、结果集检索等过程。

二、MyBatis 入门程序

1. 环境准备

  • 在 Spring Boot 项目中,引入 MyBatis 和数据库驱动依赖(如 mybatis-spring-boot-startermysql-connector-java)。
  • 配置数据源信息。

2. 核心配置

  • 配置文件:在 application.ymlapplication.properties 中配置数据源连接信息和 MyBatis 的基本设置(如映射文件位置)。
    # application.yml 示例
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/db_test
        username: your_username
        password: your_password
        driver-class-name: com.mysql.cj.jdbc.Driver
    
    # MyBatis 配置
    mybatis:
      mapper-locations: classpath:mapper/*.xml  # 指定 XML 映射文件的位置
      type-aliases-package: com.example.entity  # 配置实体类别名包
    
  • 映射文件:创建 XML 文件(如 UserMapper.xml)来编写 SQL 语句。
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.example.mapper.UserMapper">
        <select id="selectUserById" resultType="User">
            SELECT * FROM user WHERE id = #{id}
        </select>
    </mapper>
    
  • 接口:创建一个 Java 接口,方法名与映射文件中的 SQL 语句 ID 对应。
    @Mapper // 使用 @Mapper 注解,Spring Boot 会自动为其创建代理对象
    public interface UserMapper {
        User selectUserById(Integer id);
    }
    

三、数据库连接池

  • 作用:MyBatis 集成了数据库连接池(如 HikariCP,Spring Boot 2.x 后的默认连接池)。连接池负责管理、复用数据库连接,避免了频繁创建和关闭连接带来的巨大性能开销。
  • 优势:提升应用响应速度,节约系统资源。

四、增删改查操作

在 MyBatis 的映射文件中,使用不同的标签来执行相应的操作:

  • <insert>:执行插入语句,使用 useGeneratedKeyskeyProperty 可获取自增主键。
  • <delete>:执行删除语句。
  • <update>:执行更新语句。
  • <select>:执行查询语句,resultTyperesultMap 属性指定返回结果类型。

五、注解开发

除了 XML 配置,MyBatis 也支持使用注解直接在 Mapper 接口的方法上编写 SQL,使代码更简洁。

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM user WHERE id = #{id}")
    User findById(Integer id);

    @Insert("INSERT INTO user (username, age) VALUES (#{username}, #{age})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(User user);

    @Update("UPDATE user SET username=#{username} WHERE id=#{id}")
    int update(User user);

    @Delete("DELETE FROM user WHERE id = #{id}")
    int deleteById(Integer id);
}

注解 vs XML:

  • 注解:简单直观,适合简单的、固定的 SQL 语句。
  • XML:功能更强大,尤其适合编写复杂的、动态的 SQL(如条件查询 <if>, <where>,循环 <foreach> 等),且便于管理大量的 SQL 语句。

关键点总结

  1. JDBC 是基础:理解 JDBC 的六个核心步骤是掌握任何 Java 持久层框架的基石。
  2. PreparedStatement 是必备技能:它不仅提升性能,更重要的是其防止 SQL 注入的安全性,在任何数据库操作中都应优先使用。
  3. MyBatis 是 JDBC 的封装:它的目的是简化开发,其底层依然通过 JDBC 与数据库交互。
  4. 连接池的重要性:在生产环境中,使用数据库连接池是必须的,它能极大提升应用性能。
  5. 选择开发方式:根据项目复杂度和团队习惯,灵活选择注解开发或 XML 配置。对于复杂 SQL,XML 的优势非常明显。

希望这份详尽的教学文档能帮助您系统地掌握 Spring Boot 中 JDBC 和 MyBatis 的使用。

Spring Boot 整合 JDBC 与 MyBatis 教学文档 第一部分:JDBC 数据库操作 一、JDBC 简介 1. 核心概念 JDBC :全称为 Java DataBase Connectivity,是 Java 语言中用于规范客户端程序如何访问关系型数据库的 应用程序接口 。它提供了一套标准的 API,用于执行 SQL 语句。 驱动 :JDBC 本身是接口,具体的实现由各个数据库厂商提供,这些实现就是 JDBC 驱动 。开发者需要引入对应数据库的驱动 Jar 包。 2. 核心步骤 使用 JDBC 操作数据库通常遵循以下固定步骤: 注册驱动 获取数据库连接 创建语句执行对象 执行 SQL 语句 处理结果集 释放资源 二、JDBC 入门程序 1. 环境准备 创建一个 Maven 项目。 在 pom.xml 文件中引入 MySQL 驱动依赖。 准备数据库表。 2. 代码实现(以 DML 语句为例,如 UPDATE) 三、执行 DQL 查询语句 执行查询语句需要使用 PreparedStatement 和 ResultSet 。 四、SQL 预编译(PreparedStatement) 1. 优势 性能更高 :SQL 语句会被数据库预编译并缓存。当多次执行相同结构的 SQL(仅参数不同)时,数据库会直接使用缓存的编译结果,无需再次编译,效率显著提升。 防止 SQL 注入 :这是最重要的安全优势。 2. 原理 预编译的核心在于:SQL 语句在发送到数据库时,其中的参数使用占位符 ? 代替。数据库的解析/编译阶段只处理 SQL 的 结构 (将占位符视为参数标记),而不处理具体的参数值。后续传入的用户数据仅仅作为“值”绑定到这些占位符上。因此,用户输入的数据在解析阶段不可能成为 SQL 语法的一部分,从根本上杜绝了 SQL 注入攻击。 示例: 第二部分:MyBatis 框架 一、MyBatis 简介 MyBatis 是一个优秀的 持久层框架 ,它封装了 JDBC 的繁琐操作,使开发者只需关注 SQL 语句本身,而不需要花费精力去处理注册驱动、创建连接、手动设置参数、结果集检索等过程。 二、MyBatis 入门程序 1. 环境准备 在 Spring Boot 项目中,引入 MyBatis 和数据库驱动依赖(如 mybatis-spring-boot-starter 和 mysql-connector-java )。 配置数据源信息。 2. 核心配置 配置文件 :在 application.yml 或 application.properties 中配置数据源连接信息和 MyBatis 的基本设置(如映射文件位置)。 映射文件 :创建 XML 文件(如 UserMapper.xml )来编写 SQL 语句。 接口 :创建一个 Java 接口,方法名与映射文件中的 SQL 语句 ID 对应。 三、数据库连接池 作用 :MyBatis 集成了数据库连接池(如 HikariCP,Spring Boot 2.x 后的默认连接池)。连接池负责管理、复用数据库连接,避免了频繁创建和关闭连接带来的巨大性能开销。 优势 :提升应用响应速度,节约系统资源。 四、增删改查操作 在 MyBatis 的映射文件中,使用不同的标签来执行相应的操作: <insert> :执行插入语句,使用 useGeneratedKeys 和 keyProperty 可获取自增主键。 <delete> :执行删除语句。 <update> :执行更新语句。 <select> :执行查询语句, resultType 或 resultMap 属性指定返回结果类型。 五、注解开发 除了 XML 配置,MyBatis 也支持使用注解直接在 Mapper 接口的方法上编写 SQL,使代码更简洁。 注解 vs XML: 注解 :简单直观,适合简单的、固定的 SQL 语句。 XML :功能更强大,尤其适合编写复杂的、动态的 SQL(如条件查询 <if> , <where> ,循环 <foreach> 等),且便于管理大量的 SQL 语句。 关键点总结 JDBC 是基础 :理解 JDBC 的六个核心步骤是掌握任何 Java 持久层框架的基石。 PreparedStatement 是必备技能 :它不仅提升性能,更重要的是其 防止 SQL 注入 的安全性,在任何数据库操作中都应优先使用。 MyBatis 是 JDBC 的封装 :它的目的是简化开发,其底层依然通过 JDBC 与数据库交互。 连接池的重要性 :在生产环境中,使用数据库连接池是必须的,它能极大提升应用性能。 选择开发方式 :根据项目复杂度和团队习惯,灵活选择注解开发或 XML 配置。对于复杂 SQL,XML 的优势非常明显。 希望这份详尽的教学文档能帮助您系统地掌握 Spring Boot 中 JDBC 和 MyBatis 的使用。