MyBatis核心概念与基础:半自动化ORM的灵活之道

一、ORM与MyBatis定位

半自动化 vs 全自动化ORM

ORM(Object-Relational Mapping)框架主要分为两大阵营:

  1. 全自动化ORM(如Hibernate):

    • 完全屏蔽SQL,通过操作对象自动生成SQL
    • 提供HQL语言,学习曲线较陡
    • 适合业务模型稳定的中大型项目
  2. 半自动化ORM(MyBatis):

图1

  • SQL控制权在开发者手中
  • 只需处理结果集到对象的映射
  • 适合需要复杂SQL优化或遗留系统改造的场景

实践建议:在需要精细控制SQL性能或处理复杂查询时选择MyBatis,在快速开发CRUD应用时考虑Hibernate。

二、核心组件解析

1. SqlSessionFactory与SqlSession

// 典型初始化过程
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = 
  new SqlSessionFactoryBuilder().build(inputStream);

// 使用示例
try (SqlSession session = sqlSessionFactory.openSession()) {
  UserMapper mapper = session.getMapper(UserMapper.class);
  User user = mapper.selectUser(1L);
}
  • SqlSessionFactory:全局单例,线程安全,建议应用生命周期内只创建一次
  • SqlSession:非线程安全,每次请求创建新实例,使用后必须关闭

2. Executor执行器类型

类型特点适用场景
Simple每次执行都创建新PreparedStatement常规操作
Reuse复用预处理语句相同SQL频繁执行
Batch批量操作优化大批量插入/更新

配置方式:

<settings>
  <setting name="defaultExecutorType" value="BATCH"/>
</settings>

3. MappedStatement

每个SQL操作(select|insert|update|delete)在内存中的表示,包含:

  • SQL源信息
  • 输入参数映射规则
  • 输出结果映射规则
  • 缓存配置等

实践建议:理解这些核心组件的生命周期对排查内存泄漏和性能问题至关重要。

三、基础开发模式

1. 注解 vs XML配置

注解开发示例

public interface UserMapper {
  @Select("SELECT * FROM users WHERE id = #{id}")
  User selectUser(long id);
  
  @Update("UPDATE users SET name=#{name} WHERE id=#{id}")
  void updateUser(User user);
}

XML配置示例

<mapper namespace="com.example.UserMapper">
  <select id="selectUser" resultType="User">
    SELECT * FROM users WHERE id = #{id}
  </select>
</mapper>

对比总结:

方式优点缺点
注解简单SQL直观,无需额外文件复杂SQL可读性差,无语法提示
XML复杂SQL清晰,支持动态SQL需要维护额外文件,跳转略麻烦

实践建议:简单CRUD使用注解,复杂查询和动态SQL使用XML配置。

2. 基本CRUD操作

完整示例展示:

public interface UserMapper {
  // Create
  @Insert("INSERT INTO users(name,email) VALUES(#{name},#{email})")
  @Options(useGeneratedKeys=true, keyProperty="id")
  int insertUser(User user);
  
  // Read
  @Select("SELECT * FROM users WHERE id = #{id}")
  User selectById(long id);
  
  // Update
  @Update("UPDATE users SET name=#{name}, email=#{email} WHERE id=#{id}")
  int updateUser(User user);
  
  // Delete
  @Delete("DELETE FROM users WHERE id = #{id}")
  int deleteUser(long id);
}

关键点说明:

  • #{} 是参数占位符,可防SQL注入
  • @Options 用于获取自增主键
  • 方法返回值:

    • insert/update/delete返回受影响行数
    • select返回映射的实体对象或集合

实践建议:所有写操作(insert/update/delete)必须显式提交事务,或者在Spring中配置事务管理。

四、核心价值与适用场景

MyBatis的核心优势体现在:

  1. SQL可控性:能直接编写和优化SQL
  2. 映射灵活性:支持复杂对象关系映射
  3. 轻量级架构:核心jar仅2MB左右,学习成本低

典型适用场景:

  • 需要与DBA协作优化SQL的金融系统
  • 需要处理复杂遗留数据库结构的项目
  • 对SQL性能有极致要求的互联网应用

通过理解这些基础概念,开发者可以更好地利用MyBatis的灵活性,在数据库访问层实现高效可靠的数据操作。

添加新评论