MyBatis分页查询的多种方式

引言:

在实际的应用开发中,分页查询是非常常见的需求。MyBatis作为一款流行的Java持久层框架,提供了多种方式来实现分页查询。本篇博客将介绍几种常用的MyBatis分页查询方式,并提供相应的代码示例,帮助读者更好地理解和应用。

一、基于数据库的分页查询

自定义RowBound.java

package com.smomo.springbootdemo1.utils;

import lombok.AllArgsConstructor;
import lombok.Data;
import org.apache.ibatis.session.RowBounds;

/**
 * @ClassName: RowBound
 * @Description: TODO
 * @Author: smomo
 * @date: 2023/12/30 13:44
 * @Version: V1.0
 */
@Data
public class RowBound {
    public static final int NO_ROW_OFFSET = 0;
    public static final int NO_ROW_LIMIT = Integer.MAX_VALUE;
    public static final RowBounds DEFAULT = new RowBounds();
    private final int offset;
    private final int limit;

    public RowBound() {
        this.offset = 0;
        this.limit = Integer.MAX_VALUE;
    }

    public RowBound(int offset, int limit) {
        this.offset = offset;
        this.limit = limit;
    }

    public int getOffset() {
        return this.offset;
    }

    public int getLimit() {
        return this.limit;
    }
}

这种方式是利用数据库的分页查询功能,如MySQL的LIMIT语句或Oracle的ROWNUM。在MyBatis中,可以使用RowBound对象来指定分页的起始位置和数量。

  1. 在Mapper接口中定义方法:
List<User> getUsersByPage(RowBound rowBound);
  1. 在Mapper XML文件中实现方法:
<select id="getUsersByPage" resultType="User">
    SELECT * FROM users
    LIMIT #{offset}, #{limit}
</select>
  1. 在代码中调用方法时,需要传入RowBounds对象来设置分页的起始位置和数量:
int pageNo = 1;
int pageSize = 10;
int offset = (pageNo - 1) * pageSize;

RowBound rowBound = new RowBound(offset, pageSize);
List<User> users = userMapper.getUsersByPage(rowBounds);

二、基于插件的分页查询

MyBatis提供了一个分页插件PageHelper,可以方便地实现分页查询。

  1. 引入PageHelper的依赖
    <!-- 分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.3.0</version>
        </dependency>
  1. 在MyBatis的配置文件中配置插件。

注意:要进行配置,否则会报错


spring:
  main:
    allow-circular-references: true //允许循环引用
  1. 在Mapper接口中定义方法:
  Page<Employees> getEmployeesByPag2();
  1. 在Mapper XML文件中实现方法:
    <select id="getEmployeesByPag2" resultType="com.smomo.springbootdemo1.entity.Employees">
        SELECT * FROM employees

    </select>

  1. 在代码中调用方法时,不需要传入任何参数,PageHelper会自动根据当前页码和每页数量进行分页查询:
/**
     * 根据分页获取员工列表
     * @return 员工列表
     */
    @Override
    public List<Employees> getEmployeesByPag2() {
        // 使用PageHelper插件设置分页参数,获取第1页,每页10条记录
        PageHelper.startPage(1,10);
        // 调用employeesMapper的getEmployeesByPag2方法获取分页结果
        Page<Employees> res= employeesMapper.getEmployeesByPag2();
        // 从分页结果中获取员工列表
        List<Employees> result = res.getResult();
        // 获取总记录数
        long total = res.getTotal();
        // 返回员工列表
        return result;
    }

三、基于拦截器的分页查询

这种方式是通过自定义拦截器来实现分页查询。拦截器会在执行SQL语句之前,修改SQL语句的内容,添加分页相关的语句。

1.配置方法

/**
 * Mybatis Plus配置类
 */
 @Configuration
public class MybatisPlusConfig {
    
    /**
     * 开启分页插件
     * @return 分页插件实例
     * @date: 2021/7/19 14:52
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        // 创建分页插件实例
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置最大分页条数为100
        paginationInterceptor.setLimit(100);
        // 设置使用JsqlParser进行优化的Count SQL解析器
        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
        // 设置数据库类型为MySQL
        paginationInterceptor.setDbType(DbType.MYSQL);
        // 返回分页插件实例
        return paginationInterceptor;
    }
}
  1. 在Mapper接口中定义方法:
List<User> getUsersByPage(@Param("pageNo") int pageNo, @Param("pageSize") int pageSize);
  1. 在Mapper XML文件中实现方法:
<select id="getUsersByPage" resultType="User">
    SELECT * FROM users
</select>
  1. 在代码中调用方法时,需要传入页码和每页数量作为参数:
int pageNo = 1;
int pageSize = 10;

List<User> users = userMapper.getUsersByPage(pageNo, pageSize);

结语:
本篇博客介绍了MyBatis分页查询的多种方式,并提供了相应的代码示例。根据具体的需求和项目情况,选择合适的方式来实现分页查询。通过学习和实践这些方法,读者将能够更好地处理分页查询的需求,提高应用开发的效率和质量。希望本篇博客对读者有所帮助!

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值