首頁  >  文章  >  資料庫  >  透過JPA技術將Java物件持久化到MySQL資料庫中進行存儲

透過JPA技術將Java物件持久化到MySQL資料庫中進行存儲

王林
王林原創
2023-06-10 10:15:16859瀏覽

JPA (Java Persistence API) 是Java EE 5.0引入的一個ORM規範,目的是為了簡化物件和關聯式資料庫的映射,幫助Java開發者更輕鬆的將Java物件持久化到關聯式資料庫中。 JPA透過抽象資料的概念,將Java物件和關聯式資料庫之間的映射隱藏起來,開發者可以專注於編寫業務程式碼,而不需要關注資料的儲存細節。

在本篇文章中,我們將介紹如何使用JPA技術將Java物件持久化到MySQL資料庫中進行儲存。

首先,我們需要先定義一個資料模型,例如一個簡單的學生類別。

@Entity
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private Integer age;

    // 省略构造函数、getter和setter方法
}

上述程式碼中,我們使用了JPA的註解來定義一個實體類,其中@Entity註解用於標註這個類別是一個JPA實體類,@Id註解表示該欄位為主鍵,@GeneratedValue註解表示此欄位為自動產生的主鍵,@Column註解用於指定該欄位對應的資料庫列資訊。

接下來,在我們的專案中需要使用JPA提供的EntityManager實例來進行實體類別的操作。在使用JPA前,我們需要先在設定檔中指定資料來源和JPA相關的設定資訊。

<?xml version="1.0" encoding="UTF-8"?>
<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="myPU" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>com.example.Student</class>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="password"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
    </persistence-unit>
</persistence>

上述設定檔中,我們使用的是Hibernate提供的實現,並指定了我們的資料來源和JPA相關的設定資訊。

然後,在我們的Java程式碼中,透過EntityManager實例來進行實體類別的操作。

public class StudentManager {

    private EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPU");

    public void save(Student student) {
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        try {
            tx.begin();
            em.persist(student);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }
    }

    public Student getById(Long id) {
        EntityManager em = emf.createEntityManager();
        try {
            return em.find(Student.class, id);
        } finally {
            em.close();
        }
    }

    public List<Student> getAll() {
        EntityManager em = emf.createEntityManager();
        try {
            CriteriaBuilder cb = em.getCriteriaBuilder();
            CriteriaQuery<Student> cq = cb.createQuery(Student.class);
            Root<Student> rootEntry = cq.from(Student.class);
            CriteriaQuery<Student> all = cq.select(rootEntry);
            TypedQuery<Student> allQuery = em.createQuery(all);
            return allQuery.getResultList();
        } finally {
            em.close();
        }
    }

    public void update(Student student) {
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        try {
            tx.begin();
            em.merge(student);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }
    }

    public void deleteById(Long id) {
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        try {
            tx.begin();
            Student student = em.find(Student.class, id);
            em.remove(student);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }
    }
}

在上述程式碼中,我們建立了一個StudentManager類別來進行實體類別的操作,其中透過EntityManagerFactory實例建立了EntityManager實例,並透過操作該實例來實現實體類別的C(R)UD操作。

最後,我們可以透過如下的程式碼來測試我們的程式碼:

public static void main(String[] args) {
    StudentManager studentManager = new StudentManager();
    Student s1 = new Student("Tom", 18);
    studentManager.save(s1);

    Student s2 = studentManager.getById(1L);
    System.out.println(s2.getName()); // 输出:Tom

    List<Student> students = studentManager.getAll();
    System.out.println(students.size()); // 输出:1

    s2.setName("Jerry");
    studentManager.update(s2);
    s2 = studentManager.getById(1L);
    System.out.println(s2.getName()); // 输出:Jerry

    studentManager.deleteById(1L);
    students = studentManager.getAll();
    System.out.println(students.size()); // 输出:0
}

透過上述程式碼,我們可以看到JPA在持久化Java物件時確實提供了非常方便和易用的接口。開發者只需要透過簡單的註解來定義實體類,配置資料來源和JPA訊息,就能夠直接將Java物件持久化到關聯式資料庫中進行儲存。這大大降低了開發者的編碼量,提高了開發效率,也避免了可能因為手寫SQL語句所帶來的安全隱患。

以上是透過JPA技術將Java物件持久化到MySQL資料庫中進行存儲的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn