Рубрики
Без рубрики

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

Автор оригинала: Vlad Mihalcea.

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

JOOQ – это следующий важный шаг на пути к лучшему JDBCAPI, и с тех пор, как я начал его использовать, я знал, что пути назад нет. 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 превосходит любые другие API JDBC.

С весной я бы так это назвал:

@Resource
private DataSource localTransactionDataSource;

@Override
public String formatTimestamp() {
    SqlFunction sqlFunction =
        new SqlFunction(localTransactionDataSource, "{ ? = call FORMAT_TIMESTAMP(?) }", new int[]{Types.TIMESTAMP});
    return (String) sqlFunction.runGeneric(new Date[]{new Date()});
}

Это намного лучше, чем стандартный API JDBC, но мне не нравится использовать имена строковых параметров или приводить возвращаемое значение. Поскольку HSQLDB не поддерживает использование параметров OUT для функций SQL Я не могу использовать Хранимую процедуру или 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 .