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 适用场景

  1. 数据查询:执行复杂SQL查询,返回Java对象或结果集
  2. 数据操作:执行INSERT、UPDATE和DELETE等SQL语句
  3. 存储过程调用:调用数据库存储过程和函数
  4. 高级映射:支持复杂关系映射(一对一、一对多、多对一)
  5. 懒加载:真正需要数据时才查询数据库
  6. 缓存机制:内置一级缓存和二级缓存,提高查询效率

四、MyBatis 优缺点分析

4.1 优点

  1. 基于SQL编程,灵活性强

    • SQL写在XML里,解耦SQL与程序代码
    • 支持编写动态SQL语句,可重用
  2. 代码量少

    • 相比JDBC减少50%以上代码量
    • 消除JDBC冗余代码,自动管理连接
  3. 数据库兼容性好

    • 支持多种数据库
  4. 对象-字段映射支持

    • 提供映射标签,支持ORM字段关系映射
  5. 与Spring集成良好

4.2 缺点

  1. SQL编写工作量大

    • 字段多、关联表多时SQL较复杂
  2. 数据库移植性差

    • SQL依赖于特定数据库
    • 可通过配置databaseIdProvider部分解决:
<databaseIdProvider type="DB_VENDOR">
    <property name="MySQL" value="mysql"/>
    <property name="SQL Server" value="sqlserver"/>
    <property name="Oracle" value="oracle"/>
</databaseIdProvider>
  1. 映射关系实现依赖SQL

    • 映射标签仅描述关系,实际实现仍依赖SQL
  2. DAO层简单,对象组装工作量大

    • Mapper层Java代码少,XML维护工作量大
  3. 不支持级联更新/删除

    • 需要手动处理关联表的更新/删除

五、MyBatis 半自动 ORM 特性

5.1 与全自动 ORM 的区别

特性 半自动ORM(MyBatis) 全自动ORM(Hibernate)
SQL控制 开发人员完全控制 框架生成,控制有限
映射定制 高度可定制 基于约定,定制有限
SQL复用 支持SQL片段复用 通常与属性绑定
性能调优 可手动优化SQL 依赖框架优化

5.2 半自动 ORM 的优势

  1. SQL灵活性:充分发挥数据库特性
  2. 映射可定制性:满足复杂映射需求
  3. SQL可复用性:定义独立SQL片段并引用
  4. 性能调优灵活性:手动优化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 最佳实践

  1. SQL管理:将复杂SQL分解为可重用的片段
  2. 参数处理:合理使用#{}和${}占位符
  3. 结果映射:优先使用resultMap进行明确映射
  4. 缓存策略:根据业务需求配置适当缓存
  5. 事务管理:与Spring集成时使用声明式事务

八、总结

MyBatis 作为一款半自动ORM框架,在Java持久层开发中提供了:

  • 高度的SQL控制灵活性
  • 简洁的API接口
  • 强大的映射能力
  • 良好的性能表现

特别适合需要精细控制SQL、对性能有较高要求的项目场景。虽然需要编写更多SQL语句,但换来了更大的控制权和优化空间。

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 存储过程支持 示例存储过程调用: 2.3 高级映射 支持复杂的关联查询,包括一对一、一对多、多对一关系。 2.4 简化 JDBC 操作 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。 示例模糊查询: Java 调用: 2.5 简单映射方式 使用 resultType 指定返回对象类型: 三、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 部分解决: 映射关系实现依赖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 复杂映射示例 XML 映射配置: 注意:如果查询SQL中没有关联Interest表,则interests属性为空。 6.2 动态SQL MyBatis 提供强大的动态SQL支持,包括: if choose (when, otherwise) trim (where, set) foreach 示例: 七、MyBatis 最佳实践 SQL管理 :将复杂SQL分解为可重用的片段 参数处理 :合理使用#{}和${}占位符 结果映射 :优先使用resultMap进行明确映射 缓存策略 :根据业务需求配置适当缓存 事务管理 :与Spring集成时使用声明式事务 八、总结 MyBatis 作为一款半自动ORM框架,在Java持久层开发中提供了: 高度的SQL控制灵活性 简洁的API接口 强大的映射能力 良好的性能表现 特别适合需要精细控制SQL、对性能有较高要求的项目场景。虽然需要编写更多SQL语句,但换来了更大的控制权和优化空间。