1. 程式人生 > >第十五章 Spring Data JPA

第十五章 Spring Data JPA

      Java Persistence APIJDK5.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();
	}
}