1. 程式人生 > >一步步實現:JPA的基本增刪改查CRUD(jpa基於hibernate)

一步步實現:JPA的基本增刪改查CRUD(jpa基於hibernate)

1.建立一個JPA工程

jar包說明


2.建立實體類

有關實體類中相關注解的說明

 * @Table  標註類對應的表
 * 若表名和型別相同時,省略@Table,比如類Users 和表 users;
 * 若不相同時,必須有@Table,並設定name,為該類對應的表名。@Table(name="users")
 * 
 * @Entity 標註實體
 * 
 * @Id 標註id
 * 
 * @Transient 標註該屬性不做與表的對映(原因:可能表中沒有該屬性對應的欄位)
 * 有該註解,在執行sql語句時,就不會出現該屬性,否則會有,若表中沒有該欄位則會報錯
 * 
 * @Basic 預設所有屬性都有該註解(主鍵需要單獨使用@Id),所以可以省略
 * 		    該註解可以放在屬性上,也可以放在對應的getter方法上。
 * 		     注意:要麼統一將@Basic放在屬性上,要麼統一放在對應的getter方法上。(一般都放在屬性上,可讀性比較好)
 * 
 * @Column 類中屬性名和表中對應欄位名不相同時,會使用該註解,指明在類中對應的欄位
 * 			@Column(name="對應的表中欄位名")

構建實體類Users

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
/**
 * @Table  標註類對應的表
 * 若表名和型別相同時,省略@Table,比如類Users 和表 users;
 * 若不相同時,必須有@Table,並設定name,為該類對應的表名。@Table(name="users")
 * 
 * @Entity 標註實體
 * 
 * @Id 標註id
 * 
 * @Transient 標註該屬性不做與表的對映(原因:可能表中沒有該屬性對應的欄位)
 * 有該註解,在執行sql語句時,就不會出現該屬性,否則會有,若表中沒有該欄位則會報錯
 * 
 * @Basic 預設所有屬性都有該註解(主鍵需要單獨使用@Id),所以可以省略
 * 		    該註解可以放在屬性上,也可以放在對應的getter方法上。
 * 		     注意:要麼統一將@Basic放在屬性上,要麼統一放在對應的getter方法上。(一般都放在屬性上,可讀性比較好)
 * 
 * @Column 類中屬性名和表中對應欄位名不相同時,會使用該註解,指明在類中對應的欄位
 * 			@Column(name="對應的表中欄位名")
 *
 */
@Table(name="users")
@Entity
public class Users {
	//標註id
	@Id
	private String uid;
	@Basic
	@Column(name="uname")
	private String uname;
	@Basic
	private int age;
	
	@Transient
	private String remark;//備註
	
	public String getRemark() {
		return remark;
	}
	public void setRemark(String remark) {
		this.remark = remark;
	}
	public String getUid() {
		return uid;
	}
	public void setUid(String uid) {
		this.uid = uid;
	}
	public String getUname() {
		return uname;
	}
	public void setUname(String uname) {
		this.uname = uname;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Users [uid=" + uid + ", uname=" + uname + ", age=" + age + "]";
	}
	public Users(String uid, String uname, int age) {
		super();
		this.uid = uid;
		this.uname = uname;
		this.age = age;
	}
	public Users() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	
}

3.JPA的配置檔案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 ORM產品 -->
		<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
		<!-- 新增對應的持久化類 -->
		<class>com.java.bean.Users</class>
		<properties>
			<!-- jpa中連線資料庫 -->
			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa" />
			<property name="javax.persistence.jdbc.user" value="root" />
			<property name="javax.persistence.jdbc.password" value="123"></property>
			
			<!-- jpa中配置hibernate基本屬性 -->
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
		</properties>

	</persistence-unit>
</persistence>

4.測試增刪改查CRUD

import java.util.HashMap;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

import com.java.utils.JPAUtils;

import junit.framework.TestCase;

public class TestUsers extends TestCase {

	// 插入資料 persist 相當於hibernate save方法
	public void testInsert() {
		// 1.獲得Factory
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
		// 2.獲取Manager
		EntityManager manager = factory.createEntityManager();
		// 3.獲得事務,並開啟uiwu
		EntityTransaction transaction = manager.getTransaction();
		transaction.begin();
		// 4.執行sql
		Users users = new Users("1", "小明", 18);
		manager.persist(users);
		// 5.提交事務,關閉資源
		transaction.commit();
		manager.close();
		factory.close();
	}

	/**
	 * 建立EntityManagerFactory的第二種方式 可以將如下配置放在建立factory是進行配置,使用map
	 * <property name="hibernate.show_sql" value="true" /> <property name=
	 * "hibernate.format_sql" value="true" />
	 * 
	 * 當配置檔案中和建立factory時有同一配置時,會按照建立的factory中的設定執行
	 */
	public void testInsert2() {
		// 1.獲得Factory
		Map properties = new HashMap<String, Object>();
		properties.put("hibernate.format_sql", "false");
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA", properties);
		// 2.獲取Manager
		EntityManager manager = factory.createEntityManager();
		// 3.獲得事務,並開啟uiwu
		EntityTransaction transaction = manager.getTransaction();
		transaction.begin();
		// 4.執行sql
		Users users = new Users("2", "小明2", 18);
		manager.persist(users);
		// 5.提交事務,關閉資源
		transaction.commit();
		manager.close();
		factory.close();
	}

	// 根據id查詢 find 相當於hibernate get方法
	public void testFind() {
		// 1.獲得Factory
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
		// 2.獲取Manager
		EntityManager manager = factory.createEntityManager();
		// 3.獲得事務,並開啟事務
		EntityTransaction transaction = manager.getTransaction();
		transaction.begin();
		// 4.執行sql
		Users users = manager.find(Users.class, "1");
		System.out.println(users);
		// 5.提交事務,關閉資源
		transaction.commit();
		manager.close();
		factory.close();
	}

	// 根據id查詢 getReference 相當於hibernate load方法
	// find和getReference的區別----與hibernate中get和load的區別一樣---懶載入--id沒有對應值時報異常
	public void testGet() {
		// 1.獲得Factory
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
		// 2.獲取Manager
		EntityManager manager = factory.createEntityManager();
		// 3.獲得事務,並開啟事務
		EntityTransaction transaction = manager.getTransaction();
		transaction.begin();
		// 4.執行sql
		Users users=manager.getReference(Users.class, "1"); 
		System.out.println(users);
		// 5.提交事務,關閉資源
		transaction.commit();
		manager.close();
		factory.close();
	}

	// 修改資料
	public void testUpdate() {
		// 1.獲得Factory
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
		// 2.獲取Manager
		EntityManager manager = factory.createEntityManager();
		// 3.獲得事務,並開啟事務
		EntityTransaction transaction = manager.getTransaction();
		transaction.begin();
		// 4.執行sql
		Users users=manager.find(Users.class, "1"); 
		users.setUname("哈哈哈1");
		// 5.提交事務,關閉資源
		transaction.commit();
		manager.close();
		factory.close();

	}

	// 刪除資料 remove 相當於hibernate delete方法
	// remove方法只能移除執久化物件,不能刪除遊離物件
	public void testRemove() {
		// 1.獲得Factory
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
		// 2.獲取Manager
		EntityManager manager = factory.createEntityManager();
		// 3.獲得事務,並開啟事務
		EntityTransaction transaction = manager.getTransaction();
		transaction.begin();
		// 4.執行sql
		Users users=manager.find(Users.class, "2"); manager.remove(users);
		// 5.提交事務,關閉資源
		transaction.commit();
		manager.close();
		factory.close();
	}

}