ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,用于将对象模型中的对象与关系型数据库中的表进行映射。通过 ORM,开发者可以使用面向对象的方式操作数据库,而不需要直接编写复杂的 SQL 语句。
常见的 ORM 框架包括:
本教程将以 Hibernate 和 JPA 为例,带您快速入门 Java ORM。
在 pom.xml
中添加以下依赖(以 Hibernate 和 H2 数据库为例):
<dependencies>
<!-- Hibernate 核心依赖 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.2.0.Final</version>
</dependency>
<!-- JPA API -->
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>3.1.0</version>
</dependency>
<!-- H2 内存数据库 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.1.214</version>
</dependency>
</dependencies>
实体类是 ORM 的核心,它对应数据库中的一张表。
User
实体类import jakarta.persistence.*;
@Entity // 标记为实体类
@Table(name = "users") // 映射到数据库中的表名
public class User {
@Id // 主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自增主键
private Long id;
@Column(name = "username", nullable = false, unique = true)
private String username;
@Column(name = "email", nullable = false)
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;
}
}
在 src/main/resources
目录下创建 hibernate.cfg.xml
文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据库连接配置 -->
<property name="hibernate.connection.driver_class">org.h2.Driver</property>
<property name="hibernate.connection.url">jdbc:h2:mem:testdb</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
<!-- SQL 方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
<!-- 自动创建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 显示生成的 SQL -->
<property name="hibernate.show_sql">true</property>
<!-- 注册实体类 -->
<mapping class="com.example.User"/>
</session-factory>
</hibernate-configuration>
创建一个工具类来初始化 Hibernate 的 SessionFactory
:
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
return new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void shutdown() {
getSessionFactory().close();
}
}
import org.hibernate.Session;
import org.hibernate.Transaction;
public class Main {
public static void main(String[] args) {
// 获取 Session
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
// 创建用户对象
User user = new User();
user.setUsername("john_doe");
user.setEmail("john@example.com");
// 保存到数据库
session.persist(user);
transaction.commit();
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
e.printStackTrace();
} finally {
session.close();
}
}
}
import org.hibernate.Session;
public class Main {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().openSession();
try {
// 根据 ID 查询用户
User user = session.get(User.class, 1L);
System.out.println("User: " + user.getUsername() + ", Email: " + user.getEmail());
} finally {
session.close();
}
}
}
import org.hibernate.Session;
import org.hibernate.Transaction;
public class Main {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
// 获取用户
User user = session.get(User.class, 1L);
user.setEmail("new_email@example.com");
// 更新用户
session.merge(user);
transaction.commit();
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
e.printStackTrace();
} finally {
session.close();
}
}
}
import org.hibernate.Session;
import org.hibernate.Transaction;
public class Main {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
// 获取用户
User user = session.get(User.class, 1L);
// 删除用户
session.remove(user);
transaction.commit();
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
e.printStackTrace();
} finally {
session.close();
}
}
}
通过本教程,我们学习了如何使用 Hibernate 和 JPA 进行 ORM 开发,包括:
SessionFactory
。ORM 的优势在于简化了数据库操作,但需要注意的是,复杂查询可能需要结合原生 SQL 或使用 JPQL(Java Persistence Query Language)。
如果您有更多问题,请随时提问!