MyBatis分页机制深度解析
2023-12-28 12:23:14
前言
在企业项目的数据库操作中,分页查询是一个常见需求,尤其当数据量庞大时。MyBatis 作为 我们Java 开发者的持久层框架,为分页提供了灵活的支持。
本篇文章我们将深入探讨 MyBatis 的分页机制,使我们在实际开发项目中运用自如。
MyBatis分页原理
在讲解mybatis的分页原理之前,我们先来看一下:内存分页 vs. 数据库分页
- 内存分页:查询数据库获取全部数据,然后在内存中进行分页。这种方式简单但效率低下,当数据量巨大时可能导致内存溢出。
- 数据库分页:利用数据库的分页功能(比如 MySQL 的 LIMIT 和 OFFSET),仅查询当前页的数据。这种方式效率高,但需要编写特定的 SQL。
现在我们再具体讲MyBatis 的分页方式。
MyBatis 支持两种分页方式:物理分页和内存分页。但是在实际应用中,博主比较推荐使用物理分页。
- 物理分页:通过特定的 SQL 实现,依赖数据库的分页功能。
- 内存分页:虽然 MyBatis 支持,但不推荐在大数据量场景下使用。
MyBatis 分页插件
为了实现物理分页,MyBatis 提供了分页插件,如 PageHelper。这些插件可以自动修改原始 SQL,添加分页相关的语句。
如何使用 MyBatis 分页插件
接下来我们讲解一下如何使用 MyBatis 分页插件 。
首先第一步肯定是引入依赖
先创建一个 Maven 项目,引入 PageHelper 依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>
然后配置 PageHelper
在 MyBatis 的配置文件(如 mybatis-config.xml)中,添加插件配置:
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="dialect" value="mysql"/> <!-- 根据实际数据库选择方言 -->
<property name="reasonable" value="true"/> <!-- 支持接口参数中的 pageNum 和 pageSize 为 0 时使用默认值 -->
<property name="supportMethodsArguments" value="true"/> <!-- 支持通过 Mapper 接口参数来传递分页参数 -->
<property name="params" value="count(countSql)"/> <!-- count 查询的 SQL 参数 -->
</plugin>
</plugins>
最后使用 PageHelper
在 Mapper 接口或 Service 层使用 PageHelper:
// 在查询之前设置分页参数
PageHelper.startPage(pageNum, pageSize);
List<User> users = userMapper.selectByExample(example);
// 使用 PageInfo 包装查询结果,获取分页信息
PageInfo<User> pageInfo = new PageInfo<>(users, pageSize);
以博主之前做过的课设项目为例:
我们手上现在有一个UserMapper接口,用来查询用户数据:
public interface UserMapper {
List<User> selectAllUsers();
}
在Service层或Controller层中,我们这时候可以使用PageHelper来实现分页:
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public PageInfo<User> getUsers(int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize); // 启动分页
List<User> users = userMapper.selectAllUsers(); // 查询用户数据
return new PageInfo<>(users); // 使用PageInfo包装查询结果,获取分页信息
}
}
当调用getUsers方法时,PageHelper会自动为selectAllUsers方法中的SQL添加分页语句,从而只查询当前页的数据。
前端可以根据返回的PageInfo对象获取当前页的数据、总页数、总记录数等信息,并进行相应的展示。
文章到这里就先结束了,感兴趣的可以订阅专栏哈,后续会继续分享相关的知识点。
文章来源:https://blog.csdn.net/qq_53847859/article/details/135159950
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!