Java ORM:Hibernate、MyBatis 和 JPA 的比较与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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">\                    

推荐