Статьи

Факты JOOQ: функции SQL стали проще

JDBC API всегда был громоздким и подвержен ошибкам, и я никогда не любил его использовать. Первое значительное улучшение было внесено в среду Spring JDBC, которая просто оживила использование JDBC с помощью своих классов JdbcTemplate или SqlFunction . Но Spring JDBC не устраняет недостаток использования строковых функций или имен входных параметров, и это открыло двери для безопасных для типов оболочек SQL, таких как JOOQ .

JOOQ — это следующий важный шаг к лучшему API JDBC, и с тех пор, как я начал его использовать, я знал, что пути назад не будет. JOOQ стал моим выбором номер один для построения динамических запросов, а недавно он стал моей стандартной программой-оболочкой SQL.

Чтобы доказать это, я начну с простой функции SQL:

1
2
CREATE FUNCTION FORMAT_TIMESTAMP (IN_TIME TIMESTAMP) RETURNS CHAR
    RETURN TO_CHAR(IN_TIME, 'DD-MON-YYYY HH24:MI:SS.FF');

Хотя вам никогда не следует использовать свою базу данных для форматирования даты, поскольку это задача логики вашего приложения, для тестирования давайте сосредоточимся на типах входных и выходных переменных, поскольку именно здесь JOOQ превосходит все другие API JDBC.

С Spring это так я бы назвал:

1
2
3
4
5
6
7
8
9
@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:

01
02
03
04
05
06
07
08
09
10
@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 .