MyBatis框架的核心原理与执行流程:
半自动化ORM框架:开发者保留SQL控制权,框架负责参数映射、结果集转换,实现SQL与Java代码的松耦合。
SqlSessionFactory(工厂类)
mybatis-config.xml全局配置构建(数据源/事务/插件等)SqlSession(核心操作接口)
selectOne()/insert()等CRUD方法Executor执行器处理Mapper接口
MapperProxy)XML映射文件
parameterType)和结果映射(resultMap)配置加载阶段
javaInputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
Mapper.xml文件Mapper接口动态代理
SqlSession.getMapper(UserMapper.class)获取代理对象statementId(接口全限定名+方法名)SQL解析与执行
sql<!-- UserMapper.xml -->
<select id="selectUser" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>
Executor执行器处理事务/缓存StatementHandler构建PreparedStatementParameterHandler处理参数映射(#{id} → PreparedStatement参数)ResultSetHandler将ResultSet转换为Java对象结果返回
动态SQL生成
使用OGNL表达式解析<if> <foreach>等标签:
xml<select id="search">
SELECT * FROM products
<where>
<if test="name != null">AND name like #{name}</if>
<if test="price != null">AND price < #{price}</if>
</where>
</select>
延迟加载(Lazy Loading)
Proxy实现关联对象的按需加载<association fetchType="lazy">启用二级缓存机制
<cache/>标签显式开启)应用层 ↑ Mapper接口(DAO层) ↑ MyBatis核心 ├── 配置解析层(XML/Annotation → Configuration) ├── SQL执行层(Executor/StatementHandler) └── 数据处理层(TypeHandler/ResultSetHandler) ↑ JDBC驱动
SqlSessionTemplate
MapperScannerConfigurer
SqlSession.BATCH模式resultMap代替resultType<collection>一次性加载)| 特性 | MyBatis | Hibernate |
|---|---|---|
| SQL控制权 | 显式编写SQL | 自动生成HQL |
| 缓存机制 | 二级缓存需显式配置 | 一级/二级缓存自动管理 |
| 学习曲线 | 较低(熟悉SQL即可) | 较高(需掌握HQL) |
| 适合场景 | 复杂SQL/需深度优化 | 快速CRUD/简单查询 |
通过这种设计,MyBatis在保持SQL灵活性的同时,显著减少了JDBC样板代码量(约减少60%)。
本文作者:宁小健
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!