MyBatis 概述
什么是 MyBatis
MyBatis 是一款优秀的持久层框架
- 核心功能
- SQL 映射
将 Java 对象与数据库记录进行映射: - 动态 SQL
根据条件动态生成 SQL 语句: - 缓存机制
一级缓存和二级缓存: - 插件扩展
支持拦截器扩展功能:
- SQL 映射
- 主要优势
- 简单易学
上手简单: 学习成本低, - 灵活性强
支持原生 SQL: 灵活性高, - 解耦合
SQL 与代码分离: 便于维护, - 性能优秀
接近原生 JDBC 的性能:
- 简单易学
MyBatis 的核心概念
核心组件
- SqlSessionFactory
- 创建 SqlSession 的工厂
- 通常整个应用只需要一个实例
- SqlSession
- 执行 SQL 命令的对象
- 非线程安全
每次请求应创建新的实例,
- Mapper 接口
- 定义数据访问方法的接口
- MyBatis 自动生成实现类
- Executor
- SQL 执行器
负责执行 SQL 语句, - 有 Simple
Reuse、 Batch 三种类型、
- SQL 执行器
配置文件
- mybatis-config.xml
全局配置文件: - Mapper XML 文件
SQL 映射文件: - Mapper 接口
Java 接口定义:
MyBatis 的工作原理
执行流程
1 | 1. 读取配置文件 → 创建 SqlSessionFactory |
SQL 执行过程
1 | 解析 SQL → 参数映射 → 执行 SQL → 结果映射 → 返回结果 |
环境搭建
添加依赖
Maven 依赖
1 | <!-- MyBatis 核心依赖 --> |
Gradle 依赖
1 | implementation 'org.mybatis:mybatis:3.5.13' |
创建数据库表
1 | -- 创建用户表 |
创建实体类
1 | package com.example.entity; |
配置 MyBatis
全局配置文件
1 | <!-- mybatis-config.xml --> |
数据库配置文件
1 | # db.properties |
创建 Mapper 接口
1 | package com.example.mapper; |
创建 Mapper XML
1 | <!-- mapper/UserMapper.xml --> |
测试代码
1 | package com.example.test; |
CRUD 操作
查询操作
基本查询
1 | <!-- 简单查询 --> |
模糊查询
1 | <!-- 方式一 |
分页查询
1 | <!-- 物理分页 |
插入操作
基本插入
1 | <!-- 简单插入 --> |
批量插入
1 | <!-- 方式一 |
更新操作
基本更新
1 | <!-- 全量更新 --> |
批量更新
1 | <!-- 批量更新 --> |
删除操作
基本删除
1 | <!-- 单条删除 --> |
动态 SQL
if 标签
1 | <!-- 条件判断 --> |
choose/when/otherwise 标签
1 | <!-- 多选一 --> |
where 标签
1 | <!-- 智能处理 AND/OR --> |
set 标签
1 | <!-- 智能处理逗号 --> |
foreach 标签
1 | <!-- 遍历集合 --> |
trim 标签
1 | <!-- 自定义前后缀处理 --> |
bind 标签
1 | <!-- 创建变量 --> |
关联映射
一对一映射
数据库设计
1 | -- 用户表 |
实体类
1 | public class User { |
Mapper 配置
1 | <!-- 方式一 |
一对多映射
数据库设计
1 | -- 用户表 |
实体类
1 | public class User { |
Mapper 配置
1 | <!-- 嵌套结果方式 --> |
多对多映射
数据库设计
1 | -- 学生表 |
实体类
1 | public class Student { |
Mapper 配置
1 | <resultMap id="StudentWithCourses" type="Student"> |
缓存机制
一级缓存
- 作用域
SqlSession 级别: - 默认开启
无需配置: - 失效条件
: - 执行增删改操作
- 手动清空缓存
- SqlSession 关闭
1 | // 一级缓存示例 |
二级缓存
- 作用域
Mapper/Namespace 级别: - 需要配置
手动开启: - 共享性
多个 SqlSession 共享:
开启二级缓存
1 | <!-- mybatis-config.xml --> |
缓存配置说明
| 属性 | 说明 | 默认值 |
|---|---|---|
| eviction | 回收策略 | LRU |
| flushInterval | 刷新间隔 |
不刷新 |
| size | 缓存对象数量 | 1024 |
| readOnly | 是否只读 | false |
1 | 回收策略 |
使用二级缓存的注意事项
1 | <!-- 实体类必须实现 Serializable --> |
第三方缓存集成
EhCache 集成
1 | <!-- 添加依赖 --> |
Redis 集成
1 | <!-- 添加依赖 --> |
插件扩展
分页插件 PageHelper
添加依赖
1 | <dependency> |
配置插件
1 | <!-- mybatis-config.xml --> |
使用分页
1 | // 方式一 |
通用 Mapper
添加依赖
1 | <dependency> |
使用通用 Mapper
1 | // 继承通用 Mapper |
Spring 整合
Spring Boot 整合
添加依赖
1 | <dependency> |
配置文件
1 | # application.yml |
Mapper 接口
1 |
|
Service 层
1 |
|
Controller 层
1 |
|
最佳实践
命名规范
1 | Mapper 接口命名 |
性能优化
1 | <!-- 1. 避免使用 SELECT * --> |
安全建议
1 | <!-- 1. 防止 SQL 注入 |
代码规范
1 | // 1. 及时关闭 SqlSession |
常见问题
字段映射问题
1 | <!-- 问题 |
中文乱码问题
1 | # 数据库 URL 添加编码参数 |
日期时间处理
1 | <!-- 使用 Java 8 时间 API --> |
报错处理
💗💗 MyBatis 报错: BindingException
1 | 错误信息 |
💗💗 MyBatis 报错: PersistenceException
1 | 错误信息 |
💗💗 MyBatis 报错: TooManyResultsException
1 | 错误信息 |
学习资源
- 视频
- MyBatis 零基础教程
: https://www.bilibili.com/video/BV1VP4y1c7j7
- MyBatis 零基础教程
- 官方文档
- MyBatis 官方文档
: https://mybatis.org/mybatis-3/zh/index.html - MyBatis GitHub
: https://github.com/mybatis/mybatis-3
- MyBatis 官方文档
- 书籍
MyBatis 从入门到精通《 》 刘增辉著: 深入浅出 MyBatis 技术原理与实战《 》 杨开振著:
- 教程
- MyBatis 入门教程
: https://www.runoob.com/w3cnote/mybatis-tutorial.html - Baeldung MyBatis 教程
: https://www.baeldung.com/category/persistence/mybatis/
- MyBatis 入门教程
- 工具
- MyBatis Generator
代码生成工具: - MyBatis Plus
增强工具: - PageHelper
分页插件:
- MyBatis Generator
- 社区
- Stack Overflow MyBatis 标签
: https://stackoverflow.com/questions/tagged/mybatis - MyBatis 中文社区
: https://mybatis.org/
- Stack Overflow MyBatis 标签