MyBatis 简介
MyBatis 简介
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射,能够帮助开发者将 Java 对象与数据库表进行灵活映射,简化数据持久化操作。以下从多个维度详细介绍 MyBatis:
一、核心定位与优势
- 轻量级框架:相比 Hibernate 等全自动 ORM 框架,MyBatis 更“轻”,开发者需手动编写 SQL 语句,灵活性更高,便于优化性能。
- ORM 映射功能:通过 XML 或注解方式,将 Java 对象与数据库表字段映射,减少手动编写 JDBC 代码的繁琐工作。
- 性能优化友好:开发者可完全控制 SQL 语句,便于针对复杂查询或性能瓶颈进行优化,适合对性能要求高的项目。
- 兼容多种数据库:支持 MySQL、Oracle、SQL Server 等主流数据库,通过切换方言实现跨数据库适配。
二、核心组件与架构
- SqlSessionFactory:
- 负责创建
SqlSession
实例,是 MyBatis 的入口,通过读取配置文件(如mybatis-config.xml
)初始化。
- 负责创建
- SqlSession:
- 提供数据库操作方法(如
selectOne
、insert
等),是 MyBatis 执行 SQL 的核心接口,类似 JDBC 中的Connection
。
- 提供数据库操作方法(如
- Mapper 接口与映射文件:
- Mapper 接口:定义数据库操作方法(如
User selectById(int id)
)。 - 映射文件(XML 或注解):实现接口方法与 SQL 的绑定,例如在 XML 中配置
select
、insert
等标签。
- Mapper 接口:定义数据库操作方法(如
- TypeHandler:
- 处理 Java 类型与数据库类型的转换,支持自定义类型转换逻辑。
三、核心工作流程
- 初始化阶段:
- 读取 MyBatis 配置文件,创建
SqlSessionFactory
。
- 读取 MyBatis 配置文件,创建
- 数据库操作阶段:
- 通过
SqlSessionFactory
获取SqlSession
。 - 调用 Mapper 接口方法,MyBatis 解析映射文件,将方法参数与 SQL 语句绑定(如
#{id}
替换为实际参数)。 - 执行 SQL 并返回结果,结果通过映射规则转换为 Java 对象。
- 通过
- 资源释放阶段:
- 关闭
SqlSession
,释放数据库连接。
- 关闭
四、关键特性
- 动态 SQL:
- 通过
if
、where
、foreach
等标签在 XML 中编写动态 SQL,适配不同查询条件(例如根据参数是否为空拼接 WHERE 子句)。
- 通过
- 结果映射(ResultMap):
- 处理复杂的对象关系映射,如一对一(
association
)、一对多(collection
)关联查询,避免手动封装结果集。
- 处理复杂的对象关系映射,如一对一(
- 缓存机制:
- 一级缓存:基于
SqlSession
的本地缓存,默认开启,提高同一会话内的重复查询效率。 - 二级缓存:基于 namespace 的全局缓存,需手动配置,适用于频繁查询且数据更新频率低的场景。
- 一级缓存:基于
- 插件扩展(Interceptor):
- 支持自定义插件(如分页插件、SQL 性能监控插件),扩展 MyBatis 功能(如 PageHelper 插件实现分页查询)。
五、应用场景
- 复杂业务场景:需要编写复杂 SQL(如多表联合查询、存储过程)的项目。
- 性能敏感系统:开发者可手动优化 SQL,避免全自动 ORM 框架的性能损耗。
- 遗留系统改造:适配已有数据库结构,无需强制修改表设计。
六、与其他框架对比
框架 | MyBatis | Hibernate | Spring JDBC |
---|---|---|---|
SQL 控制 | 手动编写,灵活性高 | 全自动生成,灵活性低 | 手动编写,类似 JDBC |
学习成本 | 中等(需掌握 SQL 和映射规则) | 高(需掌握 ORM 概念和 HQL) | 低(接近 JDBC) |
性能 | 优(手动优化 SQL) | 中(自动生成 SQL 可能存在冗余) | 优(直接操作 JDBC) |
适合场景 | 复杂查询、性能要求高 | 快速开发、简单 CRUD | 轻量级项目、底层工具封装 |
七、入门示例(XML 配置方式)
- pom.xml 依赖:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency>
- mybatis-config.xml 配置:
<configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/test" /> <property name="username" value="root" /> <property name="password" value="123456" /> </dataSource> </environment> </environments> <mappers> <mapper resource="mapper/UserMapper.xml" /> </mappers> </configuration>
- Mapper 接口与映射文件:
// UserMapper.java public interface UserMapper { User selectById(int id); }
<!-- UserMapper.xml --> <mapper namespace="com.example.mapper.UserMapper"> <select id="selectById" resultType="com.example.entity.User"> SELECT id, name, age FROM user WHERE id = #{id} </select> </mapper>
- 代码调用:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); try (SqlSession sqlSession = factory.openSession()) { UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.selectById(1); System.out.println(user); }
八、发展与生态
MyBatis 最初由 Apache 孵化,后独立为 MyBatis-GitHub 项目,目前最新版本为 3.5.x。其生态丰富,包括:
- Spring Boot 集成:通过
mybatis-spring-boot-starter
简化配置。 - 代码生成工具:如 MyBatis Generator(MBG)自动生成实体类、Mapper 接口和映射文件。
- 社区插件:PageHelper(分页)、MyBatis-Plus(增强版,简化 CRUD)等。