JAVA 如何逐步使用 JOOQ 构建 sql 查询
JAVA How to build a sql query with JOOQ step by step
在我的 Java 代码中,我想创建一个长查询,我找到了 JOOQ 来构建查询并且我在没有生成的情况下使用它 class 但是我找不到构建我的查询的方法像这样一步步查询:
DSLContext request = DSL.using(sqlConnection, SQLDialect.MYSQL);
request.insertInto(DSL.table("MyTable"), DSL.field("MyColumn1"), DSL.field("MyColumn2"));
// ... some code ...
request.values("hello", 98);
// ... some code ...
request.values("world", 67);
// ... some code ...
request.execute();
怎么做这个?
你有很多选择。
坚持使用 DSL API
...并将中间类型分配给局部变量:
DSLContext request = DSL.using(sqlConnection, SQLDialect.MYSQL);
InsertValuesStep2<?, Object, Object> step = request.insertInto(
DSL.table("MyTable"), DSL.field("MyColumn1"), DSL.field("MyColumn2"));
// ... some code ...
step = step.values("hello", 98);
// ... some code ...
step = values("world", 67);
// ... some code ...
step.execute();
改用模型API
... 这种动态 SQL 使用模型 API 可能更容易实现(另请参阅 http://www.jooq.org/doc/latest/manual/sql-building/sql-statements/dsl-and-non-dsl)
DSLContext request = DSL.using(sqlConnection, SQLDialect.MYSQL);
InsertQuery<?> insert = request.insertQuery(DSL.table("MyTable"));
// ... some code ...
insert.addValue(DSL.field("MyColumn1", String.class), "hello"))
insert.addValue(DSL.field("MyColumn1", Integer.class), 98))
// ... some code ...
insert.newRecord();
insert.addValue(DSL.field("MyColumn1", String.class), "world"))
insert.addValue(DSL.field("MyColumn1", Integer.class), 67))
// ... some code ...
insert.execute();
使用批处理语句
另一种方法是使用批处理 API (http://www.jooq.org/doc/latest/manual/sql-execution/batch-execution) 将一批多个单独的语句发送到服务器。例如:
request.batch(DSL.insertInto(
DSL.table("MyTable"), DSL.field("MyColumn1"), DSL.field("MyColumn2"))
.values((String) null, null))
.bind("hello", 98)
.bind("world", 67)
.execute();
... 或者,以更动态的形式:
List<Object[]> values = new ArrayList<>();
// ... some code ...
values.add(new Object[] { "hello", 98 });
// ... some code ...
values.add(new Object[] { "world", 67});
request.batch(DSL.insertInto(
DSL.table("MyTable"), DSL.field("MyColumn1"), DSL.field("MyColumn2"))
.values((String) null, null))
.bind(values.toArray(new Object[list.size()][]))
.execute();
在我的 Java 代码中,我想创建一个长查询,我找到了 JOOQ 来构建查询并且我在没有生成的情况下使用它 class 但是我找不到构建我的查询的方法像这样一步步查询:
DSLContext request = DSL.using(sqlConnection, SQLDialect.MYSQL);
request.insertInto(DSL.table("MyTable"), DSL.field("MyColumn1"), DSL.field("MyColumn2"));
// ... some code ...
request.values("hello", 98);
// ... some code ...
request.values("world", 67);
// ... some code ...
request.execute();
怎么做这个?
你有很多选择。
坚持使用 DSL API
...并将中间类型分配给局部变量:
DSLContext request = DSL.using(sqlConnection, SQLDialect.MYSQL);
InsertValuesStep2<?, Object, Object> step = request.insertInto(
DSL.table("MyTable"), DSL.field("MyColumn1"), DSL.field("MyColumn2"));
// ... some code ...
step = step.values("hello", 98);
// ... some code ...
step = values("world", 67);
// ... some code ...
step.execute();
改用模型API
... 这种动态 SQL 使用模型 API 可能更容易实现(另请参阅 http://www.jooq.org/doc/latest/manual/sql-building/sql-statements/dsl-and-non-dsl)
DSLContext request = DSL.using(sqlConnection, SQLDialect.MYSQL);
InsertQuery<?> insert = request.insertQuery(DSL.table("MyTable"));
// ... some code ...
insert.addValue(DSL.field("MyColumn1", String.class), "hello"))
insert.addValue(DSL.field("MyColumn1", Integer.class), 98))
// ... some code ...
insert.newRecord();
insert.addValue(DSL.field("MyColumn1", String.class), "world"))
insert.addValue(DSL.field("MyColumn1", Integer.class), 67))
// ... some code ...
insert.execute();
使用批处理语句
另一种方法是使用批处理 API (http://www.jooq.org/doc/latest/manual/sql-execution/batch-execution) 将一批多个单独的语句发送到服务器。例如:
request.batch(DSL.insertInto(
DSL.table("MyTable"), DSL.field("MyColumn1"), DSL.field("MyColumn2"))
.values((String) null, null))
.bind("hello", 98)
.bind("world", 67)
.execute();
... 或者,以更动态的形式:
List<Object[]> values = new ArrayList<>();
// ... some code ...
values.add(new Object[] { "hello", 98 });
// ... some code ...
values.add(new Object[] { "world", 67});
request.batch(DSL.insertInto(
DSL.table("MyTable"), DSL.field("MyColumn1"), DSL.field("MyColumn2"))
.values((String) null, null))
.bind(values.toArray(new Object[list.size()][]))
.execute();