Java ORM:比较与示例
ORM(对象关系映射)是一种将 Java 面向对象模型与关系数据库连接起来的技术。它使开发人员无需编写样板 SQL 代码,并允许像处理普通 Java 对象一样处理数据。在 Java 中,最流行的三种方法是:Hibernate(完整的 ORM)、MyBatis(SQL 映射器)和 JPA(Java 标准)。在本文中,我们将通过实际示例对它们进行比较。
1. JPA(Java Persistence API)
JPA 是一种规范(标准),而不是具体的实现。最流行的实现是 Hibernate,但也有其他实现(EclipseLink、OpenJPA)。JPA 提供用于实体映射的注解,并支持 JPQL(Java 持久化查询语言)。
JPA 实体示例:
import javax.persistence.*;
@Entity@Table(name = "users")public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@Column(name = "username", nullable = false, length = 50) private String username;
@Column(name = "email") private String email;
// getters 和 setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; }}通过 EntityManager 保存的示例:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");EntityManager em = emf.createEntityManager();
em.getTransaction().begin();User user = new User();user.setUsername("ivan");user.setEmail("ivan@example.com");em.persist(user);em.getTransaction().commit();
em.close();emf.close();2. Hibernate
Hibernate 是 Java 中最成熟、功能最全面的 ORM。它完全实现了 JPA,但也有自己的扩展。Hibernate 自动生成 SQL,管理缓存,支持懒加载和级联操作。
使用 Hibernate 的映射示例(使用 JPA 注解):
import org.hibernate.annotations.Cache;import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity@Table(name = "orders")@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)public class Order { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "order_seq") @SequenceGenerator(name = "order_seq", sequenceName = "order_sequence", allocationSize = 1) private Long id;
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user;
@Column(name = "total_amount") private Double totalAmount;
// getters 和 setters}通过 Hibernate Criteria API 查询的示例:
Session session = sessionFactory.openSession();CriteriaBuilder builder = session.getCriteriaBuilder();CriteriaQuery<User> query = builder.createQuery(User.class);Root<User> root = query.from(User.class);query.select(root).where(builder.equal(root.get("username"), "ivan"));
List<User> users = session.createQuery(query).getResultList();session.close();3. MyBatis
MyBatis 不是一个完整的 ORM,而是一个 SQL 映射器。它不会自动生成 SQL,而是提供一种灵活的机制来编写自定义 SQL 查询,并将结果映射到 Java 对象。当需要完全控制 SQL 和性能时,MyBatis 是理想的选择。
XML 映射示例(UserMapper.xml):
<mapper namespace="com.example.mapper.UserMapper"> <select id="selectUser" resultType="User">\