MyBatis实战指南(一):从概念到特点,助你快速上手,提升开发效率!
字数 2019 2025-08-18 11:36:48
MyBatis 实战教学指南
一、MyBatis 基本概念
1.1 什么是 MyBatis
MyBatis 是一款优秀的半自动 ORM 持久层框架,它支持:
- 自定义 SQL
- 存储过程
- 高级映射
MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
1.2 ORM 相关概念
持久化:把数据(如内存中的对象)保存到可永久保存的存储设备中。
持久层:专注于实现数据持久化应用领域的逻辑层面,将数据使用者和数据实体相关联。
ORM (Object-Relational Mapping):在关系型数据库和业务实体对象之间作映射,使得操作业务对象时不需要直接操作SQL。
1.3 Java 典型 ORM 框架对比
| 框架 | 类型 | 特点 |
|---|---|---|
| Hibernate | 全自动 | 强大、复杂、笨重、学习成本高 |
| MyBatis | 半自动 | 需要自己写SQL,灵活 |
| JPA | Java自带 | 通过注解或XML描述对象-表映射关系 |
二、MyBatis 核心特点
2.1 定制化 SQL
- 只支持原生 SQL 语句
- 相对 Hibernate 的完全面向对象操作方式,提供了更大的灵活性
2.2 存储过程支持
示例存储过程调用:
<!-- 第一种方式,参数使用parameterType -->
<select id="findStudentById" parameterType="java.lang.Long"
statementType="CALLABLE" resultType="com.mybatis.entity.Student">
{call pro_getStudent(#{id,jdbcType=BIGINT,mode=IN})}
</select>
<!-- 第二种方式,参数使用parameterMap -->
<parameterMap type="java.util.Map" id="studentMap">
<parameter property="id" mode="IN" jdbcType="BIGINT"/>
</parameterMap>
<select id="findStudentById" parameterMap="studentMap"
statementType="CALLABLE" resultType="com.mybatis.entity.Student">
{call pro_getStudent(?)}
</select>
2.3 高级映射
支持复杂的关联查询,包括一对一、一对多、多对一关系。
2.4 简化 JDBC 操作
避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。
示例模糊查询:
<mapper namespace="com.test.pojo">
<select id="listCategoryByName" parameterType="string" resultType="Category">
select * from category_ where name like concat('%',#{0},'%')
</select>
</mapper>
Java 调用:
List<Category> cs = session.selectList("listCategoryByName","cat");
for (Category c : cs) {
System.out.println(c.getName());
}
2.5 简单映射方式
使用 resultType 指定返回对象类型:
<mapper namespace="com.test.pojo">
<select id="listCategory" resultType="Category">
select * from category_
</select>
</mapper>
三、MyBatis 适用场景
- 数据查询:执行复杂SQL查询,返回Java对象或结果集
- 数据操作:执行INSERT、UPDATE和DELETE等SQL语句
- 存储过程调用:调用数据库存储过程和函数
- 高级映射:支持复杂关系映射(一对一、一对多、多对一)
- 懒加载:真正需要数据时才查询数据库
- 缓存机制:内置一级缓存和二级缓存,提高查询效率
四、MyBatis 优缺点分析
4.1 优点
-
基于SQL编程,灵活性强
- SQL写在XML里,解耦SQL与程序代码
- 支持编写动态SQL语句,可重用
-
代码量少
- 相比JDBC减少50%以上代码量
- 消除JDBC冗余代码,自动管理连接
-
数据库兼容性好
- 支持多种数据库
-
对象-字段映射支持
- 提供映射标签,支持ORM字段关系映射
-
与Spring集成良好
4.2 缺点
-
SQL编写工作量大
- 字段多、关联表多时SQL较复杂
-
数据库移植性差
- SQL依赖于特定数据库
- 可通过配置
databaseIdProvider部分解决:
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="SQL Server" value="sqlserver"/>
<property name="Oracle" value="oracle"/>
</databaseIdProvider>
-
映射关系实现依赖SQL
- 映射标签仅描述关系,实际实现仍依赖SQL
-
DAO层简单,对象组装工作量大
- Mapper层Java代码少,XML维护工作量大
-
不支持级联更新/删除
- 需要手动处理关联表的更新/删除
五、MyBatis 半自动 ORM 特性
5.1 与全自动 ORM 的区别
| 特性 | 半自动ORM(MyBatis) | 全自动ORM(Hibernate) |
|---|---|---|
| SQL控制 | 开发人员完全控制 | 框架生成,控制有限 |
| 映射定制 | 高度可定制 | 基于约定,定制有限 |
| SQL复用 | 支持SQL片段复用 | 通常与属性绑定 |
| 性能调优 | 可手动优化SQL | 依赖框架优化 |
5.2 半自动 ORM 的优势
- SQL灵活性:充分发挥数据库特性
- 映射可定制性:满足复杂映射需求
- SQL可复用性:定义独立SQL片段并引用
- 性能调优灵活性:手动优化SQL语句
六、MyBatis 高级特性示例
6.1 复杂映射示例
public class Student {
String name;
List<Interest> interests;
}
public class Interest {
String studentId;
String name;
String direction;
}
XML 映射配置:
<resultMap id="ResultMap" type="com.test.Student">
<result column="name" property="name" />
<collection property="interests" ofType="com.test.Interest">
<result column="name" property="name" />
<result column="direction" property="direction" />
</collection>
</resultMap>
注意:如果查询SQL中没有关联Interest表,则interests属性为空。
6.2 动态SQL
MyBatis 提供强大的动态SQL支持,包括:
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
示例:
<select id="findActiveBlogWithTitleLike" resultType="Blog">
SELECT * FROM BLOG
WHERE state = 'ACTIVE'
<if test="title != null">
AND title like #{title}
</if>
</select>
七、MyBatis 最佳实践
- SQL管理:将复杂SQL分解为可重用的片段
- 参数处理:合理使用#{}和${}占位符
- 结果映射:优先使用resultMap进行明确映射
- 缓存策略:根据业务需求配置适当缓存
- 事务管理:与Spring集成时使用声明式事务
八、总结
MyBatis 作为一款半自动ORM框架,在Java持久层开发中提供了:
- 高度的SQL控制灵活性
- 简洁的API接口
- 强大的映射能力
- 良好的性能表现
特别适合需要精细控制SQL、对性能有较高要求的项目场景。虽然需要编写更多SQL语句,但换来了更大的控制权和优化空间。