Zastąp surowy JDBC oparty na ciągach SQL typowo-bezpiecznym, płynnym DSL SQL jOOQ.
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;
}
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);
Typowo-bezpieczne kolumny
Nazwy kolumn to generowane stałe Java — literówki i niezgodności typów stają się błędami kompilatora zamiast awarii w środowisku uruchomieniowym.
Płynność SQL
DSL jOOQ ściśle odzwierciedla składnię SQL, więc złożone JOIN-y, podzapytania i CTE pozostają czytelne.
Bezpieczny przed injection z założenia
Parametry są zawsze wiązane bezpiecznie — bez konkatenacji ciągów, bez ryzyka SQL injection.
Wersja open-source jOOQ obsługuje wszystkie główne bazy open-source; starsze komercyjne bazy wymagają płatnej licencji
jOOQ (Java Object Oriented Querying) generuje kod Java ze schematu bazy danych, zamieniając nazwy tabel i kolumn w typowo-bezpieczne stałe Java. Płynny DSL odzwierciedla składnię SQL, więc zapytania są czytelne i kompozycyjne. Wszystkie parametry są wiązane automatycznie, eliminując ryzyko SQL injection. W przeciwieństwie do JPA/JPQL, jOOQ w pełni przyjmuje SQL — funkcje okienkowe, CTE, klauzule RETURNING i rozszerzenia specyficzne dla dostawcy są w nim pierwszoklasowe.