栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

一、引言

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

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

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

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

二、配置

创建MybatisPlusConfig配置类,需要配置分页插件,小编使用的Spring boot配置方式。


@Configuration
public 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: 2
DEBUG==>  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_time
TRACE<==        Row: 2, 张雨琪, 31, zjq@baomidou.com, 1088248166370832385, 2019-01-14 09:15:15
TRACE<==        Row: 3, 刘红雨, 31, lhm@baomidou.com, 1088248166370832385, 2019-01-14 09:48:16
DEBUG<==      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_uid
DEBUG==>  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: 117
DEBUG==>  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: realname
TRACE<==        Row: 胡伯云
TRACE<==        Row: 安元慧
DEBUG<==      Total: 2
 Time:20 ms - ID:com.example.demo.mapper.UserMapper.selectByHisName
Execute SQL:
    com.p6spy.engine.wrapper.PreparedStatementWrapper@61bcbcce

胡伯云
安元慧
总页数 = 59

到此这篇关于MyBatis-Plus 分页查询以及自定义sql分页的实现的文章就介绍到这了,更多相关MyBatis-Plus 自定义sql分页内容请搜索考高分网以前的文章或继续浏览下面的相关文章希望大家以后多多支持考高分网!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/132299.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号