Автор оригинала: 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() { SqlFunctionsqlFunction = 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 .