Mybatis中的游标查询Cursor(滚动查询)
作者:miraitowa.cn
这篇文章主要介绍了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);
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
