一、核心作用
-
封装 JDBC 操作
- 消除冗余的 JDBC 代码(如连接管理、参数设置、结果集处理等),提升开发效率。
- 通过 XML 或注解定义 SQL,实现 SQL 与代码的解耦。
-
灵活的 SQL 控制
- 支持动态 SQL(如
if
、choose
、foreach
标签),可根据条件生成不同的 SQL 语句。 - 允许编写复杂的 SQL 查询或存储过程调用。
- 支持动态 SQL(如
-
对象关系映射(ORM)
- 将数据库表结构映射到 Java 对象,自动转换结果集(如
ResultSet
→ Java Bean)。 - 支持高级映射(一对一、一对多、延迟加载等)。
- 将数据库表结构映射到 Java 对象,自动转换结果集(如
-
配置与扩展性
- 通过配置文件(
mybatis-config.xml
)管理数据源、事务、缓存等。 - 提供插件机制(如分页插件、日志插件),方便功能扩展。
- 通过配置文件(
二、实现原理
1. 核心组件
- SqlSessionFactory
- 读取配置文件(XML 或 Java API),构建唯一的工厂实例,用于创建
SqlSession
。
- 读取配置文件(XML 或 Java API),构建唯一的工厂实例,用于创建
- SqlSession
- 代表与数据库的会话,负责执行 SQL、提交 / 回滚事务、关闭连接等操作。
- Executor
- SQL 执行器,负责缓存管理和实际的 SQL 执行(如
SimpleExecutor
、BatchExecutor
)。
- SQL 执行器,负责缓存管理和实际的 SQL 执行(如
- StatementHandler
- 封装 JDBC
Statement
对象,处理参数设置和结果集获取。
- 封装 JDBC
- ParameterHandler
- 将 Java 参数转换为 SQL 语句的占位符值(如
#{}
→?
)。
- 将 Java 参数转换为 SQL 语句的占位符值(如
- ResultSetHandler
- 将
ResultSet
转换为 Java 对象或集合。
- 将
2. 执行流程
- 初始化
- 读取
mybatis-config.xml
和映射文件(*.xml
),解析并生成配置对象(Configuration
)。
- 读取
- 创建 SqlSession
- 通过
SqlSessionFactory.openSession()
获取SqlSession
。
- 通过
- 执行 SQL
- 通过
SqlSession.selectOne()
或selectList()
等方法执行映射文件中的 SQL。 - 动态 SQL 处理:根据条件生成最终的 SQL 语句。
- 通过
- 参数处理
ParameterHandler
将参数注入 SQL 占位符(如#{id}
→?
)。
- 结果映射
ResultSetHandler
将结果集转换为 Java 对象,支持resultType
或resultMap
配置。
- 事务管理
- 自动提交或手动提交事务(通过
SqlSession.commit()
)。
- 自动提交或手动提交事务(通过
3. 动态 SQL 实现
- 通过 XML 标签(如
if
、where
、trim
)动态拼接 SQL。 - 支持 OGNL 表达式,根据条件动态生成 SQL 片段。
4. 缓存机制
- 一级缓存(默认开启):基于
SqlSession
的本地缓存,减少对数据库的重复查询。 - 二级缓存(需配置):跨
SqlSession
的全局缓存,可通过Cache
接口自定义实现。
三、与其他框架的对比
- Hibernate:全自动 ORM 框架,适合快速开发简单业务,但 SQL 控制较弱。
- MyBatis:半自动化,SQL 完全可控,适合复杂查询和性能敏感场景。
四、适用场景
- 数据库交互复杂,需要手写优化 SQL。
- 遗留系统迁移或需要与存储过程集成。
- 对性能要求高,需精确控制 SQL 执行。
通过 MyBatis,开发者可在灵活性和开发效率之间找到平衡,尤其适合需要高度定制化 SQL 的项目。