zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    【arm】arm平台下char默认数据类型与-fsigned-char
    【arm】arm指令集架构和处理器命名规则和历史
    【shell】正则表达式用法:匹配不包含字符串
    【arm】arm后缀.s和.S的区别以及asm.S说明
    【Optimization/x86】内联汇编Inline assembly——基础学习
    【Optimizaiton/x86】x86 SSE Intrinsic: 点乘算法的Intrinsic实现
    【Optimizaition/x86】Intel CPU的CPUID指令获取的C实现
    【linux】Linux中Core Dump分析
    【shell】linux 查看文件夹以及文件大小数目等信息
    【arm】arm-assembly-print-register-value-in-decimal
  • 原文地址:https://www.cnblogs.com/guanghe/p/10026099.html
Copyright © 2011-2022 走看看