编辑
2025-02-27
Java
00
请注意,本文编写于 51 天前,最后修改于 51 天前,其中某些信息可能已经过时。

目录

核心设计思想
核心组件
执行流程(以查询为例)
关键技术实现
架构分层
与Spring整合关键
性能优化点
与Hibernate核心区别

MyBatis框架的核心原理与执行流程:


核心设计思想

半自动化ORM框架:开发者保留SQL控制权,框架负责参数映射、结果集转换,实现SQL与Java代码的松耦合。


核心组件

  1. SqlSessionFactory(工厂类)

    • 通过mybatis-config.xml全局配置构建(数据源/事务/插件等)
    • 生成SqlSession实例(类似JDBC的Connection)
  2. SqlSession(核心操作接口)

    • 提供selectOne()/insert()等CRUD方法
    • 实际委托给Executor执行器处理
  3. Mapper接口

    • 定义与XML映射文件对应的抽象方法
    • 通过动态代理生成实现类(MapperProxy
  4. XML映射文件

    • 存放SQL语句(支持动态SQL标签)
    • 定义参数类型(parameterType)和结果映射(resultMap

执行流程(以查询为例)

  1. 配置加载阶段

    java
    InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
    • 解析全局配置和所有Mapper.xml文件
    • 构建Configuration对象(包含完整映射关系)
  2. Mapper接口动态代理

    • 通过SqlSession.getMapper(UserMapper.class)获取代理对象
    • 代理类将方法调用转换为statementId(接口全限定名+方法名)
  3. SQL解析与执行

    sql
    <!-- UserMapper.xml --> <select id="selectUser" resultType="User"> SELECT * FROM users WHERE id = #{id} </select>
    • Executor执行器处理事务/缓存
    • StatementHandler构建PreparedStatement
    • ParameterHandler处理参数映射(#{id} → PreparedStatement参数)
    • ResultSetHandler将ResultSet转换为Java对象
  4. 结果返回

    • 根据resultType/resultMap进行对象装配
    • 返回单个对象或集合

关键技术实现

  1. 动态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>
  2. 延迟加载(Lazy Loading)

    • 通过Proxy实现关联对象的按需加载
    • 配置<association fetchType="lazy">启用
  3. 二级缓存机制

    • 一级缓存:SqlSession级别(默认开启)
    • 二级缓存:Mapper级别(需<cache/>标签显式开启)
    • 缓存策略可通过Ehcache等第三方库扩展

架构分层

应用层 ↑ Mapper接口(DAO层) ↑ MyBatis核心 ├── 配置解析层(XML/Annotation → Configuration) ├── SQL执行层(Executor/StatementHandler) └── 数据处理层(TypeHandler/ResultSetHandler) ↑ JDBC驱动

与Spring整合关键

  1. SqlSessionTemplate

    • 线程安全的SqlSession实现
    • 与Spring事务管理无缝集成
  2. MapperScannerConfigurer

    • 自动扫描并注册Mapper接口
    • 生成Spring容器管理的Bean

性能优化点

  1. 批量操作使用SqlSession.BATCH模式
  2. 复杂结果集优先使用resultMap代替resultType
  3. 避免N+1查询问题(使用<collection>一次性加载)
  4. 合理配置连接池参数(最大连接数/超时时间)

与Hibernate核心区别

特性MyBatisHibernate
SQL控制权显式编写SQL自动生成HQL
缓存机制二级缓存需显式配置一级/二级缓存自动管理
学习曲线较低(熟悉SQL即可)较高(需掌握HQL)
适合场景复杂SQL/需深度优化快速CRUD/简单查询

通过这种设计,MyBatis在保持SQL灵活性的同时,显著减少了JDBC样板代码量(约减少60%)。

本文作者:宁小健

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!