Mybatis分页

本文主要讲解Mybatis分页相关的技术分享,如果觉得不错的话,就点个赞吧。。。。

Mybatis分页主要有2种类型:

一、物理分页:

1、定义:

物理分页是在数据库层面进行的分页,即通过SQL语句直接从数据库中查询出需要的语句。

2、优点:

只需要加载当前页的数据,不会占用过多的内存,适合数据量大的情况。

二、内存分页:

1、定义:

内存分页是将所有数据查询出来后,再在内存中进行分页。

2、优点:

减轻数据库的负担,适合数据量小的情况。

如果数据量大,会占用大量的内存,严重甚至会导致内存溢出。

实现分页方法详解:

一:物理分页的方法:

1、使用LIMIT关键字:

这是最常见的物理分页方式,

原理:

通过在SQL语句中添加Limit子句来实现分页,

优缺点:

优点是简单直观,缺点是需要手动计算起始位置和结束位置。太低端,太Low,不推荐使用。

实例:
sql 复制代码
#查询用户表第1页,一页有3条数据。这个需要开发人员自己计算,然后给到数据库
select * from user limit 1,3
2、使用PageHelper插件:(推荐)

这是Mybatis提供的一个分页插件。

原理:

a、当调用PageHelper.startPage()时,PageHelper会创建一个Page对象,并将其保存到ThreadLocal中。这个Page对象包含了分页信息,如页码和每页的数量。

b、当调用Mapper的查询方法时,Mybatis会生成原始的SQL语句。在这个过程中,PageHelper会通过拦截器(Interceptor)拦截SQL语句的生成过程。

c、 在拦截器中,PageHelper会从ThreadLocal中获取Page对象,然后根据Page对象中的分页信息,修改原始的SQL语句,添加LIMIT子句。

d、最后,Mybatis执行修改后的SQL语句,从数据库中查询出分页数据。

优缺点:

通过这种方式,PageHelper可以在不修改原始SQL语句的情况下,实现物理分页。但是需要注意的是:PageHelper只对其后的第一个SQL语句生效。

代码:
java 复制代码
// 设置分页信息
PageHelper.startPage(page, size);
// 调用Mapper接口的查询方法
List<User> users = userMapper.selectAll();
使用注意:

PageHelper的startPage方法只对紧跟着的第一个SQL语句生效,也就是说,如果我们在调用startPage方法之后执行了多个SQL语句,那么只有第一个SQL语句会进行分页查询,其他的SQL语句还是会查询所有的数据。

使用pageHelper需要引入依赖:

XML 复制代码
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>最新版本</version>
</dependency>

二:内存分页的方法:

1、使用Page对象:

实现:

实现有很多种,这里只写出一种。

java 复制代码
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public List<User> getUsers(int page, int size) {
        // 查询所有数据
        List<User> allUsers = userMapper.selectAll();
        // 创建Page对象
        Page<User> userPage = new Page<>(page, size);
        // 设置数据
        userPage.setRecords(allUsers);
        // 获取当前页的数据
        return userPage.getRecords();
    }
}
2、使用RowBounds对象:(推荐)
原理:

MyBatis在执行查询操作时,会检查是否传入了RowBounds对象,如果传入了,就会使用RowBounds中的offset和limit属性来对查询结果进行分页处理。具体的实现方式是,MyBatis会在生成的SQL语句中添加LIMIT和OFFSET关键字,然后将RowBounds中的offset和limit属性的值分别设置为LIMIT和OFFSET关键字的参数,从而实现分页查询。

实现:

a. 在Mapper接口的查询方法中,添加一个RowBounds类型的参数。

b.在调用Mapper接口的查询方法时,创建一个RowBounds对象,并设置其offset和limit属性的值。

c. MyBatis在执行查询操作时,会检查是否传入了RowBounds对象,如果传入了,就会使用 RowBounds中的offset和limit属性来对查询结果进行分页处理。

代码:
java 复制代码
//我们需要在Mapper接口中定义一个使用RowBounds的查询方法:
@Mapper
public interface UserMapper {
    List<User> selectAll(RowBounds rowBounds);
}


//在Service层中,我们可以调用这个方法,并传入一个RowBounds对象来进行分页查询:
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public List<User> getUsers(int page, int size) {
        // 创建RowBounds对象
        RowBounds rowBounds = new RowBounds((page - 1) * size, size);
        // 调用Mapper接口的查询方法
        return userMapper.selectAll(rowBounds);
    }
}
相关推荐
Ljw...4 分钟前
索引(MySQL)
数据库·mysql·索引
界面开发小八哥5 分钟前
更高效的Java 23开发,IntelliJ IDEA助力全面升级
java·开发语言·ide·intellij-idea·开发工具
菠萝咕噜肉i18 分钟前
超详细:Redis分布式锁
数据库·redis·分布式·缓存·分布式锁
草莓base19 分钟前
【手写一个spring】spring源码的简单实现--容器启动
java·后端·spring
长风清留扬20 分钟前
一篇文章了解何为 “大数据治理“ 理论与实践
大数据·数据库·面试·数据治理
Allen Bright32 分钟前
maven概述
java·maven
OpsEye33 分钟前
MySQL 8.0.40版本自动升级异常的预警提示
数据库·mysql·数据库升级
Ljw...34 分钟前
表的增删改查(MySQL)
数据库·后端·mysql·表的增删查改
编程重生之路34 分钟前
Springboot启动异常 错误: 找不到或无法加载主类 xxx.Application异常
java·spring boot·后端
薯条不要番茄酱34 分钟前
数据结构-8.Java. 七大排序算法(中篇)
java·开发语言·数据结构·后端·算法·排序算法·intellij-idea