物理分页和逻辑分页

物理分页:直接从数据库中拿出我们需要的数据,例如在Mysql中使用limit。

逻辑分页:从数据库中拿出所有符合要求的数据,然后再从这些数据中拿到我们需要的分页数据。

优缺点

物理分页每次都要访问数据库,逻辑分页只访问一次。

物理分页占用内存少,逻辑分页相对较多。

物理分页数据每次都是最新的,逻辑分页有可能滞后。

一般用法

1 public List<Order> queryListByPage(RowBounds rowBounds);

1 dao.queryListPage(new RowBounds(offset,limit));

RowBounds对象有2个属性,offset和limit。

offset:起始行数

limit:需要的数据行数

因此,取出来的数据就是:从第offset+1行开始,取limit行

Mybatis中使用RowBounds实现分页的大体思路:

先取出所有数据,然后游标移动到offset位置,循环取limit条数据,然后把剩下的数据舍弃。

 1 private void handleRowValuesForSimpleResultMap(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping parentMapping) throws SQLException {
 2     DefaultResultContext<Object> resultContext = new DefaultResultContext();
 3     this.skipRows(rsw.getResultSet(), rowBounds);  //游标跳到offset位置
 4     //取出limit条数据
 5     while(this.shouldProcessMoreRows(resultContext, rowBounds) && rsw.getResultSet().next()) {
 6         ResultMap discriminatedResultMap = this.resolveDiscriminatedResultMap(rsw.getResultSet(), resultMap, (String)null);
 7         Object rowValue = this.getRowValue(rsw, discriminatedResultMap);
 8         this.storeObject(resultHandler, resultContext, rowValue, parentMapping, rsw.getResultSet());
 9     }
10
11 }

 1 private void skipRows(ResultSet rs, RowBounds rowBounds) throws SQLException {
 2     if (rs.getType() != 1003) {
 3         if (rowBounds.getOffset() != 0) {
 4             rs.absolute(rowBounds.getOffset());
 5         }
 6     } else {     //从头开始移动游标,直至offset位置
 7         for(int i = 0; i < rowBounds.getOffset(); ++i) {
 8             rs.next();
 9         }
10     }
11
12 }

在Mybatis-Plus中的应用

Controller层

 1 @RequestMapping(value = "list", method = { RequestMethod.GET, RequestMethod.POST })
 2 @PageableDefaults(sort = "createDate=desc")
 3 private void getList(Queryable queryable,String queryStr, PropertyPreFilterable propertyPreFilterable, HttpServletRequest request,
 4                       HttpServletResponse response) throws IOException {
 5     //前端传过来需要的参数,加上id,fastjson会在得到结果集时过滤数据
 6     propertyPreFilterable.addQueryProperty("id");
 7     QueryableConvertUtils.convertQueryValueToEntityValue(queryable, entityClass);
 8     SerializeFilter filter = propertyPreFilterable.constructFilter(entityClass);
 9     //调用service层的分页查询
10     PageJson<OprPrintOrder> pagejson = new PageJson<OprPrintOrder>(service.list(queryable));
11     //得到需要的结果集后的数据过滤操作
12     String content = JSON.toJSONString(pagejson, filter);
13     JSONObject result = JSONObject.parseObject(content);
14     StringUtils.printJson(response, result.toString());
15 }

Service层

 1 @Override
 2 public Page<Order> list(Queryable queryable) {
 3     //pageable中有数据查询的要求
 4     Pageable pageable = queryable.getPageable();
 5     //封装新的分页查询类
 6     com.baomidou.mybatisplus.plugins.Page<Order> page = new com.baomidou.mybatisplus.plugins.Page<Order>(pageable.getPageNumber(), pageable.getPageSize());
 7     //传入RowBounds,page就是RowBounds的子类,这样查询后page就有了总页数与总条数
 8     page.setRecords(mapper.selectList(page));
 9     return new PageImpl<Order>(page.getRecords(), pageable, page.getTotal());
10 }

Mapper层

1 List<Order> selectList(RowBounds rowBounds);

1 <select id="selectList" resultType="Order">
2   select * from order
3 </select>

转载于:https://www.cnblogs.com/guanghe/p/10026099.html

Mybatis-plus之RowBounds实现分页查询相关推荐

  1. rowbounds分页oracle,Oracle使用MyBatis中RowBounds实现分页查询功能

    Oracle中分页查询因为存在伪列rownum,sql语句写起来较为复杂,现在介绍一种通过使用MyBatis中的RowBounds进行分页查询,非常方便. 使用MyBatis中的RowBounds进行 ...

  2. MyBatis之RowBounds实现分页查询

    使用RowBounds实现分页查询很简单. MyBatis的分页是基于内存的分页,即查出来所有记录,再按起始位置和页面容量取出结果. Sql映射: <!-- RowBounds实现分页 --&g ...

  3. Mybatis中limit用法与分页查询

    数据库使用的是mysql 要想在Mybatis中使用分页查询,首先要清楚mysql中limit的用法. limit a,b a是从第a+1条数据开始,b是指读取几条数据 例如:select * fro ...

  4. 实战 Java 第10天:商品分页查询

    实战 Java 第10天:商品分页查询 前言 一.添加pagehelper相关依赖 二.在 ProductService 类中添加接口 三.在 ProductMapper 类中添加接口 四.增加 sq ...

  5. MyBatis-Plus 之分页查询

    推荐:MyBatis Plus汇总 MyBatis-Plus 之分页查询 首先创建一个数据库表,如下图所示: 然后创建一个Spring Boot项目,pom.xml和配置如下: <?xml ve ...

  6. Mybatis + SpringMVC + Maven实现分页查询

    使用Mybatis + Maven + SpringMVC 运行时,突然被需要分页查询的功能给难住了 这里推荐采用的插件是PageHelper这个插件,使用起来十分方便.该插件支持以下数据库: Ora ...

  7. java mybatis分页查询语句_mybatis分页查询的实现(一)

    一.总结了mybatis中五种不同实现分页查询的方法 UserMapper.java接口文件 public interface UserMapper { //分页查询 public List sele ...

  8. Mybatis最入门---分页查询(逻辑分页与SQL语句分页)

    [一步是咫尺,一步即天涯] 到目前为止,我们介绍的Mybatis种种查询都是一次性的查询出所有结果并返回给上层.但是,在实际开发过程中,在大量数据存在的情况下,是很少这么做的.本文,我们将从逻辑分页, ...

  9. 【Springboot学习笔记】SpringBoot+Mybatis+Thymeleaf+Layui数据表单从零开始实现按条件模糊分页查询的方法

    [Springboot学习笔记]SpringBoot+Mybatis+Thymeleaf+Layui数据表单从零开始实现按条件模糊分页查询的方法 目录 1.搭建环境 1.1直接从网上下载SpringB ...

最新文章

  1. HBase 与 MapReduce 集成
  2. php选择符和举例子,关于CSS3中选择符的实例详解
  3. element手机验证格式_vue封装 element-ui form表单验证 正则匹配手机号 自定义校验表格内容...
  4. win10+Linux双系统安装
  5. scala 资源 copy 自知乎
  6. linux下无线网卡的ioctl 接口
  7. 大数据学习的思维原理和方法?
  8. 《计算机网络 自顶向下方法》(第7版)答案(第六章)(二)
  9. 超简单的方法找出QQ共同好友
  10. 你可以将类似于Google Earth的地球仪嵌入到自己的网站中
  11. 界面音效以及3D音效通过参数控制声音加载声音资源包
  12. 微信小程序之如何注册微信小程序
  13. 全国省市县sql(完整版)
  14. QStringLiteral(str)
  15. android调色器的实现
  16. 如何用VBA从EXCEL表取数据?问题1:1次性整体写入,还是循环写入数组呢? 问题2:取得数据后如何定位需要的那个?
  17. androID程序!BAT大厂面试基础题集合,附带学习经验
  18. DM数据库开启归档模式的三种方式
  19. 偶然发现的一篇文章 激励自己吧。
  20. 那个服务器的联盟最多的,魔兽世界联盟最多的服务器是哪个

热门文章

  1. leetcode 滴滴_一个菜逼程序媛的求职历程(秋招已拿阿里、网易、滴滴等校招offer)...
  2. 奇小葩讲设备树(1/5)-- Linux设备树详解(一) 基础知识
  3. lisp中怎样调取图形_越玩越聪明的图形思维游戏
  4. 计算机系统结构树形流程图,计算机系统结构 第七章自考练习题答案
  5. libcrypto yum 安装_YUM 安装 VSFTP出错
  6. UIViewController详解
  7. 电池充放电中的C5A 的意义
  8. PCB板材结构介绍(z)
  9. CURL HTTPS POST
  10. mac中修改系统限制量--ulimit和sysctl