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 .