JDBCとjOOQの比較
生のJDBC文字列ベースSQLをjOOQの型安全なフルエントSQL DSLに置き換える。
コード比較
✕ Raw JDBC
String sql = "SELECT id, name, email FROM users "
+ "WHERE department = ? AND salary > ?";
try (Connection con = ds.getConnection();
PreparedStatement ps =
con.prepareStatement(sql)) {
ps.setString(1, department);
ps.setBigDecimal(2, minSalary);
ResultSet rs = ps.executeQuery();
List<User> result = new ArrayList<>();
while (rs.next()) {
result.add(new User(
rs.getLong("id"),
rs.getString("name"),
rs.getString("email")));
}
return result;
}
✓ jOOQ
DSLContext dsl = DSL.using(ds, SQLDialect.POSTGRES);
return dsl
.select(USERS.ID, USERS.NAME, USERS.EMAIL)
.from(USERS)
.where(USERS.DEPARTMENT.eq(department)
.and(USERS.SALARY.gt(minSalary)))
.fetchInto(User.class);
このコードに問題がありますか? お知らせください。
モダンな方法が優れている理由
型安全なカラム
カラム名は生成されたJava定数のため、タイポや型の不一致はコンパイルエラーになります。
SQL流暢性
jOOQ DSLはSQL構文に近く、複雑なJOIN・サブクエリ・CTEも読みやすく書けます。
インジェクション対策済み設計
パラメーターは常に安全にバインドされ、文字列連結がないためSQLインジェクションのリスクがありません。
旧来のアプローチ
生のJDBC
モダンなアプローチ
jOOQ SQL DSL
JDKバージョン
11
難易度
中級
JDKサポート
JDBCとjOOQの比較
利用可能
jOOQオープンソース版はすべての主要オープンソースデータベースをサポート。古い商用DBは有償ライセンスが必要
仕組み
jOOQ(Java Object Oriented Querying)はデータベーススキーマからJavaコードを生成し、テーブル名・カラム名を型安全なJava定数に変換します。フルエントDSLはSQL構文を模倣しており、クエリが読みやすく組み合わせやすいです。パラメーターは自動的にバインドされ、SQLインジェクションのリスクが排除されます。JPA/JPQLと異なり、jOOQはSQLを完全に活用でき、ウィンドウ関数・CTE・RETURNING句・ベンダー固有拡張もファーストクラスです。
関連ドキュメント