大家好,我是不熬夜崽崽!大家如果覺得看了本文有幫助的話,麻煩給不熬夜崽崽點個三連(點贊、收藏、關注)支持一下哈,大家的支持就是我寫作的無限動力。

前言

在現代 Java 應用開發中,數據持久化是核心的功能之一。JPA(Java Persistence API)和 Hibernate 是最常用的 Java 持久化技術。JPA 提供了一個標準的接口,用於在 Java 應用程序中執行對象關係映射(ORM),而 Hibernate 是 JPA 的一種實現,它通過映射 Java 對象和數據庫表之間的關係,使得開發者可以方便地操作數據庫。

本文將介紹 JPA 和 Hibernate 的基本概念,如何配置和映射實體類,並展示如何使用 JPA 和 Hibernate 進行常見的 CRUD(創建、讀取、更新、刪除)操作。

1. JPA 和 Hibernate 的基本概念

1.1 JPA(Java Persistence API)

JPA 是 Java EE 中的一個標準,定義了一種管理 Java 類與關係型數據庫表之間映射關係的方法。JPA 並不提供具體的實現,而是依賴於第三方框架(如 Hibernate)來實現。JPA 主要包括以下核心部分:

  • 實體類(Entity Class):與數據庫中的表相對應的 Java 類。
  • 持久化上下文(Persistence Context):由 EntityManager 管理,它代表了一個持久化的實體對象集合。
  • 查詢語言(JPQL):Java 持久化查詢語言,用於操作實體對象。

1.2 Hibernate

Hibernate 是一個 ORM 框架,提供了 JPA 的實現,它將 Java 類與數據庫表之間的映射關係抽象化,使得開發者可以通過操作 Java 對象來實現對數據庫的訪問,避免了複雜的 JDBC 操作。

1.3 JPA 與 Hibernate 的關係

  • JPA 是 Java 官方提供的標準接口,定義了 ORM 的規範,提供了一組 API,用於執行常見的數據庫操作。
  • Hibernate 是 JPA 的一個常見實現,提供了額外的功能和優化。Hibernate 實現了 JPA 接口,並且支持 JPA 所定義的所有功能。

2. 配置和映射實體類

2.1 使用 JPA 配置實體類並進行映射

在 JPA 中,我們通常通過註解來標註實體類,以指定它們與數據庫表的映射關係。以下是如何使用 JPA 配置實體類並映射到數據庫表的步驟。

2.1.1 配置 persistence.xml

首先,在 META-INF 目錄下創建一個 persistence.xml 文件,配置數據庫連接和 JPA 實現(如 Hibernate)。

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
                                 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
    <persistence-unit name="myJpaUnit">
        <!-- 配置數據庫連接 -->
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/mydb"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="password"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.show_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

2.1.2 定義實體類(Entity Class)

在 JPA 中,實體類是與數據庫表映射的 Java 類。使用 @Entity 註解來標註該類為實體類,使用 @Id 註解標識主鍵字段,使用 @GeneratedValue 註解自動生成主鍵。

import javax.persistence.*;

@Entity
public class Person {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // 自動生成主鍵
    private Long id;

    private String name;

    private int age;

    // 省略構造函數、getter 和 setter

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

在上面的代碼中,Person 類是一個實體類,它與數據庫中的 person 表進行映射。

3. 持久化操作

3.1 使用 EntityManager 和 Session 進行 CRUD 操作

3.1.1 使用 EntityManager 進行數據持久化操作

EntityManager 是 JPA 的核心接口,它用於執行 CRUD 操作並管理實體類的生命週期。

  • 持久化(Persist):將一個新的對象保存到數據庫中。
  • 查找(Find):根據主鍵從數據庫中查找實體對象。
  • 合併(Merge):更新一個已經存在的實體對象。
  • 刪除(Remove):從數據庫中刪除實體對象。

示例 1:使用 EntityManager 進行 CRUD 操作

import javax.persistence.*;

public class PersonService {

    private EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJpaUnit");
    private EntityManager em = emf.createEntityManager();

    // 創建新實體並持久化
    public void createPerson(String name, int age) {
        EntityTransaction transaction = em.getTransaction();
        transaction.begin();
        Person person = new Person(name, age);
        em.persist(person);  // 持久化對象
        transaction.commit();
    }

    // 查找實體
    public Person getPerson(Long id) {
        return em.find(Person.class, id);
    }

    // 更新實體
    public void updatePerson(Long id, String name, int age) {
        EntityTransaction transaction = em.getTransaction();
        transaction.begin();
        Person person = em.find(Person.class, id);
        if (person != null) {
            person.setName(name);
            person.setAge(age);
            em.merge(person);  // 合併更新
        }
        transaction.commit();
    }

    // 刪除實體
    public void deletePerson(Long id) {
        EntityTransaction transaction = em.getTransaction();
        transaction.begin();
        Person person = em.find(Person.class, id);
        if (person != null) {
            em.remove(person);  // 刪除對象
        }
        transaction.commit();
    }
}

3.1.2 使用 Session 進行數據持久化操作(Hibernate)

Hibernate 的 Session 對象是直接操作數據庫的接口,它與 EntityManager 類似,提供了執行 CRUD 操作的功能。使用 Hibernate 時,Session 對象不僅可以執行 JPA 規範的操作,還提供了更多高級功能,如批量操作、緩存等。

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

    private static SessionFactory sessionFactory;

    static {
        sessionFactory = new Configuration().configure().addAnnotatedClass(Person.class).buildSessionFactory();
    }

    public static Session getSession() {
        return sessionFactory.getCurrentSession();
    }
}

示例 2:使用 Session 進行 CRUD 操作

public class PersonServiceHibernate {

    public void createPerson(String name, int age) {
        Session session = HibernateUtil.getSession();
        session.beginTransaction();
        Person person = new Person(name, age);
        session.save(person);  // 保存對象
        session.getTransaction().commit();
    }

    public Person getPerson(Long id) {
        Session session = HibernateUtil.getSession();
        session.beginTransaction();
        Person person = session.get(Person.class, id);
        session.getTransaction().commit();
        return person;
    }

    public void updatePerson(Long id, String name, int age) {
        Session session = HibernateUtil.getSession();
        session.beginTransaction();
        Person person = session.get(Person.class, id);
        if (person != null) {
            person.setName(name);
            person.setAge(age);
            session.update(person);  // 更新對象
        }
        session.getTransaction().commit();
    }

    public void deletePerson(Long id) {
        Session session = HibernateUtil.getSession();
        session.beginTransaction();
        Person person = session.get(Person.class, id);
        if (person != null) {
            session.delete(person);  // 刪除對象
        }
        session.getTransaction().commit();
    }
}

3.2 總結

  • JPA 提供了一個標準化的接口,允許開發者通過 EntityManager 進行數據持久化操作,它的優點是與底層 ORM 實現(如 Hibernate)解耦,便於切換不同的實現。
  • Hibernate 是 JPA 的一種實現,它提供了更多功能,如緩存、查詢優化等,並且能夠在實際項目中提供更強大的性能和功能。
  • 通過 JPA 和 Hibernate,我們可以輕鬆實現數據持久化操作,且通過 ORM 映射減少了開發人員與數據庫直接交互的複雜度。

通過上面介紹的代碼示例,你可以很容易地在 Java 應用中使用 JPA 和 Hibernate 進行數據持久化操作,實現 CRUD 功能,並且通過實體類與數據庫表之間的映射簡化了開發過程。

📝 寫在最後

如果你覺得這篇文章對你有幫助,或者有任何想法、建議,歡迎在評論區留言交流!你的每一個點贊 👍、收藏 ⭐、關注 ❤️,都是我持續更新的最大動力!

我是一個在代碼世界裏不斷摸索的小碼農,願我們都能在成長的路上越走越遠,越學越強!

感謝你的閲讀,我們下篇文章再見~👋

✍️ 作者:某個被流“治癒”過的 Java 老兵 🧵 本文原創,轉載請註明出處。