MyBatis核心解析:半自动化ORM原理与实践指南
MyBatis核心概念与基础:半自动化ORM的灵活之道
一、ORM与MyBatis定位
半自动化 vs 全自动化ORM
ORM(Object-Relational Mapping)框架主要分为两大阵营:
全自动化ORM(如Hibernate):
- 完全屏蔽SQL,通过操作对象自动生成SQL
- 提供HQL语言,学习曲线较陡
- 适合业务模型稳定的中大型项目
- 半自动化ORM(MyBatis):
- 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的核心优势体现在:
- SQL可控性:能直接编写和优化SQL
- 映射灵活性:支持复杂对象关系映射
- 轻量级架构:核心jar仅2MB左右,学习成本低
典型适用场景:
- 需要与DBA协作优化SQL的金融系统
- 需要处理复杂遗留数据库结构的项目
- 对SQL性能有极致要求的互联网应用
通过理解这些基础概念,开发者可以更好地利用MyBatis的灵活性,在数据库访问层实现高效可靠的数据操作。