MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射,能够将 Java 对象与数据库记录进行灵活映射,简化数据库操作的开发流程。下面从多个方面详细介绍 MyBatis:
一、MyBatis 的基本概念
- 定位:持久层框架(专注于将 Java 程序中的数据持久化到数据库,或从数据库读取数据并封装为 Java 对象)。
- 核心思想:通过 XML 或注解的方式配置 SQL 语句,避免硬编码 SQL,同时提供强大的结果映射能力,减少手动处理 JDBC 代码的工作量。
- 对比 JDBC:JDBC 需要手动编写连接获取、Statement 创建、结果集处理等重复代码,而 MyBatis 封装了这些操作,开发者只需关注 SQL 本身。
二、MyBatis 的核心组件
SqlSessionFactory
- 是 MyBatis 的核心工厂类,负责创建
SqlSession
(数据库会话)。 - 通常通过
SqlSessionFactoryBuilder
读取配置文件(如mybatis-config.xml
)构建,且建议全局只创建一个实例(单例模式)。
- 是 MyBatis 的核心工厂类,负责创建
SqlSession
- 代表与数据库的一次会话,提供了执行 SQL 语句的方法(如
selectOne
、insert
、update
等)。 - 是非线程安全的,建议在方法体内创建,使用后及时关闭。
- 代表与数据库的一次会话,提供了执行 SQL 语句的方法(如
Mapper 接口
- 定义数据库操作的方法(如查询、新增等),方法名与 SQL 语句的 ID 对应。
- 无需实现类,MyBatis 通过动态代理自动生成实现。
SQL 映射文件(Mapper XML)
- 存放 SQL 语句,通过
namespace
与 Mapper 接口关联。 - 包含
<select>
、<insert>
、<update>
、<delete>
等标签,分别对应查询、新增、更新、删除操作。
- 存放 SQL 语句,通过
三、MyBatis 的工作流程
- 读取 MyBatis 核心配置文件(
mybatis-config.xml
),配置数据库连接信息、Mapper 映射文件路径等。 - 通过
SqlSessionFactoryBuilder
构建SqlSessionFactory
。 - 从
SqlSessionFactory
中获取SqlSession
。 - 通过
SqlSession
获取 Mapper 接口的代理对象。 - 调用 Mapper 接口的方法,执行对应的 SQL 语句。
- 提交事务(如需),关闭
SqlSession
。
四、MyBatis 的核心特性
灵活的 SQL 编写
- 支持手写 SQL,适用于复杂查询场景(如多表关联、子查询等),比 JPA 等 ORM 框架更灵活。
结果映射(ResultMap)
- 解决 Java 对象与数据库表字段名不一致的问题,支持复杂对象(如嵌套对象、集合)的映射。
- 示例:
xml
<resultMap id="userMap" type="User"> <id column="user_id" property="id"/> <result column="user_name" property="name"/> </resultMap>
动态 SQL
- 通过
<if>
、<where>
、<foreach>
等标签,根据条件动态生成 SQL,避免拼接 SQL 字符串的麻烦。 - 示例:
xml
<select id="findUser" parameterType="User" resultMap="userMap"> SELECT * FROM user <where> <if test="name != null">AND name LIKE CONCAT('%', #{name}, '%')</if> <if test="age != null">AND age = #{age}</if> </where> </select>
- 通过
缓存机制
- 一级缓存:默认开启,基于
SqlSession
级别,同一会话中多次查询相同 SQL 会缓存结果。 - 二级缓存:需手动开启,基于
Mapper
接口级别,不同会话可共享缓存。
- 一级缓存:默认开启,基于
参数传递
- 支持多种参数类型(基本类型、对象、Map 等),通过
#{}
或${}
接收参数(#{}
更安全,可防止 SQL 注入)。
- 支持多种参数类型(基本类型、对象、Map 等),通过
五、MyBatis 与其他框架的对比
框架 | 特点 | 适用场景 |
---|---|---|
MyBatis | 手写 SQL,灵活度高,学习成本低 | 复杂查询、需要优化 SQL 的场景 |
Hibernate/JPA | 全自动 ORM,无需手写 SQL,简化开发 | 简单 CRUD 操作,快速开发的场景 |
Spring JDBC | 轻量封装 JDBC,需手动处理结果映射 | 对性能要求极高,需完全控制 SQL 时 |
六、MyBatis 的应用场景
- 中小型项目,需要平衡开发效率与 SQL 灵活性。
- 复杂查询场景(如报表生成、多表关联查询)。
- 团队中熟悉 SQL 的开发者较多时,能充分发挥其优势。
七、扩展知识
- MyBatis-Plus:基于 MyBatis 的增强工具,提供 CRUD 接口自动生成、分页插件等功能,进一步简化开发。
- 集成 Spring:通过
MyBatis-Spring
插件可与 Spring 框架无缝集成,由 Spring 管理SqlSession
等组件。
总之,MyBatis 以其灵活性和易用性成为 Java 持久层框架的主流选择,尤其适合需要精细控制 SQL 的开发场景。