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); }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。