使用流进行懒加载
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
jOOQ 3.7+ 支持 Java 8,并且在 Java 8 中,它支持 java.util.stream.Stream。这开启了将 SQL 的声明式方面与新的 Stream API 的函数式方面相结合的一系列可能性。很像上一节中的Cursors,这样的 Stream 保留了对 JDBC java.sql.ResultSet 的内部引用,这意味着 Stream 必须像资源一样对待。以下是使用此类流的示例
// Obtain a Stream reference:
try (Stream<BookRecord> stream = create.selectFrom(BOOK).stream()) {
stream.forEach(Util::doThingsWithBook);
}
一个更复杂的例子是使用流来转换结果并为其添加业务逻辑。例如,从 H2 数据库的 INFORMATION_SCHEMA 生成带有 CREATE TABLE 语句的 DDL 脚本
create.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() // Eagerly load the whole ResultSet into memory first
.stream()
.collect(groupingBy(
r -> r.getValue(COLUMNS.TABLE_NAME),
LinkedHashMap::new,
mapping(
r -> new SimpleEntry(
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.getKey() +
" " + col.getValue())
.collect(Collectors.joining(",\n"))
);
System.out.println(");");
});
上述 SQL 和函数式编程的结合将产生以下输出
CREATE TABLE CATALOGS( CATALOG_NAME VARCHAR ); CREATE TABLE COLLATIONS( NAME VARCHAR, KEY VARCHAR ); CREATE TABLE COLUMNS( TABLE_CATALOG VARCHAR, TABLE_SCHEMA VARCHAR, TABLE_NAME VARCHAR, COLUMN_NAME VARCHAR, ORDINAL_POSITION INTEGER, COLUMN_DEFAULT VARCHAR, IS_NULLABLE VARCHAR, DATA_TYPE INTEGER, CHARACTER_MAXIMUM_LENGTH INTEGER, CHARACTER_OCTET_LENGTH INTEGER, NUMERIC_PRECISION INTEGER, NUMERIC_PRECISION_RADIX INTEGER, NUMERIC_SCALE INTEGER, CHARACTER_SET_NAME VARCHAR, COLLATION_NAME VARCHAR, TYPE_NAME VARCHAR, NULLABLE INTEGER, IS_COMPUTED BOOLEAN, SELECTIVITY INTEGER, CHECK_CONSTRAINT VARCHAR, SEQUENCE_NAME VARCHAR, REMARKS VARCHAR, SOURCE_DATA_TYPE SMALLINT );
反馈
您对此页面有任何反馈吗? 我们很乐意听取您的意见!