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 工程

创建时勾选三个依赖:LombokMyBatis FrameworkMySQL 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 语句有任何对应关系

五、易错点

  1. 忘记 @Mapper 注解 — 没加 @Mapper,Spring 容器中没有 UserMapper 的 Bean,@Autowired 注入会报错。
  2. 测试类包路径不对 — 测试类放在与引导类不同的包下且非子包,导致 Spring 扫不到,测试启动失败。
  3. 实体类字段名与数据库列名不一致 — 数据库列是 username,实体类写成了 userName,查出来的值为 null。
  4. application.properties 中数据库名写错 — url 中的 web01 写成了 web,连接不到正确的库。
  5. 依赖没勾全 — 创建项目时漏选 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 编写测试验证。底层靠动态代理让接口"自动拥有"实现类,靠连接池让数据库连接高效复用。掌握这章的五步入门流程,后面学增删改查就都是同一个套路了。

更多推荐