mybatis cursor怎么使用
时间: 2025-02-14 21:11:56 浏览: 72
### 使用 MyBatis Cursor 进行分页查询及遍历大型结果集
#### 返回 `Cursor` 类型的方法定义
在 MyBatis 中,通过将 Mapper 接口中的方法返回类型设置为 `org.apache.ibatis.cursor.Cursor<T>` 来启用流式查询功能。这使得应用程序能够高效处理大容量的数据集合而无需一次性加载全部记录到内存中[^1]。
```java
public interface StudentMapper {
@Select("SELECT * FROM students ORDER BY id LIMIT #{offset},#{limit}")
Cursor<Student> queryStudents(int offset, int limit);
}
```
#### 遍历 `Cursor`
由于实现了 Java 的 `Iterable` 接口,可以直接利用增强for循环或是 Stream API 对其内部元素进行迭代访问;同时作为资源管理的一部分,记得及时关闭游标以释放数据库连接和其他相关资源[^2]。
```java
try (Cursor<Student> studentCursor = mapper.queryStudents(offset, limit)) {
List<Student> resultList = new ArrayList<>();
// Using forEach to iterate over the cursor's elements.
studentCursor.forEach(resultList::add);
// Alternatively using a traditional enhanced for-loop:
/*
for (Student s : studentCursor) {
resultList.add(s);
}
*/
} catch (Exception e) {
logger.error("Error while processing cursor", e);
}
```
#### 控制器层实现分页逻辑
对于 Web 应用程序而言,在控制器层面接收客户端传递来的参数并据此调整查询起点与数量是一个常见的需求。下面展示了一种基于 RESTful API 设计模式下的做法[^5]:
```java
@GetMapping("/students")
public ResponseEntity<List<Student>> getPaginatedStudents(
@RequestParam(value="page", defaultValue="0") Integer page,
@RequestParam(value="size", defaultValue="20") Integer size){
try(Cursor<Student> cursor = studentMapper.queryStudents(page*size, size)){
List<Student> resultPage = new ArrayList<>(size);
Iterator<Student> it = cursor.iterator();
IntStream.range(0, Math.min(size, Collections.frequency(cursor.toList(), null))).forEach(i -> resultPage.add(it.next()));
return ResponseEntity.ok().body(resultPage);
}catch(Exception ex){
throw new RuntimeException(ex.getMessage());
}
}
```
阅读全文
相关推荐


















