JPA 简介
1.jpa是一个开发规范 是一个ORM框架的开发规范 是SUN公司定义的 中文名:JAVA持久层API
orm:对象关系映射 是一个解决问题的思路 对对象的操作就是对数据库操作
orm介绍:
2.jpa的优势:标准化 容器级特性的支持 简单方便 操作简单 支持继承 支持堕胎
3.jap的供应商:
Hibernate 3.2 开始兼容JPA
OpenJPA 是Apach组织提供的一个开源项目
TopLink WEBGain公司的产品-》被Oracle 收购 可以和任何数据连接
Spring data JPA 简介
Spring Data JPA 框架主要是针对Spring唯一没有简化到的业务逻辑代码 开发者连仅实现持久层业务逻辑的工作省了,唯一要做的就是声明持久层的接口 其他的都交给Spring Data JPA 来完成
Spring data JPA 和jpa 以及ORM之间的关系
Spring data JPA 快速入门
1需求
向客户中插入一条数据
如果使用Jpa框架可以不用先建表 可以使用框架生成表
2 实现步骤
a 创建工程 使用maven管理工程
1 <properties> 2 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 3 <project.hibernate.version>5.0.7.Final</project.hibernate.version> 4 <maven.compiler.source>1.8</maven.compiler.source> 5 <maven.compiler.target>1.8</maven.compiler.target> 6 </properties> 7 <dependencies> 8 <dependency> 9 <groupId>junit</groupId> 10 <artifactId>junit</artifactId> 11 <version>4.12</version> 12 </dependency> 13 <!--hibernate 对jpa的支持--> 14 <dependency> 15 <groupId>org.hibernate</groupId> 16 <artifactId>hibernate-entitymanager</artifactId> 17 <version>${project.hibernate.version}</version> 18 </dependency> 19 <dependency> 20 <groupId>org.hibernate</groupId> 21 <artifactId>hibernate-c3p0</artifactId> 22 <version>${project.hibernate.version}</version> 23 </dependency> 24 <dependency> 25 <groupId>log4j</groupId> 26 <artifactId>log4j</artifactId> 27 <version>1.2.17</version> 28 </dependency> 29 <dependency> 30 <groupId>mysql</groupId> 31 <artifactId>mysql-connector-java</artifactId> 32 <version>5.1.6</version> 33 </dependency> 34 </dependencies>
b 创键一个配置文件
配置文件的路径必须是: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 <!--配置持久化单元 在配置文件中至少有一个 4 name 持久化单元的名称 5 transaction-type 事物类型 6 RESOURCE_LOCAL 单数据库的事物 7 JTA 分布式事物 跨数据的事物 多个数据库的事物 8 --> 9 <persistence-unit name="myjpa" transaction-type="RESOURCE_LOCAL"> 10 <!--数据库连接--> 11 <properties> 12 <property name="javax.persistence.jdbc.user" value="root"/> 13 <property name="javax.persistence.jdbc.password" value="111111"/> 14 <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 15 <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/sprign_data"/> 16 <!--配置hibernate的属性--> 17 <!--是否显示sql语句--> 18 <property name="hibernate.show_sql" value="true"></property> 19 <!--sql语句是否格式化--> 20 <property name="hibernate.format_sql" value="true"/> 21 <!--是否自动创建数据库表 22 value 可选值 create update none 23 create 程序自动创建数据库表 如果表存在 先删除后创建 24 update 程序自动创建数据库表 如果表存在 不创建 25 none 不会创建 26 --> 27 <property name="hibernate.hbm2ddl.auto" value="create"/> 28 </properties> 29 </persistence-unit> 30 </persistence>
c: 创键一个Entry类 对应数据库中每个表创键一个实体类
1 package cn.yqk.jpa.entity; 2 3 import javax.persistence.*; 4 5 /** 6 * @author YANG 7 * @date 2019/8/14 10:38 8 */ 9 // 该类是jpa的实体类 10 @Entity 11 // 配置实体类和数据库表中映射关系 name 对应的表名 12 13 @Table(name="cust_customer") 14 public class Customer { 15 // 配置主键的生成策略 16 /** 17 * GeneratedValue 主键的生成方式 如果手动生成主键可以没有 18 * 如果框架生成主键 需要配置该注解 19 * GenerationType.IDENTITY 自增长 20 * GenerationType.SEQUENCE 使用序列生成主键 一般在oracle使用 21 * * GenerationType.AUTO 由框架自动选择 默认使用数据库表生成主键 不推荐 22 */ 23 @GeneratedValue(strategy = GenerationType.IDENTITY) 24 @Id 25 //配置属性和字段名之间关系 26 @Column(name="cust_id") 27 private long custId; 28 @Column(name="cust_name") 29 private String custName; 30 @Column(name="cust_source") 31 private String custSource; 32 @Column(name="cust_industry") 33 private String custIndustry; 34 @Column(name="cust_level") 35 private String custLevel; 36 @Column(name="cust_address") 37 private String custAddress; 38 @Column(name="cust_phone") 39 private String custPhone; 40 41 public long getCustId() { 42 return custId; 43 } 44 45 public void setCustId(long custId) { 46 this.custId = custId; 47 } 48 49 public String getCustNmae() { 50 return custName; 51 } 52 53 public void setCustName(String custName) { 54 this.custName = custName; 55 } 56 57 public String getCustSource() { 58 return custSource; 59 } 60 61 public void setCustSource(String custSource) { 62 this.custSource = custSource; 63 } 64 65 public String getCustIndustry() { 66 return custIndustry; 67 } 68 69 public void setCustIndustry(String custIndustry) { 70 this.custIndustry = custIndustry; 71 } 72 73 public String getCustLevel() { 74 return custLevel; 75 } 76 77 public void setCustLevel(String custLevel) { 78 this.custLevel = custLevel; 79 } 80 81 public String getCustAddress() { 82 return custAddress; 83 } 84 85 public void setCustAddress(String custAddress) { 86 this.custAddress = custAddress; 87 } 88 89 public String getCustPhone() { 90 return custPhone; 91 } 92 93 public void setCustPhone(String custPhone) { 94 this.custPhone = custPhone; 95 } 96 97 @Override 98 public String toString() { 99 return "Customer{" + 100 "custId=" + custId + 101 ", custName='" + custName + '\'' + 102 ", custSource='" + custSource + '\'' + 103 ", custIndustry='" + custIndustry + '\'' + 104 ", custLevel='" + custLevel + '\'' + 105 ", custAddress='" + custAddress + '\'' + 106 ", custPhone='" + custPhone + '\'' + 107 '}'; 108 } 109 }
d: 编写测试程序 实现数据的添加
1 创键一个EntityManagerFactory 对象 使用完关闭
2 使用工厂对象EntityManagerFactory 就是一个连接
3 开启事物
4 创键 Customer 对象
5 使用Entitymanager 对象 的persist 方法向数据库添加数据
6 事物提交
7 关闭连接
1 package cn.yqk.jpa; 2 3 import cn.yqk.jpa.entity.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 /** 12 * @author YANG 13 * @date 2019/8/14 10:52 14 */ 15 public class JpaTest { 16 @Test 17 public void firstTest(){ 18 // 1 创键一个EntityManagerFactory 对象 使用完关闭 19 EntityManagerFactory factory = Persistence.createEntityManagerFactory("myjpa"); 20 // 2 使用工厂对象EntityManagerFactory 就是一个连接 21 EntityManager entityManager = factory.createEntityManager(); 22 // 3 开启事物 23 EntityTransaction transaction = entityManager.getTransaction(); 24 transaction.begin(); 25 // 4 创键 Customer 对象 26 Customer customer = new Customer(); 27 customer.setCustName("ruirui"); 28 customer.setCustLevel("vip"); 29 customer.setCustSource("网络"); 30 customer.setCustPhone("123456"); 31 customer.setCustAddress("懒人中心"); 32 // 5 使用Entitymanager 对象 的persist 方法向数据库添加数据 33 entityManager.persist(customer); 34 // 6 事物提交 35 transaction.commit(); 36 // 7 关闭连接 37 entityManager.close(); 38 factory.close(); 39 } 40 }
1需求
向客户中插入一条数据
如果使用Jpa框架可以不用先建表 可以使用框架生成表
2 实现步骤
a 创建工程 使用maven管理工程
1 <properties> 2 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 3 <project.hibernate.version>5.0.7.Final</project.hibernate.version> 4 <maven.compiler.source>1.8</maven.compiler.source> 5 <maven.compiler.target>1.8</maven.compiler.target> 6 </properties> 7 <dependencies> 8 <dependency> 9 <groupId>junit</groupId> 10 <artifactId>junit</artifactId> 11 <version>4.12</version> 12 </dependency> 13 <!--hibernate 对jpa的支持--> 14 <dependency> 15 <groupId>org.hibernate</groupId> 16 <artifactId>hibernate-entitymanager</artifactId> 17 <version>${project.hibernate.version}</version> 18 </dependency> 19 <dependency> 20 <groupId>org.hibernate</groupId> 21 <artifactId>hibernate-c3p0</artifactId> 22 <version>${project.hibernate.version}</version> 23 </dependency> 24 <dependency> 25 <groupId>log4j</groupId> 26 <artifactId>log4j</artifactId> 27 <version>1.2.17</version> 28 </dependency> 29 <dependency> 30 <groupId>mysql</groupId> 31 <artifactId>mysql-connector-java</artifactId> 32 <version>5.1.6</version> 33 </dependency> 34 </dependencies>
b 创键一个配置文件
配置文件的路径必须是: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 <!--配置持久化单元 在配置文件中至少有一个 4 name 持久化单元的名称 5 transaction-type 事物类型 6 RESOURCE_LOCAL 单数据库的事物 7 JTA 分布式事物 跨数据的事物 多个数据库的事物 8 --> 9 <persistence-unit name="myjpa" transaction-type="RESOURCE_LOCAL"> 10 <!--数据库连接--> 11 <properties> 12 <property name="javax.persistence.jdbc.user" value="root"/> 13 <property name="javax.persistence.jdbc.password" value="111111"/> 14 <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 15 <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/sprign_data"/> 16 <!--配置hibernate的属性--> 17 <!--是否显示sql语句--> 18 <property name="hibernate.show_sql" value="true"></property> 19 <!--sql语句是否格式化--> 20 <property name="hibernate.format_sql" value="true"/> 21 <!--是否自动创建数据库表 22 value 可选值 create update none 23 create 程序自动创建数据库表 如果表存在 先删除后创建 24 update 程序自动创建数据库表 如果表存在 不创建 25 none 不会创建 26 --> 27 <property name="hibernate.hbm2ddl.auto" value="create"/> 28 </properties> 29 </persistence-unit> 30 </persistence>
c: 创键一个Entry类 对应数据库中每个表创键一个实体类
1 package cn.yqk.jpa.entity; 2 3 import javax.persistence.*; 4 5 /** 6 * @author YANG 7 * @date 2019/8/14 10:38 8 */ 9 // 该类是jpa的实体类 10 @Entity 11 // 配置实体类和数据库表中映射关系 name 对应的表名 12 13 @Table(name="cust_customer") 14 public class Customer { 15 // 配置主键的生成策略 16 /** 17 * GeneratedValue 主键的生成方式 如果手动生成主键可以没有 18 * 如果框架生成主键 需要配置该注解 19 * GenerationType.IDENTITY 自增长 20 * GenerationType.SEQUENCE 使用序列生成主键 一般在oracle使用 21 * * GenerationType.AUTO 由框架自动选择 默认使用数据库表生成主键 不推荐 22 */ 23 @GeneratedValue(strategy = GenerationType.IDENTITY) 24 @Id 25 //配置属性和字段名之间关系 26 @Column(name="cust_id") 27 private long custId; 28 @Column(name="cust_name") 29 private String custName; 30 @Column(name="cust_source") 31 private String custSource; 32 @Column(name="cust_industry") 33 private String custIndustry; 34 @Column(name="cust_level") 35 private String custLevel; 36 @Column(name="cust_address") 37 private String custAddress; 38 @Column(name="cust_phone") 39 private String custPhone; 40 41 public long getCustId() { 42 return custId; 43 } 44 45 public void setCustId(long custId) { 46 this.custId = custId; 47 } 48 49 public String getCustNmae() { 50 return custName; 51 } 52 53 public void setCustName(String custName) { 54 this.custName = custName; 55 } 56 57 public String getCustSource() { 58 return custSource; 59 } 60 61 public void setCustSource(String custSource) { 62 this.custSource = custSource; 63 } 64 65 public String getCustIndustry() { 66 return custIndustry; 67 } 68 69 public void setCustIndustry(String custIndustry) { 70 this.custIndustry = custIndustry; 71 } 72 73 public String getCustLevel() { 74 return custLevel; 75 } 76 77 public void setCustLevel(String custLevel) { 78 this.custLevel = custLevel; 79 } 80 81 public String getCustAddress() { 82 return custAddress; 83 } 84 85 public void setCustAddress(String custAddress) { 86 this.custAddress = custAddress; 87 } 88 89 public String getCustPhone() { 90 return custPhone; 91 } 92 93 public void setCustPhone(String custPhone) { 94 this.custPhone = custPhone; 95 } 96 97 @Override 98 public String toString() { 99 return "Customer{" + 100 "custId=" + custId + 101 ", custName='" + custName + '\'' + 102 ", custSource='" + custSource + '\'' + 103 ", custIndustry='" + custIndustry + '\'' + 104 ", custLevel='" + custLevel + '\'' + 105 ", custAddress='" + custAddress + '\'' + 106 ", custPhone='" + custPhone + '\'' + 107 '}'; 108 } 109 }
d: 编写测试程序 实现数据的添加
1 创键一个EntityManagerFactory 对象 使用完关闭
2 使用工厂对象EntityManagerFactory 就是一个连接
3 开启事物
4 创键 Customer 对象
5 使用Entitymanager 对象 的persist 方法向数据库添加数据
6 事物提交
7 关闭连接
1 package cn.yqk.jpa; 2 3 import cn.yqk.jpa.entity.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 /** 12 * @author YANG 13 * @date 2019/8/14 10:52 14 */ 15 public class JpaTest { 16 @Test 17 public void firstTest(){ 18 // 1 创键一个EntityManagerFactory 对象 使用完关闭 19 EntityManagerFactory factory = Persistence.createEntityManagerFactory("myjpa"); 20 // 2 使用工厂对象EntityManagerFactory 就是一个连接 21 EntityManager entityManager = factory.createEntityManager(); 22 // 3 开启事物 23 EntityTransaction transaction = entityManager.getTransaction(); 24 transaction.begin(); 25 // 4 创键 Customer 对象 26 Customer customer = new Customer(); 27 customer.setCustName("ruirui"); 28 customer.setCustLevel("vip"); 29 customer.setCustSource("网络"); 30 customer.setCustPhone("123456"); 31 customer.setCustAddress("懒人中心"); 32 // 5 使用Entitymanager 对象 的persist 方法向数据库添加数据 33 entityManager.persist(customer); 34 // 6 事物提交 35 transaction.commit(); 36 // 7 关闭连接 37 entityManager.close(); 38 factory.close(); 39 } 40 }