自定义分页查询

一、分页查询简介:

  • 当一个操作数据库进行查询的语句返回的结果集内容如果过多,那么内存极有可能溢出,所以在查询中含有大数据的情况下分页是必须的。

二、分页查询分类:

  1. 物理分页:
  • 在数据库执行查询时(实现分页查询),查询需要的数据—依赖数据库的SQL语句
  • 在SQL查询时,从数据库只检索分页需要的数据
  • 通常不同的数据库有着不同的物理分页语句
  1. 逻辑分页:
  • 在sql查询时,先从数据库检索出所有数据的结果集,在程序内,通过逻辑语句获得分页需要的数据

三、Mysql 分页查询实现:

# LIMIT 子句
SELECT  投影列 FROM  表名 WHERE  条件 ORDER BY LIMIT  开始位置,查询数量;

# LINIT OFFICT 子句
SELECT  投影列 FROM  表名 WHERE  条件 ORDER BY LIMIT  查询数量 OFFSET 开始位置;

查询原则:

  1. MYSQL 分页中开始位置为 0。
  2. 分页子句在查询语句的最后侧。
  3. 分页公式:(当前页-1)*每页大小

四、创建 Page 模型

  • 在一个分页页面,除了要展示的结果集,还要显示当前页、当前页条数、此次条件查询总条数,总页数等额外信息,可是 SQL 查询的单次结果只有一个数据,所以我们需要把这些数据项收集起来放到数据模型当中,返回该数据模型。

我们可以创建一个Page对象

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Page<T> {
    //当前页
    private int currentPage;
    //每页显示的条数
    private int pageSize;
    //总条数
    private int totalCount;
    //总页数
    private int totalPage;
    //结果集
    private List<T> result;
}

再写一个分页查询的方法

@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageService {
    private PageMapper pageMapper;

     /**
     *  条件分页查询
     *  
     * @param page 分页信息
     * @param condition 查询条件
     * @return page对象
     */
    public Page<Users> queryByPage(Page page, String condition) {
        int count = pageMapper.queryCount(page, condition);
        // TODO: 计算总页数等信息,填入Page对象中
        // 计算总页数: 向上转型
        page.setTotalPage((int) Math.ceil(1.0 * (count / page.getPageSize())));
        List<Users> res = pageMapper.queryByPage(page, condition);
        // TODO: 数据填入Page对象,返回Page对象
        return page;
    }
}

mapper: 暂时写一个伪代码

public class PageMapper {
    
    /**
     * 统计总数
     * 
     * @param page 分页信息
     * @param condition 查询条件
     * @return 总条数
     */
    public int queryCount(Page page, String condition) {
        // TODO: 实际是连接数据库查询总条数 select count(*) from table where name = condition;
        return 1;
    }

    /**
     * 数据库分页查询
     *  
     * @param page 分页信息
     * @param condition 查询条件
     * @return 查询结果数据集合
     */
    public List queryByPage(Page page, String condition) {
        int start = (page.getCurrentPage() - 1) * page.getPageSize();
        int end = page.getPageSize();
        // TODO: 实际是连接数据库条件查询 select * from table where name = condition limit start, end;
        return new ArrayList<>();
    }
}

五、 MyBatis分页插件 - PageHelper

  • PageHelper是一款非常好用的开源免费的Mybatis第三方分页插件。使用该插件时,只要传入分页参数,即可自动生成页面对象。分页插件和持久层接口是完全不耦合的,分页插件的主要功能是帮我们封装查询结果。

我们使用该插件分页查询所有用户

<!-- PageHelper -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.3.0</version>
</dependency>

Mybatis配置文件中配置PageHelper插件

<plugins>
    <!-- 配置分页插件 -->
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <!-- 因为不同数据库的分页查询关键字不同,所以要设置数据库类型 -->
        <property name="helperDialect" value="mysql"/>
    </plugin>
</plugins>

使用分页插件

@Test
public void testFindPage() {
    // 查询前设置分页参数,参数一:页数,从1开始。参数二:每页条数
    PageHelper.startPage(1, 3);
    // 正常查询
    List<Users> all = userMapper.queryAll();
    // 创建页面对象,将查询结果传入,并且里面会封装需要的Page信息
    PageInfo pageInfo = new PageInfo(all);
    // TODO: 返回PageInfo对象
posted @   Anti-kill  阅读(173)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示