使用这种分页方式,好像是比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