MyBatis 详解
1. 什么是 MyBatis?
MyBatis 是一款优秀的 持久层框架,它通过 XML 或注解配置,将 Java 对象(POJO)与数据库操作(SQL)进行灵活映射,简化了 JDBC 的复杂操作。
-
核心思想:SQL 与代码分离,开发者可专注 SQL 优化,同时享受 ORM(对象关系映射)的便捷。
-
定位:介于 JDBC 和全自动 ORM(如 Hibernate)之间的半自动化框架,灵活控制 SQL,适合复杂查询和高性能场景。
2. 核心特性
特性 | 说明 |
---|---|
动态 SQL | 支持条件分支(<if> 、<choose> )、循环(<foreach> )等动态生成 SQL。 |
参数映射 | 自动将 Java 对象属性映射到 SQL 参数(#{property} )。 |
结果集映射 | 将查询结果自动封装为 Java 对象(<resultMap> )。 |
缓存机制 | 提供一级缓存(SqlSession 级别)和二级缓存(Mapper 级别)。 |
插件扩展 | 支持自定义插件(如分页、日志),通过拦截器修改 MyBatis 核心行为。 |
3. 核心组件
1.SqlSessionFactory
-
作用:创建 SqlSession 的工厂类,全局唯一,通常由
SqlSessionFactoryBuilder
解析配置文件生成。 -
配置来源:XML 文件(如
mybatis-config.xml
)或 Java 代码。
2.SqlSession
-
作用:执行 SQL 操作、获取 Mapper 接口实例。非线程安全,需确保每次请求单独创建。
-
关键方法:
<T> T getMapper(Class<T> type); // 获取 Mapper 接口实例 int insert(String statement, Object parameter); // 直接执行 SQL
3.Mapper 接口与 XML 映射文件
-
Mapper 接口:定义数据库操作方法,方法名与 XML 中的 SQL ID 对应。
-
XML 映射文件:编写 SQL 语句,配置参数/结果映射。
4.Executor
-
作用:SQL 执行器,处理缓存、事务、语句调度等核心逻辑。
-
类型:
SimpleExecutor
(默认)、ReuseExecutor
(重用预处理语句)、BatchExecutor
(批处理)。
4. 工作原理
-
配置加载:
-
解析
mybatis-config.xml
,初始化数据源、事务管理器、Mapper 扫描路径等。 -
加载 Mapper XML 文件或扫描 Mapper 接口,构建 SQL 映射关系。
-
-
SqlSession 创建:
-
通过
SqlSessionFactory.openSession()
创建 SqlSession,内部包含Executor
和事务控制。
-
-
SQL 执行流程:
-
Mapper 代理:通过动态代理(如
MapperProxy
)将接口方法调用转发给 SqlSession。 -
SQL 解析:根据方法名找到对应的 SQL 语句,处理动态标签(如
<if>
)。 -
参数处理:将 Java 对象转换为 SQL 参数(
ParameterHandler
)。 -
SQL 执行:通过
Executor
执行 JDBC 操作,返回结果。 -
结果映射:将 ResultSet 转换为 Java 对象(
ResultSetHandler
)。
-
5. 缓存机制
缓存级别 | 作用范围 | 生命周期 | 开启方式 |
---|---|---|---|
一级缓存 | SqlSession 级别 | 随 SqlSession 关闭或清空 | 默认开启 |
二级缓存 | Mapper 级别 | 应用生命周期,可跨 SqlSession 共享 | XML 中配置 <cache/> 标签开启 |
6. 常见问题
-
MyBatis 与 Hibernate 的区别?
-
MyBatis:半自动化,需手动写 SQL,灵活控制细节。
-
Hibernate:全自动化,通过 HQL 操作对象,适合快速开发。
-
-
#{} 和 ${} 的区别?
-
#{}:预编译参数(防 SQL 注入),如
WHERE id = ?
。 -
**∗∗:字符串替换(慎用),如动态表名‘ORDERBY∗∗:字符串替换(慎用),如动态表名‘ORDERBY{column}`。
-
-
如何实现分页?
-
物理分页:使用插件(如 PageHelper)或数据库方言(
LIMIT
)。 -
内存分页:查询全部数据后在代码中分页(不推荐)。
-
7. 总结
-
优势:灵活控制 SQL、动态 SQL 强大、性能优化空间大。
-
适用场景:复杂查询、需深度优化 SQL、对数据库访问有精细控制需求的项目。
-
学习路径:掌握 XML/注解配置 → 理解动态 SQL → 熟悉缓存机制 → 整合 Spring/Spring Boot。