可用版本: Dev (3.21) | 最新版 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11

jOOQ 和 Java 8

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

Java 8 引入了一系列很棒的增强功能,其中包括 lambda 表达式和新的 java.util.stream.Stream。这些新结构与 jOOQ 的流畅 API 非常契合,如下例所示

jOOQ 和 lambda 表达式

jOOQ 的 RecordMapper API 已完全准备好支持 Java 8,这基本上意味着它是一个 SAM(单一抽象方法)类型,可以使用 lambda 表达式实例化。考虑以下示例

try (Connection c = getConnection()) {
    String sql = "select schema_name, is_default " +
                 "from information_schema.schemata " +
                 "order by schema_name";

    DSL.using(c)
       .fetch(sql)

       // We can use lambda expressions to map jOOQ Records
       .map(rs -> new Schema(
           rs.getValue("SCHEMA_NAME", String.class),
           rs.getValue("IS_DEFAULT", boolean.class)
       ))

       // ... and then profit from the new Collection methods
       .forEach(System.out::println);
}

上面的示例展示了 jOOQ 的 Result.map() 方法如何接收实现 RecordMapper 的 lambda 表达式,以将 jOOQ Records 映射到您的自定义类型。

jOOQ 和 Streams API

jOOQ 的 Result 类型扩展了 java.util.List,这为 Java 8 中各种新的 Java 功能打开了访问权限。以下示例展示了将包含 INFORMATION_SCHEMA 元数据的 jOOQ Result 转换为生成 DDL 语句是多么容易

DSL.using(c)
   .select(
       COLUMNS.TABLE_NAME,
       COLUMNS.COLUMN_NAME,
       COLUMNS.TYPE_NAME
   )
   .from(COLUMNS)
   .orderBy(
       COLUMNS.TABLE_CATALOG,
       COLUMNS.TABLE_SCHEMA,
       COLUMNS.TABLE_NAME,
       COLUMNS.ORDINAL_POSITION
   )
   .fetch()  // jOOQ ends here
   .stream() // JDK 8 Streams start here
   .collect(groupingBy(
       r -> r.getValue(COLUMNS.TABLE_NAME),
       LinkedHashMap::new,
       mapping(
           r -> new Column(
               r.getValue(COLUMNS.COLUMN_NAME),
               r.getValue(COLUMNS.TYPE_NAME)
           ),
           toList()
       )
   ))
   .forEach(
       (table, columns) -> {
            // Just emit a CREATE TABLE statement
            System.out.println(
                "CREATE TABLE " + table + " (");

            // Map each "Column" type into a String
            // containing the column specification,
            // and join them using comma and
            // newline. Done!
            System.out.println(
                columns.stream()
                       .map(col -> "  " + col.name +
                                    " " + col.type)
                       .collect(Collectors.joining(",\n"))
            );

           System.out.println(");");
       }
   );

反馈

您对此页面有任何反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo