Enterprise intermediate

JDBC versus JPA

Replace verbose JDBC boilerplate with JPA's object-relational mapping and 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();
}
🗺️

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
JDBC versus JPA
Available

Widely available since Jakarta EE 8 / Java 11

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.

Share 𝕏 🦋 in