在使用 MyBatis 进行数据库操作时,分页和缓存机制是两个重要的功能,它们能够显著提高应用程序的性能。本文将详细介绍 MyBatis 中的分页方法、延迟加载与立即加载的区别,以及一级和二级缓存的工作原理。
一、分页方式
方式一:Limit 物理分页
使用 SQL 的 LIMIT
语句实现分页,可以通过传递起始位置和每页记录数进行查询。
@Select("SELECT * FROM student LIMIT #{param1}, #{param2}")
public List<Student> findStudentPageLimit(int start, int count);
方式二:RowBounds 集合分页
使用 MyBatis 提供的 RowBounds
类进行分页。该方式不需要在 SQL 语句中进行修改,而是通过应用层的参数来实现。
@Select("SELECT * FROM student")
public List<Student> findStudentPageRowBounds(RowBounds rb);
示例调用:
List<Student> studentPageRowBounds = mapper.findStudentPageRowBounds(new RowBounds(2, 3));
studentPageRowBounds.forEach(System.out::println);
方式三:使用分页插件
通过引入分页插件(如 PageHelper),可以简化分页操作。
1. 导入依赖
确保在 Maven 或 Gradle 文件中添加相应的分页插件依赖。
2. 配置插件
在 MyBatis 配置文件中添加分页插件配置。
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>
3. 调用示例
PageHelper.startPage(2, 3);
List<Student> allStudent = mapper.findAllStudent();
allStudent.forEach(System.out::println);
二、延迟加载与立即加载
1. 立即加载
- 立即加载会在调用时发起查询,无论是否会使用这些数据。
2. 延迟加载
- 延迟加载会在真正需要数据时才进行查询,避免不必要的数据库请求,提升性能。
配置延迟加载
- 通过设置
lazyLoadingEnabled
属性来控制延迟加载特性。 lazyLoadingEnabled = false
禁用延迟加载,将级联加载所有关联对象的数据。lazyLoadingEnabled = true
(默认)则按层级延迟加载。aggressiveLazyLoading = true
进行层级延迟加载。aggressiveLazyLoading = false
按需求加载。
三、缓存机制
什么是缓存?
缓存是数据交换的缓冲区,当应用程序需要数据时,可以首先从缓存中获取,减少对数据库的直接访问。
一级缓存
- 一级缓存是会话级别的缓存,仅对单个
SqlSession
有效。 - 在执行
commit()
、close()
等操作后,一级缓存会被清空。
一级缓存失效的情况:
- 不同
SqlSession
对应不同的一级缓存。 - 相同
SqlSession
的查询条件不同。 - 在同一
SqlSession
中执行了任何增删改查操作。 - 手动清空缓存。
二级缓存
- 二级缓存是一个命名空间下所有操作语句共享的缓存,提供了更强的可控性。
- 尽管二级缓存能显著提升性能,但是也可能导致过时或不一致的数据,因此在分布式环境中使用时需谨慎。
总结
MyBatis 提供了多种分页方式和缓存机制,从而提升数据库操作的效率。了解并正确使用这些特性可以大幅度改善应用程序的性能。希望本文能为您提供有效的参考和帮助。