JDBCとJPAの比較
冗長なJDBCボイラープレートをJPAのオブジェクト関係マッピングとEntityManagerに置き換える。
コード比較
✕ Java EE
String sql = "SELECT * FROM users WHERE id = ?";
try (Connection con = dataSource.getConnection();
PreparedStatement ps =
con.prepareStatement(sql)) {
ps.setLong(1, id);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
User u = new User();
u.setId(rs.getLong("id"));
u.setName(rs.getString("name"));
}
}
✓ Jakarta EE 8+
@PersistenceContext
EntityManager em;
public User findUser(Long id) {
return em.find(User.class, id);
}
public List<User> findByName(String name) {
return em.createQuery(
"SELECT u FROM User u WHERE u.name = :name",
User.class)
.setParameter("name", name)
.getResultList();
}
このコードに問題がありますか? お知らせください。
モダンな方法が優れている理由
オブジェクトマッピング
エンティティはアノテーション付きのプレーンなJavaクラスで、ResultSetから手動でオブジェクトに変換する必要がありません。
型安全なクエリ
JPQLは生のテーブル名・カラム名文字列ではなくエンティティの型とフィールドを対象とします。
組み込みキャッシュ
第1・第2レベルキャッシュにより、データベースへのラウンドトリップが自動的に削減されます。
旧来のアプローチ
JDBC
モダンなアプローチ
JPA EntityManager
JDKバージョン
11
難易度
中級
JDKサポート
JDBCとJPAの比較
利用可能
Jakarta EE 8 / Java 11以降、広く利用可能
仕組み
JPA(Jakarta Persistence API)はJavaオブジェクトをデータベースの行にマッピングし、手動のResultSet処理やSQL文字列の連結を排除します。EntityManagerはfind()・persist()・JPQLクエリを提供し、ドメインオブジェクトとして作業できます。コネクションプールとトランザクションはコンテナが管理します。
関連ドキュメント