本章節咱們是實現的功能是保存一個客戶到數據庫的客戶表中。java
因爲JPA是sun公司制定的API規範,因此咱們不須要導入額外的JPA相關的jar包,只須要導入JPA的提供商的jar包。咱們選擇Hibernate做爲JPA的提供商,因此須要導入Hibernate的相關jar包。mysql
對於JPA操做,只須要從hibernate提供的資料中找到咱們須要的jar導入到工程中便可。sql
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 /*建立客戶表*/ 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 /** 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 }
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: 從表名。若是此列不建在主表上(默認建在主表),該屬性定義該列所在從表的名字搭建開發環境[重點]
在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 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 }