Mybatis游标查询Cursor(滚动查询)
Mybatis游标查询Cursor(滚动查询)
·
需求是实现滚动查询而不是分页,用游标查询实现此需求
总体思路:滚动查询,往下拉滚动条触发请求,返回数据并带当前下标,以备下次请求继续往下查询
①首先在dao层mapper文件中写查询方法(下面的示例带有查询条件)
// 策略为向下滚动
@Options(resultSetType = ResultSetType.FORWARD_ONLY)
@Select({"select * from task where status!=#{status} order by create_time desc"})
Cursor<Task> getTasksStatistic(Integer status);
②在service层写方法并在serviceimpl中实现
// TaskCursorVo是封装类
TaskCursorVo getTaskStatus(Integer currentIndex, Integer pageSize);
public TaskCursorVo getTaskStatus(Integer currentIndex,Integer pageSize) {
TaskCursorVo taskCursorVo=new TaskCursorVo();
List<TaskStatusVo> collect=new ArrayList<>();
// 第一个参数为方法名,第二个参数是查询条件的值(如果没有查询条件就写null),第三个条件是从下标为currentIndex的开始查pageSize条数据
Cursor<Task> tasksStatistic = sqlSessionTemplate.selectCursor("getTasksStatistic",DELETED.getCode(),new RowBounds(currentIndex,pageSize));
// 对结果进行遍历封装
Iterator<Task> iterator = tasksStatistic.iterator();
while (iterator.hasNext()) {
Task task = iterator.next();
TaskStatusVo taskStatusVo = new TaskStatusVo();
BeanUtils.copyProperties(task, taskStatusVo);
taskStatusVo.setStatusName(Objects.requireNonNull(getByCode(task.getStatus())).getDesc());
collect.add(taskStatusVo);
}
taskCursorVo.setTaskStatusVos(collect);
// 需要把当前下标返回给前端
taskCursorVo.setCurrentIndex(tasksStatistic.getCurrentIndex());
Example e=new Example(Task.class);
Example.Criteria c = e.createCriteria().andNotEqualTo("status", DELETED.getCode());
List<Task> tasks = taskMapper.selectByExample(e);
// 把总条数查出来给前端
taskCursorVo.setTotalSize(tasks.size());
return taskCursorVo;
}
③controller实现
@GetMapping("/taskStatus")
public ResultModel taskStatus(@RequestParam(defaultValue = "0") Integer currentIndex,@RequestParam(defaultValue = "20") Integer pageSize){
// 第一次默认从第0条开始查询20条,往后的前端会把上次请求返回的当前下表传过来
// 如果不是从第一次查询,就要从上次查询当前下标的下一条数据开始查询
if (currentIndex!=0){
currentIndex+=1;
}
TaskCursorVo taskCursorVo = taskService.getTaskStatus(currentIndex, pageSize);
return ResultModel.success(taskCursorVo);
}
更多推荐
已为社区贡献6条内容
所有评论(0)