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 操作数据库通常遵循以下固定步骤:
- 注册驱动
- 获取数据库连接
- 创建语句执行对象
- 执行 SQL 语句
- 处理结果集
- 释放资源
二、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 查询语句
执行查询语句需要使用 PreparedStatement 和 ResultSet。
// 假设已经获取了 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-starter和mysql-connector-java)。 - 配置数据源信息。
2. 核心配置
- 配置文件:在
application.yml或application.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>:执行插入语句,使用useGeneratedKeys和keyProperty可获取自增主键。<delete>:执行删除语句。<update>:执行更新语句。<select>:执行查询语句,resultType或resultMap属性指定返回结果类型。
五、注解开发
除了 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 语句。
关键点总结
- JDBC 是基础:理解 JDBC 的六个核心步骤是掌握任何 Java 持久层框架的基石。
- PreparedStatement 是必备技能:它不仅提升性能,更重要的是其防止 SQL 注入的安全性,在任何数据库操作中都应优先使用。
- MyBatis 是 JDBC 的封装:它的目的是简化开发,其底层依然通过 JDBC 与数据库交互。
- 连接池的重要性:在生产环境中,使用数据库连接池是必须的,它能极大提升应用性能。
- 选择开发方式:根据项目复杂度和团队习惯,灵活选择注解开发或 XML 配置。对于复杂 SQL,XML 的优势非常明显。
希望这份详尽的教学文档能帮助您系统地掌握 Spring Boot 中 JDBC 和 MyBatis 的使用。