JavaWeb从0到1-DAY11-MyBatis入门

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 编写测试验证。底层靠动态代理 让接口"自动拥有"实现类,靠连接池让数据库连接高效复用。掌握这章的五步入门流程,后面学增删改查就都是同一个套路了。

相关推荐
闪电悠米1 小时前
黑马点评-优惠券秒杀-03_basic_seckill_and_oversell
java·数据库·spring boot·spring·缓存·oracle·面试
兰令水1 小时前
leecodecode【双指针题2】【2026.5.26打卡-java版本】
java·开发语言·算法
ch.ju1 小时前
Java程序设计(第3版)第四章——引用
java·开发语言
霸道流氓气质1 小时前
在Qoder中指定JDK和Maven运行AI学习的SpringBoot项目的完整指南
java·人工智能·maven
老码观察2 小时前
设计模式实战解读(七):适配器模式——让不兼容的接口无缝协作
java·设计模式·适配器模式
garmin Chen2 小时前
rabbitmq(1):核心机制与 SpringAMQP 详解
java·rabbitmq·java-rabbitmq
Mr_sst2 小时前
AI 大模型应用开发实习|如何找岗 + 面试真题 + 面经总结
java·人工智能·ai·面试·职场和发展
weelinking2 小时前
【产品】10_搭建前端框架——把你的原型变成真实页面
java·大数据·前端·数据库·人工智能·python·前端框架
一 乐2 小时前
图书电子商务网站系统|基于SprinBoot+vue图书电子商务网站设计与实现(源码+数据库+文档)
java·前端·数据库·vue.js·论文·毕设·图书电子商务网站系统