From 639914a65e77abb54cdd851dcfa7edc5f1237a7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E6=BA=90=E6=B5=B7=E5=93=A5?= Date: Mon, 12 Jun 2023 11:39:58 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=E6=B8=B8=E6=A0=87?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E7=9A=84=E7=9B=B8=E5=85=B3=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/base/query.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/docs/zh/base/query.md b/docs/zh/base/query.md index 002ed86d..cb311560 100644 --- a/docs/zh/base/query.md +++ b/docs/zh/base/query.md @@ -25,6 +25,38 @@ - **selectCountByCondition**:根据 QueryWrapper 查询数据量。 - **selectCountByQuery**:根据 QueryWrapper 查询数据量。 +## 游标查询 + +我们对大量数据进行处理时,为防止方法内存泄漏情况,应该使用游标(Cursor)方式进行数据查询并处理数据。 +在 `BaseMapper` 中,存在如下的游标查询方法: + +```java +Cursor selectCursorByQuery(QueryWrapper queryWrapper); +``` +其使用方法如下: + +```java +Db.tx(() -> { + Cursor accounts = accountMapper.selectCursorByQuery(query); + for (Account account : accounts) { + System.out.println(account); + } + return true; +}); +``` + +以上的示例中,数据库并**不是**把所有的数据一次性返回给应用,而是每循环 1 次才会去数据库里拿 1 条数据,这样,就算有 100w 级数据,也不会导致我们应用内存溢出,同时,在 for 循环中, +我们可以随时终止数据读取。 + +但由于游标查询是在 for 循环的时候,才去数据库拿数据。因此必须保证 `selectCursorByQuery` 方法及其处理必须是在事务中进行,才能保证其链接并未与数据库断开。 + +**以下场景经常需要用到游标查询功能:** + +- 1、数据查询并写入到缓存 +- 2、Excel 导出等 + + + ## 多表查询(关联查询) 在 `BaseMapper` 中,提供了 `selectOneByQueryAs`、`selectListByQueryAs` 、`paginateAs` 等方法,用于处理关联查询的场景。