MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects)映射成数据库中的记录。
1. 简单易用
- MyBatis 不需要大量的配置文件,通过简单的 XML 或者注解就可以完成 SQL 映射。
- 它允许你直接编写原生的 SQL 查询语句,并且可以完全控制 SQL 执行和存储过程调用。
2.核心组件
- SqlSessionFactory:通过
SqlSessionFactoryBuilder
使用配置文件或代码构建而来。它是创建SqlSession
的工厂类。 - SqlSession:用于执行命令、提交或回滚事务,以及获取映射器实例。
- Mapper Interface:定义了操作数据库的方法,这些方法通常与 SQL 语句一一对应。MyBatis 会自动将它们绑定到相应的 SQL 语句上。
- XML 映射文件/注解:包含 SQL 语句和映射规则。可以是 XML 文件或者直接用注解在 Mapper 接口内定义。
3. 动态 SQL
- 提供强大的动态 SQL 语言,可以根据不同的条件生成不同的 SQL 语句,这使得查询更加灵活。
<select id="findActiveBlogWithTitleLike" resultType="Blog"> SELECT * FROM BLOG <where> <if test="title != null and title != ''"> AND title like concat('%',#{title},'%') </if> <if test="state != null and state > 0"> AND state = 1 </if> </where> </select> ① 满足第一个条件但是第二个条件不满足 sql语句为 select* from blog where title like concat('%',#{title},'%') ② 满足第二个条件但是第一个条件不满足 sql语句为 select* from blog where state = 1 ③ 两个条件都满足 sql语句为 select* from blog where title like concat('%',#{title},'%') and state = 1
4. 缓存机制
- 支持一级缓存和二级缓存,能够减少数据库访问次数,提高性能。
5. 映射引擎
- 强大的映射引擎可以处理任意复杂的映射关系,包括一对一、一对多、多对多等关联关系。
6. 插件机制
- 提供插件接口,可以在执行过程中拦截四大对象(Executor, StatementHandler, ParameterHandler, ResultSetHandler),进行自定义操作。
7. 事务管理
- MyBatis 自身不管理事务,但可以与 Spring 框架集成,利用 Spring 的声明式事务管理功能。
8. 数据库移植性
- 因为 SQL 是在 MyBatis 的映射文件中编写的,所以更换数据库时只需修改相应的 SQL 语句即可,无需改动业务逻辑代码。
9. 最佳实践
- 分页查询:对于大数据量的表,应尽量避免一次性加载所有数据,而应该采用分页查询。
- SQL 注入防护:总是使用参数化查询,不要拼接 SQL 字符串。
- 性能优化:合理使用缓存,避免不必要的 N+1 查询问题。