使用这种分页方式,好像是比jpa或者MyBatis自带的分页工具有更好的性能和安全性。
需要接收的参数
public ApiResponse getBlackList( @RequestParam(name = "pageSize", required = false) Integer pageSize, @RequestParam(name = "cursor", required = false) String cursor) { //pageSize 页面容量 /*cursor 即偏移量,使用数据id或者某个专门用来分页的字段,比如上次查询了id为5-10的数据,下一页数据cursor的值应为10,service层的代码查询id >= cursor+1的数据,查询的数量为pageSize个,如果没有携带cursor,按照查询第一页处理*/}
service
// 注:查询的时候传pageSize + 1是为了获取下一页第一条数据的id,返回给前端作为下一页的cursor传过来List result = new ArrayList();if(StringUtils.isBlank(cursor)) { //查询首页 result = repository.findFirstPage(pageSize + 1);}else { Long longCursor = null; try { //解密cursor byte[] decode = Base64.getUrlDecoder().decode(cursor); //转成Long类型 longCursor = new Long(new String(decode)); } catch (IllegalArgumentException e) { log.warn("parameter [{}] type exception", cursor); throw new IllegalArgumentException("Unexpeted value: cursor [" + cursor + "]"); } //查询 result = repository.findPage(pageSize + 1, longCursor);if (result.size() > pageSize) { // 删除最后一条数据,因为那是下一页的第一条 Pojo pojo= result.get(result.size() - 1); result.remove(pojo); //获取下一页第一条id Long id = pojo.getId(); //加密该id返回给前端,用作下一页的查询 String newCursor = Base64.getUrlEncoder().encodeToString(String.valueOf(id).getBytes()); resultMap.put("cursor", newCursor); }}
repository
/*查找首页*/select * from table where '查询条件' order by model.id limit :pageSize/*分页查询*/select * from table where '查询条件' model.id>=:cursor order by model.id limit :pageSize