一步步實現:JPA的基本增刪改查CRUD(jpa基於hibernate)
阿新 • • 發佈:2019-01-03
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();
}
}