第十五章 Spring Data JPA
阿新 • • 發佈:2018-12-15
Java Persistence API是JDK5.0註解或 XML 描述物件——關係表的對映關係,並且將執行期的實體物件持久化到資料庫中
JPA
1. jpa專案搭建:引入相關,依賴jar包
2. 建立持久化實體
package com.entity; import java.util.Date; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; // 宣告對映資料庫表,name用於指定資料表名與實體類不同之間的關係對映 @Table() // 宣告實體類,對映到指定的資料庫表 @Entity public class Student { /* * 實體類屬性對映註解 通常置於屬性宣告語句之前, 也可置於屬性的getter方法之前 */ private Integer stuno; private String name; private int age; private String addr; private Date start; private Date bir; private String school; public Student() { super(); } public Student(Integer stuno, String name, int age, String addr, Date start, Date bir, String school) { super(); this.stuno = stuno; this.name = name; this.age = age; this.addr = addr; this.start = start; this.bir = bir; this.school = school; } // 宣告實體類的屬性對映為資料庫的主鍵列 @Id // 宣告該對映欄位在資料庫中自增 @GeneratedValue(strategy = GenerationType.AUTO) public Integer getStuno() { return stuno; } public void setStuno(Integer stuno) { this.stuno = stuno; } // 實體的屬性與其對映的資料庫表的列不同名,用於設定對映資料庫表的列名 @Column(name = "sname") public String getName() { return name; } public void setName(String name) { this.name = name; } // 表示一個簡單的屬性到資料庫表的欄位的對映 @Basic public int getAge() { return age; } public void setAge(int age) { this.age = age; } // 不寫註解預設為@Basic public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } // 進行日期對映時,設定日期精度從年到秒 @Temporal(TemporalType.TIMESTAMP) public Date getStart() { return start; } public void setStart(Date start) { this.start = start; } // 進行日期對映時,設定日期精度從年到日 @Temporal(TemporalType.DATE) public Date getBir() { return bir; } public void setBir(Date bir) { this.bir = bir; } // 表示該屬性並非一個到資料庫表的欄位的對映,ORM框架將忽略該屬性. @Transient public String getSchool() { return school; } public void setSchool(String school) { this.school = school; } @Override public String toString() { return "Student [stuno=" + stuno + ", name=" + name + ", age=" + age + ", addr=" + addr + ", start=" + start + ", bir=" + bir + ", school=" + school + "]"; } }
3. 配置持久化檔案: JPA 規範要求在類路徑的 META-INF 目錄下放置persistence.xml,檔案的名稱是固定的
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" 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"> <!-- 宣告本地事務--> <persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL"> <!-- 配置jpa的具體實現產品,如只有一個,可預設不配置 --> <provider>org.hibernate.ejb.HibernatePersistence</provider> <!-- 配置持久化類 --> <class>com.entity.Student</class> <!-- 配置資料庫連線資訊 --> <properties> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="javax.persistence.jdbc.url" value="jdbc:mysql:///mydb"/> <property name="javax.persistence.jdbc.user" value="root"/> <property name="javax.persistence.jdbc.password" value=""/> <!-- JPA實現產品的基本屬性. 配置 hibernate基本屬性 --> <!-- 配置是否格式化sql語句 --> <property name="hibernate.format_sql" value="true"/> <!-- 配置控制檯是否列印sql語句 --> <property name="hibernate.show_sql" value="true"/> <!-- 配置是否自動更新建立表 --> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit> </persistence>
4. 操作JPA
package com.test; import java.util.Date; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import com.entity.Student; public class Test { public static void main(String[] args) { // 1. 建立工廠-載入配置檔案事務 EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa"); // 2. 建立EntityManager核心 EntityManager em = emf.createEntityManager(); // 3. 獲取事務,並開啟事務 EntityTransaction et = em.getTransaction(); et.begin(); // CRUD操作 // 增加資料 Student stu = new Student(null, "Micro", 21, "NewYork", new Date(), new Date(), null); em.persist(stu); /* * 查詢 * find: 直接查詢資料,沒有查詢到資料返回null * getReference:在進行使用的時候才會進行查詢,沒有查詢到資料直接丟擲異常 */ stu = em.find(Student.class, 1); System.out.println(stu); em.getReference(Student.class, 1); System.out.println(stu); // 修改:如沒有要修改的記錄,會進行新增記錄 stu.setAge(22); em.merge(stu); // 刪除:指定全記錄 em.remove(stu); // 提交事務 et.commit(); // 關閉 em.close(); emf.close(); } }