jooq sql
JDBC API一直很麻烦且容易出错,我从来都不喜欢使用它。 Spring JDBC框架带来了第一个重大改进,该框架通过其JdbcTemplate或SqlFunction类(仅举几例)简单地重振了JDBC的使用。 但是Spring JDBC并没有解决使用字符串函数或输入参数名称的缺点,这为类型安全SQL包装器(如JOOQ)打开了大门 。
JOOQ是迈向更好的JDBC API的下一个主要步骤,自从我开始使用它以来,我就知道没有回头路了。 JOOQ成为我构建动态查询的第一选择,最近它成为我的标准SQL函数包装器。
为了证明这一点,我将从一个简单SQL函数开始:
CREATE FUNCTION FORMAT_TIMESTAMP (IN_TIME TIMESTAMP) RETURNS CHAR
RETURN TO_CHAR(IN_TIME, 'DD-MON-YYYY HH24:MI:SS.FF');
尽管您永远不要使用数据库来格式化日期,但是由于这是应用程序逻辑的工作,因此为了进行测试,让我们专注于输入和输出变量类型,因为这是JOOQ优于其他任何JDBC API的地方。
对于Spring,这就是我的称呼:
@Resource
private DataSource localTransactionDataSource;
@Override
public String formatTimestamp() {
SqlFunction<String> sqlFunction =
new SqlFunction<String>(localTransactionDataSource, "{ ? = call FORMAT_TIMESTAMP(?) }", new int[]{Types.TIMESTAMP});
return (String) sqlFunction.runGeneric(new Date[]{new Date()});
}
这比标准的JDBC API更好,但是我不喜欢使用String参数名称或转换返回值。 由于HSQLDB不支持将OUT参数用于SQL函数,因此我无法使用StoredProcedure或SimpleJdbcCall ,它们可能为SqlFunction示例提供了更好的替代方法。
让我们看看如何使用JOOQ进行调用:
@Autowired
private DSLContext localTransactionJooqContext;
@Override
public String formatTimestamp() {
FormatTimestamp sqlFunction = new FormatTimestamp();
sqlFunction.setInTime(new Timestamp(System.currentTimeMillis()));
sqlFunction.execute(localTransactionJooqContext.configuration());
return sqlFunction.getReturnValue();
}
在我看来,这是迄今为止我使用过的最精美SQL函数包装器,这就是为什么它成为我调用SQL函数和过程的标准方法的原因。
- 代码可在GitHub上获得 。
翻译自: https://www.javacodegeeks.com/2014/02/jooq-facts-sql-functions-made-easy.html
jooq sql