物理分页和逻辑分页

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

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

优缺点

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

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

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

一般用法

 public List<Order> queryListByPage(RowBounds rowBounds);
 dao.queryListPage(new RowBounds(offset,limit));

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

offset:起始行数

limit:需要的数据行数

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

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

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

 private void handleRowValuesForSimpleResultMap(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping parentMapping) throws SQLException {
DefaultResultContext<Object> resultContext = new DefaultResultContext();
this.skipRows(rsw.getResultSet(), rowBounds); //游标跳到offset位置
//取出limit条数据
while(this.shouldProcessMoreRows(resultContext, rowBounds) && rsw.getResultSet().next()) {
ResultMap discriminatedResultMap = this.resolveDiscriminatedResultMap(rsw.getResultSet(), resultMap, (String)null);
Object rowValue = this.getRowValue(rsw, discriminatedResultMap);
this.storeObject(resultHandler, resultContext, rowValue, parentMapping, rsw.getResultSet());
} }
 private void skipRows(ResultSet rs, RowBounds rowBounds) throws SQLException {
if (rs.getType() != 1003) {
if (rowBounds.getOffset() != 0) {
rs.absolute(rowBounds.getOffset());
}
} else { //从头开始移动游标,直至offset位置
for(int i = 0; i < rowBounds.getOffset(); ++i) {
rs.next();
}
} }

在Mybatis-Plus中的应用

Controller层

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

Service层

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

Mapper层

 List<Order> selectList(RowBounds rowBounds);
 <select id="selectList" resultType="Order">
select * from order
</select>

Mybatis-plus之RowBounds实现分页查询的更多相关文章

  1. Oracle使用MyBatis中RowBounds实现分页查询

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

  2. springboot结合mybatis使用pageHelper插件进行分页查询

    1.pom相关依赖引入 <dependencies> <dependency> <groupId>org.springframework.boot</grou ...

  3. Mybatis的ResultMap与limit分页查询

    ResultMap主要解决的是:属性名和字段不一致 如果在pojo中设置的是一个名字,在数据库上又是另一个名字,那么查询出来的结果或者其他操作的结果就为null. //在pojo中 private S ...

  4. MyBatis学习总结_12_Mybatis+Mysql分页查询

    package cn.tsjinrong.fastfile.util; /** * @ClassName: Page * @Description: TODO(分页组件的父类,用来封装分页的 通用内容 ...

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

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

  6. Mybatis+SpringMVC实现分页查询(附源码)

    Maven+Mybatis+Spring+SpringMVC实现分页查询(附源码) 一.项目搭建 关于项目搭建,小宝鸽以前写过一篇Spirng+SpringMVC+Maven+Mybatis+MySQ ...

  7. Mybatis包分页查询java公共类

    Mybatis包分页查询java公共类   分页----对于数据量非常大的查询中.是不可缺少的. mybatis底层的分页sql语句因为须要我们自己去手动写.而实现分页显示的时候我们须要依据分页查询条 ...

  8. JAVA入门[10]-mybatis分页查询

    1.添加分页插件 在mybatis-generator-config.xml添加plugin节点: <plugin type="org.mybatis.generator.plugin ...

  9. Mybatis+MySQL动态分页查询

    https://blog.csdn.net/qq_34137397/article/details/63289621 mybatis有两种分页方法 1.内存分页,也就是假分页.本质是查出所有的数据然后 ...

随机推荐

  1. Chrome浏览器下CSS字体大小设置小于12px无效问题

    当字体大小被设置小于12px时,IE.firefox可以起作用.但chrome中仍然显示为12px大小. 解决方法为: html, body {     -webkit-text-size-adjus ...

  2. WEB安全第七篇--终结篇考验逻辑思维:逻辑漏洞大汇总(越权、会话逻辑、业务逻辑、暴力破解)

    零.前言 最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件.底层安全.漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的pay ...

  3. 【Android】保存Bitmap到SD卡

    1.打开读写SD卡的权限 需要在AndroidManifest.xml加入如下代码: <uses-permission android:name="android.permission ...

  4. 电力项目十八--DOM对象的ajax

    Ajax操作的核心对象:xmlreq = new XMLHttpRequest(); 第一步:在dictionaryIndex.jsp中添加: <script type="text/j ...

  5. BeginnerAdmin后台框架的使用!

    基于layui的后台框架,我比较喜欢使用BeginnerAdmin模板.但是在构建的时候可能会遇到一些问题. 问题一:侧栏出不来: 报错是这样的: 这个错误:说明的是 navbar.js没有引进来. ...

  6. 微信小程序 --- 登录页面

    思路:在个人中心页面,首先判断全局的 app.js 里面的 globalData 里面的 is_login 状态,并且判断 缓存数据中的 is_login 状态,如果都为真,就正常显示,如果有一个为假 ...

  7. 无向连通图求割点(tarjan算法去掉改割点剩下的联通分量数目)

    poj2117 Electricity Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3603   Accepted: 12 ...

  8. 亿级别G级别文本数据去重

    亿级别G级别文本数据去重 文件总行数 字节数 去重后行数 [root@d mongoexport]# wc -l superpub-ask-question.csv126530681 superpub ...

  9. MySQL慢查询日志工具mysqlsla

    mysql数据库的慢查询日志是非常重要的一项调优辅助日志,但是mysql默认记录的日志格式阅读时不够友好,这是由mysql日志记录规则所决定的,捕获一条就记录一条,虽说记录的信息足够详尽,但如果将浏览 ...

  10. MVC4中使用Html.DropDownList实现级联

    本文记录了一个在MVC4中使用PartialView实现级联效果的小例子. 准备工作 首先准备一下要级联的数据,新建两个类:Province和City public class Province { ...