MyBatis 入门学习笔记
一、这一章在讲什么
本章介绍 MyBatis 持久层框架的基础入门。从原生 JDBC 的痛点出发,引出 MyBatis 如何简化数据库操作,然后手把手走完一个 SpringBoot + MyBatis 查询用户数据的完整流程:创建项目、配置数据源、编写实体类和 Mapper 接口、运行测试。最后介绍数据库连接池的概念。
二、核心概念
1. MyBatis 是什么
- 是什么 :MyBatis 是一款优秀的持久层框架,是对 JDBC 的封装。
- 作用:简化 Java 操作数据库的代码,让开发者只需写 SQL + 接口就能操作数据库。
- 原理:通过代理机制,根据 Mapper 接口 + SQL 注解/XML 自动生成实现类,底层仍用 JDBC 执行 SQL。
- 易混淆点:MyBatis 不是数据库,也不是替代 SQL 的工具------它只是帮你省掉 JDBC 那堆样板代码。
2. JDBC vs MyBatis
| 痛点 | JDBC | MyBatis |
|---|---|---|
| 硬编码 | 数据库连接信息写死在代码中 | 配置在 application.properties |
| 繁琐 | 手动注册驱动、建连接、拼 SQL、遍历 ResultSet、关资源 | 只需定义 Mapper 接口 + SQL 注解 |
| 资源浪费 | 每次操作都新建/销毁连接 | 使用数据库连接池复用连接 |
| 性能低 | 频繁创建连接开销大 | 连接池 + 预编译 SQL,性能更好 |
3. 数据库连接池
- 是什么:一个存放数据库连接的"池子",连接用完后不销毁,放回池中供下次复用。
- 作用:避免频繁创建/销毁连接带来的性能开销。
- SpringBoot 默认使用 HikariCP 作为连接池。
4. Mapper 接口
- 是什么:一个用 @Mapper 标注的接口,定义操作数据库的方法。
- 命名规范:XxxMapper,如 UserMapper。
- 原理 :MyBatis 会为 @Mapper 接口动态生成代理对象(相当于帮你写实现类),代理对象执行你定义的 SQL 并返回结果。
- 初学者容易困惑 :只写接口不写实现类为什么能跑?答案是动态代理------MyBatis 在运行时帮你"补全"了实现。
三、重难点
重难点 1:为什么 @Mapper 接口不需要实现类?
- 结论:MyBatis 使用 JDK 动态代理,在运行时自动生成 Mapper 接口的实现类(代理对象),注入到 Spring 容器中。
- 原因:@Mapper 注解让 MyBatis 扫描到该接口 → 读取接口方法上的 @Select 等注解 → 生成代理对象 → 代理对象执行 SQL → 返回结果。
- 通俗比喻:你去餐厅点菜(调用 Mapper 接口方法),不需要自己下厨(写实现类),服务员(代理对象)会把菜名(SQL)传给后厨(数据库),然后上菜(返回结果)。
重难点 2:application.properties 配置的含义
- 结论:四项配置分别告诉 SpringBoot:连哪个数据库、用什么驱动、用户名、密码。
- 原因:SpringBoot 自动配置会读取这些以 spring.datasource.* 开头的属性,自动创建数据源和连接池。
- 通俗比喻:就像你要连 WiFi,需要知道 WiFi 名称(url)、加密方式(driver)、账号(username)、密码(password) 这四样东西。
spring.datasource.url=jdbc:mysql://localhost:3306/web01 → 数据库地址 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver → MySQL驱动 spring.datasource.username=root → 用户名 spring.datasource.password=1234 → 密码 mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl → 打印SQL日志
重难点 3:@SpringBootTest 的包路径要求
- 结论 :测试类所在的包名必须与 SpringBoot 引导类(@SpringBootApplication 所在类)的包名相同 ,或是其子包。
- 原因:@SpringBootApplication 默认扫描自身所在包及其子包。如果测试类在包外,Spring 容器扫不到,测试就会报错。
- 通俗比喻:引导类是"总指挥部",只管辖自己和下属部门(子包)------测试类必须在这个管辖范围内。
四、代码理解
入门程序完整步骤
步骤 1:创建 SpringBoot 工程
创建时勾选三个依赖:Lombok 、MyBatis Framework 、MySQL Driver
步骤 2:准备数据库表 + 实体类
数据库表 user:
| id | username | password | name | age |
|---|---|---|---|---|
| 1 | daqiao | 1234567890 | 大乔 | 22 |
| 2 | xiaoqiao | 123456 | 小乔 | 18 |
| ... | ... | ... | ... | ... |
实体类 User(字段名与表列名一一对应):
java public class User { private Integer id; // ID private String username; // 用户名 private String password; // 密码 private String name; // 姓名 private Integer age; // 年龄 // 省略 getter/setter(或用 Lombok @Data) }
步骤 3:配置 application.properties
`properties
↓ 连接哪个数据库
spring.datasource.url=jdbc:mysql://localhost:3306/web01
↓ MySQL 驱动类
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
↓ 数据库账号
spring.datasource.username=root
↓ 数据库密码
spring.datasource.password=1234
↓ 控制台打印 SQL(调试用)
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
`
步骤 4:编写 Mapper 接口
java @Mapper // ← 告诉 MyBatis:这个接口要生成代理对象 public interface UserMapper { @Select("select * from user") // ← SQL 写在这里 public List<User> findAll(); // ← 方法名随意,返回值对应查询结果 }
步骤 5:编写测试类
`java
@SpringBootTest // ← 加载 SpringBoot 环境
class UserMapperTest {
@Autowired
private UserMapper userMapper; // ← 自动注入代理对象
@Test
void testFindAll() {
List<User> userList = userMapper.findAll();
userList.forEach(System.out::println);
}
}
`
关键语法规则
- @Mapper:标注在接口上,让 MyBatis 生成代理对象并交给 Spring 管理
- @Select("SQL"):直接在方法上写 SQL 语句
- Mapper 接口方法名不需要和 SQL 语句有任何对应关系
五、易错点
- 忘记 @Mapper 注解 --- 没加 @Mapper,Spring 容器中没有 UserMapper 的 Bean,@Autowired 注入会报错。
- 测试类包路径不对 --- 测试类放在与引导类不同的包下且非子包,导致 Spring 扫不到,测试启动失败。
- 实体类字段名与数据库列名不一致 --- 数据库列是 username,实体类写成了 userName,查出来的值为 null。
- application.properties 中数据库名写错 --- url 中的 web01 写成了 web,连接不到正确的库。
- 依赖没勾全 --- 创建项目时漏选 MySQL Driver 或 MyBatis Framework,运行时找不到驱动或 MyBatis 类。
六、记忆口诀 / 通俗比喻
- JDBC vs MyBatis:JDBC 像自己去菜市场买菜洗菜切菜炒菜;MyBatis 像用外卖 App 点餐------你只负责"选"(写 SQL),配送(执行)交给平台。
- 连接池:数据库连接就像共享单车,骑完放回去(归还连接池),下一个人接着用,而不是每人买一辆新车。
- @Mapper 代理:就像你去银行办业务,你只签个字(调用接口方法),柜员(代理)帮你跑完所有流程(执行 SQL)。
- 五步入门口诀:建工程 → 建表建类 → 配连接 → 写 Mapper → 跑测试
七、应用
在实际开发中,这套 SpringBoot + MyBatis 组合是 Java 后端最常用的数据库操作方案:
- 凡是需要查询、新增、修改、删除数据库数据的地方,都用 Mapper 接口 + 注解(或 XML)来实现。
- 复杂的多表查询、动态条件查询,可以使用 MyBatis 的 XML 映射文件编写更灵活的 SQL。
- 生产环境通常会关闭 StdOutImpl 日志(性能考虑),改用专业的日志框架。
代码中的调用链:Controller → Service → Mapper → 数据库
八、最终总结
MyBatis 是对 JDBC 的封装,解决硬编码、繁琐、资源浪费三大痛点。核心用法只需三步:在 application.properties 配好数据库连接 → 写一个带 @Mapper 的接口并标注 SQL → 用 @SpringBootTest 编写测试验证。底层靠动态代理 让接口"自动拥有"实现类,靠连接池让数据库连接高效复用。掌握这章的五步入门流程,后面学增删改查就都是同一个套路了。