JPA的入門案例

1.1    需求介紹

本章節咱們是實現的功能是保存一個客戶到數據庫的客戶表中。java

1.2    開發包介紹

因爲JPA是sun公司制定的API規範,因此咱們不須要導入額外的JPA相關的jar包,只須要導入JPA的提供商的jar包。咱們選擇Hibernate做爲JPA的提供商,因此須要導入Hibernate的相關jar包。mysql

1.3    搭建開發環境[重點]

1.3.1     導入jar包

對於JPA操做,只須要從hibernate提供的資料中找到咱們須要的jar導入到工程中便可。sql

  • 傳統工程導入jar包

  

 

 

  • maven工程導入座標
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5     <modelVersion>4.0.0</modelVersion>
 6 
 7     <groupId>cn.itheima</groupId>
 8     <artifactId>jpa-test</artifactId>
 9     <version>1.0-SNAPSHOT</version>
10 
11     <properties>
12         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
13         <project.hibernate.version>5.0.7.Final</project.hibernate.version>
14     </properties>
15 
16     <dependencies>
17         <!-- junit -->
18         <dependency>
19             <groupId>junit</groupId>
20             <artifactId>junit</artifactId>
21             <version>4.12</version>
22             <scope>test</scope>
23         </dependency>
24 
25         <!-- hibernate對jpa的支持包 -->
26         <dependency>
27             <groupId>org.hibernate</groupId>
28             <artifactId>hibernate-entitymanager</artifactId>
29             <version>${project.hibernate.version}</version>
30         </dependency>
31 
32         <!-- c3p0 -->
33         <dependency>
34             <groupId>org.hibernate</groupId>
35             <artifactId>hibernate-c3p0</artifactId>
36             <version>${project.hibernate.version}</version>
37         </dependency>
38 
39         <!-- log日誌 -->
40         <dependency>
41             <groupId>log4j</groupId>
42             <artifactId>log4j</artifactId>
43             <version>1.2.17</version>
44         </dependency>
45 
46         <!-- Mysql and MariaDB -->
47         <dependency>
48             <groupId>mysql</groupId>
49             <artifactId>mysql-connector-java</artifactId>
50             <version>5.1.6</version>
51         </dependency>
52 
53         <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
54         <dependency>
55             <groupId>org.projectlombok</groupId>
56             <artifactId>lombok</artifactId>
57             <version>1.18.8</version>
58             <scope>provided</scope>
59         </dependency>
60 
61     </dependencies>
62 
63 </project>

1.3.2     建立客戶的數據庫表和客戶的實體類

  • 建立客戶的數據庫表

 

 1  /*建立客戶表*/  2  CREATE TABLE cst_customer (  3  cust_id bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客戶編號(主鍵)',  4  cust_name varchar(32) NOT NULL COMMENT '客戶名稱(公司名稱)',  5  cust_source varchar(32) DEFAULT NULL COMMENT '客戶信息來源',  6  cust_industry varchar(32) DEFAULT NULL COMMENT '客戶所屬行業',  7  cust_level varchar(32) DEFAULT NULL COMMENT '客戶級別',  8  cust_address varchar(128) DEFAULT NULL COMMENT '客戶聯繫地址',  9  cust_phone varchar(64) DEFAULT NULL COMMENT '客戶聯繫電話', 10  PRIMARY KEY (`cust_id`) 11     ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
  • 建立客戶的實體類
 1 public class Customer implements Serializable {  2     
 3     private Long custId;  4     private String custName;  5     private String custSource;  6     private String custIndustry;  7     private String custLevel;  8     private String custAddress;  9     private String custPhone; 10     
11     public Long getCustId() { 12         return custId; 13  } 14     public void setCustId(Long custId) { 15         this.custId = custId; 16  } 17     public String getCustName() { 18         return custName; 19  } 20     public void setCustName(String custName) { 21         this.custName = custName; 22  } 23     public String getCustSource() { 24         return custSource; 25  } 26     public void setCustSource(String custSource) { 27         this.custSource = custSource; 28  } 29     public String getCustIndustry() { 30         return custIndustry; 31  } 32     public void setCustIndustry(String custIndustry) { 33         this.custIndustry = custIndustry; 34  } 35     public String getCustLevel() { 36         return custLevel; 37  } 38     public void setCustLevel(String custLevel) { 39         this.custLevel = custLevel; 40  } 41     public String getCustAddress() { 42         return custAddress; 43  } 44     public void setCustAddress(String custAddress) { 45         this.custAddress = custAddress; 46  } 47     public String getCustPhone() { 48         return custPhone; 49  } 50     public void setCustPhone(String custPhone) { 51         this.custPhone = custPhone; 52  } 53 }

1.3.3     編寫實體類和數據庫表的映射配置[重點]

  • 在實體類上使用JPA註解的形式配置映射關係
 1 /**
 2 * * 全部的註解都是使用JPA的規範提供的註解,  3  * * 因此在導入註解包的時候,必定要導入javax.persistence下的  4  */
 5 @Entity //聲明實體類
 6 @Table(name="cst_customer") //創建實體類和表的映射關係
 7 public class Customer {  8     
 9     @Id//聲明當前私有屬性爲主鍵
10     @GeneratedValue(strategy=GenerationType.IDENTITY) //配置主鍵的生成策略
11     @Column(name="cust_id") //指定和表中cust_id字段的映射關係
12     private Long custId; 13     
14     @Column(name="cust_name") //指定和表中cust_name字段的映射關係
15     private String custName; 16     
17     @Column(name="cust_source")//指定和表中cust_source字段的映射關係
18     private String custSource; 19     
20     @Column(name="cust_industry")//指定和表中cust_industry字段的映射關係
21     private String custIndustry; 22     
23     @Column(name="cust_level")//指定和表中cust_level字段的映射關係
24     private String custLevel; 25     
26     @Column(name="cust_address")//指定和表中cust_address字段的映射關係
27     private String custAddress; 28     
29     @Column(name="cust_phone")//指定和表中cust_phone字段的映射關係
30     private String custPhone; 31     
32     public Long getCustId() { 33         return custId; 34  } 35     public void setCustId(Long custId) { 36         this.custId = custId; 37  } 38     public String getCustName() { 39         return custName; 40  } 41     public void setCustName(String custName) { 42         this.custName = custName; 43  } 44     public String getCustSource() { 45         return custSource; 46  } 47     public void setCustSource(String custSource) { 48         this.custSource = custSource; 49  } 50     public String getCustIndustry() { 51         return custIndustry; 52  } 53     public void setCustIndustry(String custIndustry) { 54         this.custIndustry = custIndustry; 55  } 56     public String getCustLevel() { 57         return custLevel; 58  } 59     public void setCustLevel(String custLevel) { 60         this.custLevel = custLevel; 61  } 62     public String getCustAddress() { 63         return custAddress; 64  } 65     public void setCustAddress(String custAddress) { 66         this.custAddress = custAddress; 67  } 68     public String getCustPhone() { 69         return custPhone; 70  } 71     public void setCustPhone(String custPhone) { 72         this.custPhone = custPhone; 73  } 74 }
  • 使用lombok(idea插件須要配置,還要引入jar包,最終版)
 1 package cn.itcast.domain;  2 
 3 import lombok.Getter;  4 import lombok.Setter;  5 import lombok.ToString;  6 
 7 import javax.persistence.*;  8 
 9 /**
10  * 客戶的實體類 11  * 配置映射關係 12  * 13  * 14  * 1.實體類和表的映射關係 15  * @Entity:聲明實體類 16  * @Table : 配置實體類和表的映射關係 17  * name : 配置數據庫表的名稱 18  * 2.實體類中屬性和表中字段的映射關係 19  * 20  * 21  */
22 @Entity 23 @Setter 24 @Getter 25 @ToString 26 @Table(name = "cst_customer") 27 public class Customer { 28 
29     /**
30  * @Id:聲明主鍵的配置 31  * @GeneratedValue:配置主鍵的生成策略 32  * strategy 33  * GenerationType.IDENTITY :自增,mysql 34  * * 底層數據庫必須支持自動增加(底層數據庫支持的自動增加方式,對id自增) 35  * GenerationType.SEQUENCE : 序列,oracle 36  * * 底層數據庫必須支持序列 37  * GenerationType.TABLE : jpa提供的一種機制,經過一張數據庫表的形式幫助咱們完成主鍵自增 38  * GenerationType.AUTO : 由程序自動的幫助咱們選擇主鍵生成策略 39  * @Column:配置屬性和字段的映射關係 40  * name:數據庫表中字段的名稱 41      */
42  @Id 43     @GeneratedValue(strategy = GenerationType.IDENTITY) 44     @Column(name = "cust_id") 45     private Long custId; //客戶的主鍵
46 
47     @Column(name = "cust_name") 48     private String custName;//客戶名稱
49 
50     @Column(name="cust_source") 51     private String custSource;//客戶來源
52 
53     @Column(name="cust_level") 54     private String custLevel;//客戶級別
55 
56     @Column(name="cust_industry") 57     private String custIndustry;//客戶所屬行業
58 
59     @Column(name="cust_phone") 60     private String custPhone;//客戶的聯繫方式
61 
62     @Column(name="cust_address") 63     private String custAddress;//客戶地址
64 
65 }
  • 經常使用註解的說明
 @Entity 做用:指定當前類是實體類。 @Table 做用:指定實體類和表之間的對應關係。 屬性: name:指定數據庫表的名稱 @Id 做用:指定當前字段是主鍵。 @GeneratedValue 做用:指定主鍵的生成方式。。 屬性: strategy :指定主鍵生成策略。 @Column 做用:指定實體類屬性和數據庫表之間的對應關係 屬性: name:指定數據庫表的列名稱。 unique:是否惟一 nullable:是否能夠爲空 inserttable:是否能夠插入 updateable:是否能夠更新 columnDefinition: 定義建表時建立此列的DDL secondaryTable: 從表名。若是此列不建在主表上(默認建在主表),該屬性定義該列所在從表的名字搭建開發環境[重點]

1.3.4     配置JPA的核心配置文件

在java工程的src路徑下建立一個名爲META-INF的文件夾,在此文件夾下建立一個名爲persistence.xml的配置文件數據庫

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
 3     <!--須要配置persistence-unit節點  4  持久化單元:  5  name:持久化單元名稱  6  transaction-type:事務管理的方式  7  JTA:分佈式事務管理((不一樣的表分不到不一樣的數據庫,使用分佈式事務管理))  8  RESOURCE_LOCAL:本地事務管理  9     -->
10     <persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
11         <!--jpa的實現方式 -->
12         <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
13 
14         <!--可選配置:配置jpa實現方的配置信息-->
15         <properties>
16             <!-- 數據庫信息 17  用戶名,javax.persistence.jdbc.user 18  密碼, javax.persistence.jdbc.password 19  驅動, javax.persistence.jdbc.driver 20  數據庫地址 javax.persistence.jdbc.url 21             -->
22             <property name="javax.persistence.jdbc.user" value="root"/>
23             <property name="javax.persistence.jdbc.password" value="root"/>
24             <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
25             <property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa"/>
26 
27             <!--配置jpa實現方(hibernate)的配置信息 28  顯示sql : false|true 29  自動建立數據庫表 : hibernate.hbm2ddl.auto 30  create : 程序運行時建立數據庫表(若是有表,先刪除表再建立) 31  update :程序運行時建立表(若是有表,不會建立表) 32  none :不會建立表 33 
34             -->
35             <property name="hibernate.show_sql" value="true" />
36             <property name="hibernate.hbm2ddl.auto" value="update" />
37         </properties>
38     </persistence-unit>
39 </persistence>

1.4    實現保存操做

 1 package cn.itheima.test;  2 
 3 import cn.itcast.domain.Customer;  4 import org.junit.Test;  5 
 6 import javax.persistence.EntityManager;  7 import javax.persistence.EntityManagerFactory;  8 import javax.persistence.EntityTransaction;  9 import javax.persistence.Persistence; 10 
11 public class JpaTest { 12 
13     /**
14  * 測試jpa的保存 15  * 案例:保存一個客戶到數據庫中 16  * Jpa的操做步驟 17  * 1.加載配置文件建立工廠(實體管理器工廠)對象 18  * 2.經過實體管理器工廠獲取實體管理器 19  * 3.獲取事務對象,開啓事務 20  * 4.完成增刪改查操做 21  * 5.提交事務(回滾事務) 22  * 6.釋放資源 23      */
24  @Test 25     public void testSave() { 26         //1.加載配置文件建立工廠(實體管理器工廠)對象
27         EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa"); 28         //2.經過實體管理器工廠獲取實體管理器
29         EntityManager em = factory.createEntityManager(); 30         //3.獲取事務對象,開啓事務
31         EntityTransaction tx = em.getTransaction(); //獲取事務對象
32  tx.begin(); 33         //4.完成增刪改查操做:保存一個客戶到數據庫中
34         Customer customer = new Customer(); 35         customer.setCustName("傳智播客3"); 36         customer.setCustIndustry("教育"); 37         //保存,
38         em.persist(customer); //保存操做 39         //5.提交事務
40  tx.commit(); 41         //6.釋放資源
42  em.close(); 43  factory.close(); 44 
45  } 46 }
相關文章
相關標籤/搜索