首页 > Java > 什么是 ORM?

什么是 ORM?

2025-04-26 11:40:07

1. 什么是 ORM?

ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,用于将对象模型中的对象与关系型数据库中的表进行映射。通过 ORM,开发者可以使用面向对象的方式操作数据库,而不需要直接编写复杂的 SQL 语句。

常见的 ORM 框架包括:

  • Hibernate
  • JPA(Java Persistence API)
  • MyBatis
  • Spring Data JPA

本教程将以 Hibernate 和 JPA 为例,带您快速入门 Java ORM。


2. 环境准备

2.1 工具和依赖

  • JDK 8 或更高版本
  • Maven 或 Gradle 构建工具
  • 数据库(如 MySQL、PostgreSQL、H2 等)

2.2 添加依赖

在 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>

3. 创建实体类

实体类是 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;
    }
}

4. 配置 Hibernate

4.1 配置文件

在 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>

4.2 初始化 SessionFactory

创建一个工具类来初始化 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();
    }
}

5. 增删改查操作

5.1 插入数据

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();
        }
    }
}

5.2 查询数据

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();
        }
    }
}

5.3 更新数据

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();
        }
    }
}

5.4 删除数据

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();
        }
    }
}

6. 总结

 

通过本教程,我们学习了如何使用 Hibernate 和 JPA 进行 ORM 开发,包括:

  1. 创建实体类并映射到数据库表。
  2. 配置 Hibernate 和初始化 SessionFactory
  3. 执行基本的 CRUD 操作。

ORM 的优势在于简化了数据库操作,但需要注意的是,复杂查询可能需要结合原生 SQL 或使用 JPQL(Java Persistence Query Language)。

如果您有更多问题,请随时提问!

使用 Ctrl+D 可将网站添加到书签
收藏网站
扫描二维码
关注早实习微信公众号
官方公众号
Top