Enterprise 中級

生の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
難易度
中級
JDBCとjOOQの比較
利用可能

jOOQオープンソース版はすべての主要オープンソースデータベースをサポート。古い商用DBは有償ライセンスが必要

jOOQ(Java Object Oriented Querying)はデータベーススキーマからJavaコードを生成し、テーブル名・カラム名を型安全なJava定数に変換します。フルエントDSLはSQL構文を模倣しており、クエリが読みやすく組み合わせやすいです。パラメーターは自動的にバインドされ、SQLインジェクションのリスクが排除されます。JPA/JPQLと異なり、jOOQはSQLを完全に活用でき、ウィンドウ関数・CTE・RETURNING句・ベンダー固有拡張もファーストクラスです。

共有 𝕏 🦋 in