Mybatis-plus之RowBounds实现分页查询

物理分页和逻辑分页

物理分页:直接从数据库中拿出我们需要的数据,例如在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248933.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见的6种JavaScript设计模式

常见的6种JavaScript设计模式 构造函数模式 /*** 构造一个动物的函数 */ function Animal(name, color){this.name name;this.color color;this.getName function(){return this.name;} } // 实例一个对象 var cat new Animal(猫, 白色); console.log( cat.getName() );工…

峰度(Kurtosis)和偏度(Skewness)

峰度&#xff08;Kurtosis&#xff09; 定义峰度又称峰态系数&#xff0c;表征概率密度分布曲线在平均值处峰值高低的特征数&#xff0c;即是描述总体中所有取值分布形态陡缓程度的统计量。直观看来&#xff0c;峰度反映了峰部的尖度。这个统计量需要与正态分布相比较。 公式定…

1.27

测试程序提出问题并解决转载于:https://www.cnblogs.com/JustinTimberlake/p/10028870.html

javascript设计模式系列 - LukeLin - 博客园

javascript设计模式系列 创建型&#xff1a; 1.抽象工厂模式&#xff08;Abstract Factory&#xff09; 2.构建者模式&#xff08;Builder&#xff09; 3.工厂方法模式&#xff08;Factory Method&#xff09; 4.原型模式&#xff08;Prototype&#xff09; 5.单例模式&a…

多功能嵌入式解码软件(2)

多功能嵌入式解码软件&#xff08;2&#xff09; 验证类库 通信协议 下面进行一个示例&#xff1a; 下位机需要向上位机发送3中数据帧&#xff0c;数据帧以功能码来识别&#xff0c;每种数据帧的协议如下3个表格所示&#xff0c;上位机需要把这些数据按照协议解码出来&#xff…

vue项目如何打包扔向服务器 - Hi-Sen - 博客园

当我们将 vue 项目完成后&#xff0c;面临的就是如何将项目进行打包上线&#xff0c;放到服务器中。我使用的是 vue-cli&#xff08;simple&#xff09; 脚手架&#xff0c;所以就讲一下如何将项目进行打包&#xff0c;并放到 tomcat 上。 如果是 vue-cli (非 simple 脚手架…

MySQL备份与恢复-mysqldump备份与恢复

这片博文主要用来介绍MySQL的备份与恢复&#xff1a; MySQL的备份形式可以分为如下几种&#xff1a; 热备----即不停机备份冷备----需要关闭MySQL&#xff0c;然后备份其数据文件。&#xff08;停机备份一般是直接拷贝其datadir目录&#xff09;温备----在线备份&#xff0c;对…

第六次实训作业异常处理

第六次实训作业异常处理 编写一个类ExceptionTest&#xff0c;在main方法中使用try-catch-finally语句结构实现&#xff1a;在try语句块中&#xff0c;编写两个数相除操作&#xff0c;相除的两个操作数要求程序运行时用户输入&#xff1b;在catch语句块中&#xff0c;捕获被0除…

k8s学习笔记-调度之Affinity

Kubernetes中的调度策略可以大致分为两种 一种是全局的调度策略&#xff0c;要在启动调度器时配置&#xff0c;包括kubernetes调度器自带的各种predicates和priorities算法&#xff0c;具体可以参看上一篇文章&#xff1b; 另一种是运行时调度策略&#xff0c;包括nodeAffinity…

vue-cli webpack配置分析 - chenBright - SegmentFault 思否

相信vue使用者对vue-cli都不会陌生&#xff0c;甚至可以说&#xff0c;很熟悉了&#xff0c;但对其webpack的配置可能知之甚少吧。 过完年回来后&#xff0c;我接手了公司的新项目。新项目是一个spa。很自然&#xff0c;我就想到了vue-cli脚手架了&#xff0c;当时研究一下它的…

[Xcode 实际操作]六、媒体与动画-(6)使用UIBlurEffect给图片添加模糊效果

目录&#xff1a;[Swift]Xcode实际操作 本文将演示如何给图像添加模糊效果。 在项目导航区&#xff0c;打开视图控制器的代码文件【ViewController.swift】 1 import UIKit2 3 class ViewController: UIViewController {4 5 override func viewDidLoad() {6 super.…

MapReduce编程实践

一、MapReduce编程思想 学些MapRedcue主要是学习它的编程思想&#xff0c;在MR的编程模型中&#xff0c;主要思想是把对数据的运算流程分成map和reduce两个阶段&#xff1a; Map阶段&#xff1a;读取原始数据&#xff0c;形成key-value数据&#xff08;map方法&#xff09;。即…

webpack基础+webpack配置文件常用配置项介绍+webpack-dev-server - QxQstar - 博客园

一.webpack基础 1.在项目中生成package.json&#xff1a;在项目根目录中输入npm init&#xff0c;根据提示输入相应信息。&#xff08;也可以不生成package.json文件&#xff0c;但是package.json是很有用的&#xff0c;所有建议生成&#xff09; 2.安装webpaack a.在全局中安装…

(十)

空转载于:https://www.cnblogs.com/shanae/p/10034479.html

编译原理--NFA/DFA

现成的, 讲义: https://www.cnblogs.com/AndyEvans/p/10240790.html https://www.cnblogs.com/AndyEvans/p/10241031.html 一个例子, 写得非常好. 一下子就全明白了, 尤其是像我这种没有听过编译原理课程的人. https://blog.csdn.net/tyler_download/article/details/53139240 …

Python中pass的用法

空语句 do nothing保证格式完整保证语义完整以if语句为例&#xff0c;在c或c/java中&#xff1a; if(true); //do nothingelse{ //do something}对应于python就要这样写&#xff1a; if true: pass #do nothingelse: #do something 1 pass语句在函数中的作用当你在编写一个程序…

express路由管理的几种自动化方法分享-js教程-PHP中文网

我们平时在使用express写代码的过程中&#xff0c;会根据类别&#xff0c;将路由分为多个不同的文件&#xff0c;然后在项目的入口文件&#xff08;例如app.js&#xff09;中将其依次挂载&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 const index require(./routes/index) con…

dotnet不是内部或外部的命令,也不是可运行的程序或批处理文件

>>这台电脑>>属性>>高级系统设置>>环境变量>>系统变量>>Path>>编辑>> 变量值中添加 %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem; 即可。转载于:https://www.cnblogs.com/ZCrystal/p/10894591.html

转载 vue的基础使用

转载https://www.cnblogs.com/majj/p/9957597.html#top vue的介绍 前端框架和库的区别nodejs的简单使用vue的起步指令系统组件的使用过滤器的使用watch和computed钩子函数渐进式的JavaScript框架 vue react angualr作者:尤雨溪 facebook 谷歌公…

Express实现路由分发控制、RESTful API

Express实现路由分发控制、RESTful API 标签&#xff08;空格分隔&#xff09;&#xff1a; Node.js 最近在用Express作为自己的WEB应用框架&#xff0c;其中最为迷惑的就是Express的路由控制和分发&#xff0c;在网上搜了很多资料&#xff0c;但是大部分的资料都是将Express的…