懒加载
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
与 JDBC 的 java.sql.ResultSet
不同,jOOQ 的 org.jooq.Result
不代表具有各种提取模式和滚动模式的打开的数据库游标,使用后需要关闭。jOOQ 的结果是简单的内存 Java java.util.List
对象,包含所有结果值。如果您的结果集很大,或者您有很多网络延迟,您可能希望逐个或小块地提取记录。jOOQ 支持 org.jooq.Cursor
类型来实现此目的。为了获得这样的引用,请使用 ResultQuery.fetchLazy()
方法。这里给出了一个例子
// Obtain a Cursor reference: try (Cursor<BookRecord> cursor = create.selectFrom(BOOK).fetchLazy()) { // Cursor has similar methods as Iterator<R> while (cursor.hasNext()) { BookRecord book = cursor.fetchOne(); Util.doThingsWithBook(book); } }
由于 org.jooq.Cursor
保留对打开的 java.sql.ResultSet
的内部引用,因此可能需要在迭代结束时将其关闭。如果游标完全滚动完毕,它将方便地关闭底层 ResultSet。但是,您不应该依赖这一点。
提取大小
虽然使用 Cursor
可以防止 jOOQ 渴望将所有数据提取到内存中,但您的底层 JDBC 驱动程序可能仍然这样做。要在 JDBC 驱动程序中配置提取大小,请使用 ResultQuery.fetchSize(int)
,它在执行查询时指定 JDBC Statement.setFetchSize(int)
。请参阅您的 JDBC 驱动程序手册,了解提取大小及其可能的默认值和限制。
游标附带所有其他提取功能
与 org.jooq.ResultQuery
或 org.jooq.Result
一样,org.jooq.Cursor
提供了对我们目前为止看到的所有其他提取功能的访问权限,即:
-
强类型或弱类型记录:游标也使用 <R> 类型进行类型化,允许提取自定义生成的
org.jooq.TableRecord
或普通的org.jooq.Record
类型。 -
RecordMapper 回调:您可以使用自己的
org.jooq.RecordMapper
回调来映射延迟提取的记录。 - POJOs:您可以将数据提取到您自己的自定义 POJO 类型中。
反馈
您对此页面有任何反馈吗? 我们很乐意听取您的意见!