jOOQ的API是关于方便的,因此,像 fetch()
这样的重要操作(最重要的操作?)也必须附带方便。获取数据的默认方式是这样的:
Result<Record1<String>> result = ctx.select(BOOK.TITLE) .from(BOOK) .fetch(); for (Record1<String> record : result) { // ... } 复制代码
它将整个结果集取到内存中,并急切地关闭底层的JDBC资源。但是我们还有什么其他的选择呢?
可迭代的获取方式
在上面的例子中, fetch()
的调用并不是严格意义上的必要。 [ResultQuery<R>](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/ResultQuery.html)
类型 方便地扩展了 Iterable<R> , 这意味着对 ResultQuery.iterator()
的调用也将执行该查询。这主要可以通过两种方式实现。
外部迭代
for (Record1<String> record : ctx .select(BOOK.TITLE) .from(BOOK) ) { // ... } 复制代码
这特别好,因为它感觉就像PL/SQL或PL/pgSQL的 FOR
循环,用于隐式游标:
FOR rec IN (SELECT book.title FROM book) LOOP -- ... END LOOP; 复制代码
不过这仍然要把整个结果集取到内存中,因为在Java中没有一个 for-with-resources
语法,它把 foreach
语法和 try-with-resources
语法结合起来。
内部迭代
JDK 8增加了 Iterable::forEach
,jOOQ的 [ResultQuery](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/ResultQuery.html)
继承了,所以你也可以这样做。
ctx.select(BOOK.TITLE) .from(BOOK) .forEach(record -> { // ... }); 复制代码
两者是完全等价的。
单一记录的获取
如果你确定你只取一个单一的值,不需要具体化一个列表。只需使用以下方法之一。鉴于这个查询:
ResultQuery<Record1<String>> query = ctx .select(BOOK.TITLE) .from(BOOK) .where(BOOK.ID.eq(1)); 复制代码
你现在可以
取一个可空的记录
这就获取