物理分页和逻辑分页
物理分页:直接从数据库中拿出我们需要的数据,例如在Mysql中使用limit。
逻辑分页:从数据库中拿出所有符合要求的数据,然后再从这些数据中拿到我们需要的分页数据。
优缺点
物理分页每次都要访问数据库,逻辑分页只访问一次。
物理分页占用内存少,逻辑分页相对较多。
物理分页数据每次都是最新的,逻辑分页有可能滞后。
一般用法
1 public ListqueryListByPage(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
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 PageJsonpagejson = new PageJson (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 Pagelist(Queryable queryable) { 3 //pageable中有数据查询的要求 4 Pageable pageable = queryable.getPageable(); 5 //封装新的分页查询类 6 com.baomidou.mybatisplus.plugins.Page page = new com.baomidou.mybatisplus.plugins.Page (pageable.getPageNumber(), pageable.getPageSize()); 7 //传入RowBounds,page就是RowBounds的子类,这样查询后page就有了总页数与总条数 8 page.setRecords(mapper.selectList(page)); 9 return new PageImpl (page.getRecords(), pageable, page.getTotal());10 }
Mapper层
1 ListselectList(RowBounds rowBounds);
1