在jOOQ中获取数据的多种不同方式

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));
复制代码

你现在可以

取一个可空的记录

这就获取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值