文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MyBatis-Plus 分页查询以及自定义sql分页

2023-09-01 09:58

关注

一、引言

分页查询每个人程序猿几乎都使用过,但是有部分同学不懂什么是物理分页和逻辑分页。

物理分页:相当于执行了limit分页语句,返回部分数据。物理分页只返回部分数据占用内存小,能够获取数据库最新的状态,实施性比较强,一般适用于数据量比较大,数据更新比较频繁的场景。

逻辑分页:一次性把全部的数据取出来,通过程序进行筛选数据。如果数据量大的情况下会消耗大量的内存,由于逻辑分页只需要读取数据库一次,不能获取数据库最新状态,实施性比较差,适用于数据量小,数据稳定的场合。

那么MP中的物理分页怎么实现呢? 往下看往下看

二、配置

创建MybatisPlusConfig配置类。

@Configurationpublic class MyBatisPlusConfig {         @Bean    public PaginationInterceptor paginationInterceptor() {        return new PaginationInterceptor();    }}

三、具体分页实现

MP的Wrapper提供了两种分页查询的方式,源码如下:

        IPage selectPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);         IPage> selectMapsPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);

可见两个分页方法参数都是一致的,只是返回参数略有不同,具体选择根据实际业务为准。

        @Test    public void selectByPage() {        QueryWrapper wrapper = new QueryWrapper();        wrapper.like("name", "雨").lt("age", 40);         Page page = new Page<>(1,2);         //IPage userIPage = userMapper.selectPage(page, wrapper);         IPage> mapIPage = userMapper.selectMapsPage(page, wrapper);          System.out.println("总页数"+mapIPage.getPages());        System.out.println("总记录数"+mapIPage.getTotal());        List> records = mapIPage.getRecords();        records.forEach(System.out::println);    }

以上分页查询执行sql如下,先是查询了一次总记录数,然后在查询的数据。

DEBUG==>  Preparing: SELECT COUNT(1) FROM user WHERE name LIKE ? AND age < ? DEBUG==> Parameters: %雨%(String), 40(Integer)TRACE<==    Columns: COUNT(1)TRACE<==        Row: 2DEBUG==>  Preparing: SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ? LIMIT ?,? DEBUG==> Parameters: %雨%(String), 40(Integer), 0(Long), 2(Long)TRACE<==    Columns: id, name, age, email, manager_id, create_timeTRACE<==        Row: 2, 张雨琪, 31, zjq@baomidou.com, 1088248166370832385, 2019-01-14 09:15:15TRACE<==        Row: 3, 刘红雨, 31, lhm@baomidou.com, 1088248166370832385, 2019-01-14 09:48:16DEBUG<==      Total: 2总页数1总记录数2

现在我们有需求只要查询数据即可, 不关心总记录数等,如果使用默认的方式就消耗不必要的性能。那么解决办法也是很简单的,只需要在创建page对象时传入第三个参数为false即可。

Page page = new Page<>(1,2,false);

四、自定义sql分页查询

有时候查询的数据难免会出现多表连接查询,或者是一些复杂的sql语句,但是这些语句也是需要支持分页查询的,

先定义查询接口,第一个参数要是分页的参数,小编这里演示就写简单的sql。

步骤一:在mapper文件中,编写对应的分页查询接口。

步骤二:在xml中编写对应的sql语句,小编这里演示的 “${ew.customSqlSegment}”,这个是如果你想自定义的sql语句,也想使用wrapper查询条件构造器,则需要在mapper接口中添加参数,以及xml中也要有固定。 

        IPage selectMyPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);
             select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid         

mapepr如下:需要传入分页的参数,返回的类型也需要是分页对象

 public interface UserMapper extends MyMapper {          IPage selectByHisName(IPage page);}

测试如下:通过查看日志,执行的sql加了分页条件的。

   @Test    public void select(){        // 创建分页参数        Page page = new Page<>(1,2);        IPage result = userMapper.selectByHisName(page);        // 获取数据        List records = result.getRecords();        records.forEach(System.out::println);        System.out.println("总页数 = "+ result.getPages());    }
ARNWarn: Could not find @TableId in Class: com.example.demo.model.HisUser.INFOStarted UserMapperTest in 2.428 seconds (JVM running for 2.959)select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uidDEBUG==>  Preparing: SELECT COUNT(1) FROM his_ipd_encounter e, his_user u WHERE e.his_uid = u.his_uid DEBUG==> Parameters: TRACE<==    Columns: COUNT(1)TRACE<==        Row: 117DEBUG==>  Preparing: select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid LIMIT ?,? DEBUG==> Parameters: 0(Long), 2(Long)TRACE<==    Columns: realnameTRACE<==        Row: 胡伯云TRACE<==        Row: 安元慧DEBUG<==      Total: 2 Time:20 ms - ID:com.example.demo.mapper.UserMapper.selectByHisNameExecute SQL:    com.p6spy.engine.wrapper.PreparedStatementWrapper@61bcbcce 胡伯云安元慧总页数 = 59

来源地址:https://blog.csdn.net/xm393392625/article/details/129901169

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯