JDBC versus JPA
Replace verbose JDBC boilerplate with JPA's object-relational mapping and EntityManager.
Code Comparison
✕ 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();
}
Why the modern way wins
Object mapping
Entities are plain annotated classes — no manual ResultSet-to-object translation.
Type-safe queries
JPQL operates on entity types and fields rather than raw table and column strings.
Built-in caching
First- and second-level caches reduce database round-trips automatically.
Old Approach
JDBC
Modern Approach
JPA EntityManager
Since JDK
11
Difficulty
intermediate
JDK Support
JDBC versus JPA
Available
Widely available since Jakarta EE 8 / Java 11
How it works
JPA (Jakarta Persistence API) maps Java objects to database rows, eliminating manual ResultSet processing and SQL string concatenation. EntityManager provides find(), persist(), and JPQL queries so you work with domain objects instead of raw SQL, while the container manages connection pooling and transactions.
Related Documentation