JPA + SpringData 操做数据库--Helloworld实例

前言:谈起操做数据库,大体能够分为几个阶段:首先是 JDBC 阶段,初学 JDBC 可能会使用原生的 JDBC 的 API,再而后可能会使用数据库链接池,好比:c3p0、dbcp,还有一些第三方工具,好比 dbutils 等,LZ为 JDBC 是贯穿始终的,即便到了框架部分,也会对 JDBC 进行整合,此阶段仍是本身手写 SQL 语句;下一个阶段就是 Hibernate,你们体会到了操做数据库能够不用本身手动编写 SQL,调用 Hibernate 提供的 API 便可。今天给你们介绍的是操做数据库的另外一个模块 JPA,即 Java 持久层的 API,JPA 若是与 SpringData 结合起来,会发出不同的“化学反应”,你们拭目以待~html

1、JPA 概述

1. Java Persistence API(Java 持久层 API):用于对象持久化的 APIjava

2. 做用:使得应用程序以统一的方式访问持久层mysql

3. 前言中提到了 Hibernate,那么JPA 与 Hibernate到底是什么关系呢:sql

1)JPA 是 Hibernate 的一个抽象,就像 JDBC 和 JDBC 驱动的关系数据库

2)JPA 是一种 ORM 规范,是 Hibernate 功能的一个子集 (既然 JPA 是规范,Hibernate 对 JPA 进行了扩展,那么说 JPA 是 Hibernate 的一个子集不为过)框架

3)Hibernate 是 JPA 的一个实现ide

4. JPA 包括三个方面的技术:工具

1)ORM 映射元数据,支持 XML 和 JDK 注解两种元数据的形式测试

2)JPA 的 APIui

3)查询语言:JPQL

本文也将详细介绍JPA ORM 映射元数据的注解方式和 JPA 的 API 以及 JPQL 三个方面

2、JPA 的 Helloworld

1.在 Eclipse 中建立 JPA 的工程:New ---> Project ---> JPA Project  输入工程名,选择版本为 2.0,点击 Next,

如果初次建立 JPA 的工程,可能会出错,提示必须有一个 user library,致使没法建立工厂,此问题的解决方案,LZ另开一个博客,手把手教你解决没法建立 JPA 工程的问题,你们可前去查看,在此不作赘述。

2.在当前工程下新建一个 lib 目录,用来存放各类 jar 包,此时工程的目录结构为:

导入 hibernate 的 jar 包和 jpa 的jar包,注意:须要本身手动的 Build Path:

链接数据库,不要忘记添加 MySQL 的驱动。

3. 你们会发现当咱们建立好 jpa 的工程时在 src 的 META-INF 目录下自动生成了一个 persistence.xml 文件,咱们的配置都编写在此文件中,接下来就在此文件中进行各类配置

1)打开此文件,选择左下角的 Connection 选项,修改 Transaction Type 为 Resource Local,填写下方的 Driver、Url、User、Password 信息保存后,便会在左下角最后一个 Source 选项中自动生成数据库配置的基本信息 (lZ 建立的数据库为 jpa2)

2)其余配置(你们注意一点配置 ORM 产品时,要把 <provider> 节点放到 <provider> 节点上面,不然会出小红×):

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <persistence version="2.0"
 3     xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
 5     <persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL">
 6 
 7         <!-- 使用什么 ORM 产品做为 JPA 的实现 -->
 8         <provider>org.hibernate.ejb.HibernatePersistence</provider>
 9 
10         <properties>
11             <!-- 数据库链接的基本信息 -->
12             <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
13             <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa2" />
14             <property name="javax.persistence.jdbc.user" value="root" />
15             <property name="javax.persistence.jdbc.password" value="qiqingqing" />
16             <!-- 配置 JPA 实现产品的基本属性,即 Hibernate 的基本属性 -->
17             <property name="hibernate.show_sql" value="true" />
18             <property name="hibernate.format_sql" value="true" />
19             <property name="hibernate.hbm2ddl.auto" value="update" />
20         </properties>
21 
22     </persistence-unit>
23 </persistence>
复制代码

3)建立持久化类 Customer,并为其添加 JPA 的注解,此时会有错误,缘由是没有把 Customer 类添加到 persistence.xml 文件中,添加进去便没有了错误:

复制代码
 1 package com.software.jpa.helloworld;
 2 
 3 import javax.persistence.Column;
 4 import javax.persistence.Entity;
 5 import javax.persistence.GeneratedValue;
 6 import javax.persistence.GenerationType;
 7 import javax.persistence.Id;
 8 import javax.persistence.Table;
 9 
10 @Table(name="JPA_CUSTOMERS")
11 @Entity
12 public class Customer {
13     
14     private Integer id;
15     
16     private String lastName;
17     
18     private String email;
19     
20     private Integer age;
21 
22     @GeneratedValue(strategy=GenerationType.AUTO)
23     @Id
24     public Integer getId() {
25         return id;
26     }
27 
28     public void setId(Integer id) {
29         this.id = id;
30     }
31 
32     @Column(name="LAST_NAME")
33     public String getLastName() {
34         return lastName;
35     }
36 
37     public void setLastName(String lastName) {
38         this.lastName = lastName;
39     }
40 
41     public String getEmail() {
42         return email;
43     }
44 
45     public void setEmail(String email) {
46         this.email = email;
47     }
48 
49     public Integer getAge() {
50         return age;
51     }
52 
53     public void setAge(Integer age) {
54         this.age = age;
55     }
56 
57     @Override
58     public String toString() {
59         return "Customer [id=" + id + ", lastName=" + lastName + ", email=" + email + ", age=" + age + "]";
60     }
61     
62 }
复制代码
复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <persistence version="2.0"
 3     xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
 5     <persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL">
 6 
 7         <!-- 使用什么 ORM 产品做为 JPA 的实现 -->
 8         <provider>org.hibernate.ejb.HibernatePersistence</provider>
 9 
10         <!-- 添加持久化类 -->
11         <class>com.software.jpa.helloworld.Customer</class>
12 
13         <properties>
14             <!-- 数据库链接的基本信息 -->
15             <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
16             <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa2" />
17             <property name="javax.persistence.jdbc.user" value="root" />
18             <property name="javax.persistence.jdbc.password" value="qiqingqing" />
19             <!-- 配置 JPA 实现产品的基本属性,即 Hibernate 的基本属性 -->
20             <property name="hibernate.show_sql" value="true" />
21             <property name="hibernate.format_sql" value="true" />
22             <property name="hibernate.hbm2ddl.auto" value="update" />
23         </properties>
24 
25     </persistence-unit>
26 </persistence>
复制代码

4)建立一个测试类进行测试,生成数据表,插入了数据,至此 JPA 的 Helloworld 完成。

复制代码
 1 package com.software.jpa.helloworld;
 2 
 3 import javax.persistence.EntityManager;
 4 import javax.persistence.EntityManagerFactory;
 5 import javax.persistence.EntityTransaction;
 6 import javax.persistence.Persistence;
 7 
 8 public class Main {
 9     
10     public static void main(String[] args) {
11         
12         //1.建立 EntityManagerFactory
13         String persistenceUnitName = "jpa";
14         EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName);
15         
16         //2.建立 EntityManager
17         EntityManager entityManager = entityManagerFactory.createEntityManager();
18         
19         //4.开启事务
20         EntityTransaction transaction = entityManager.getTransaction();
21         transaction.begin();
22         
23         //5.进行持久化操做
24         Customer customer = new Customer();
25         customer.setLastName("AA");
26         customer.setEmail("aa@163.com");
27         customer.setAge(20);
28         
29         entityManager.persist(customer);
30         
31         //6.提交事务
32         transaction.commit();
33         
34         //7.关闭 EntityManager
35         entityManager.close();
36         
37         //8.关闭 EntityManagerFactory
38         entityManagerFactory.close();
39         
40     }
41     
42 }
复制代码

3、JPA 的基本注解

看了 JPA 的 Helloworld 以后说一下 JPA 的基本注解

1. @Entity :修饰实体类,指明该类将映射到指定的数据表,例如:Customer 类默认的数据表名为 customer

2. @Table :当实体类与映射的数据库表名不一样名时须要使用 @Table 注解,该注解与 @Entity 注解并列使用,使用其 name 属性指明数据库的表名

 1 @Table(name = "JPA_CUSTOMER")
 2 @Entity
 3 public class Customer {

3. @Id :标识该属性为主键通常标注在该属性的 getter 方法上

4. @GeneratedValue :标注主键的生成策略,经过其 strategy 属性。一般与 @Id 注解一块儿使用。默认状况下 JPA 会自动选择一个最适合底层数据库的主键生成策略,MySQL 默认为 AUTO,经常使用策略有:

–IDENTITY:采用数据库 ID自增加的方式来自增主键字段,Oracle 不支持这种方式;

AUTO: JPA自动选择合适的策略,是默认选项;

–SEQUENCE:经过序列产生主键,经过 @SequenceGenerator 注解指定序列名,MySql 不支持这种方式

–TABLE:经过表产生主键,框架借由表模拟序列产生主键,使用该策略可使应用更易于数据库移植

5. @Basic :用于没有任何标注的 getXxx() 方法,默认即为 @Basic,因此若一个 getter 方法无任何注解,可使用 @Basic 注解,也能够不使用

6. @Column :当实体的属性与其映射的数据表的列不一样名时使用,通常用于 getter 方法上。其 name 属性用来指明此属性在数据表中对应的列名unique 属性指明是否为惟一约束nullable 属性用来指明是否能够为空,false 为不能为空length 属性指明此列的长度

 

7. @Transient :标注此注解后在建立数据表的时候将会忽略该属性  Customer 类并无 info 这个属性,因此数据库中也不该该有 info 这个字段

8. @Temporal :向数据库映射日期(Date)属性时用来调整映射的精度。Date 类型的数据有 DATE, TIME, 和 TIMESTAMP 三种精度(即单纯的日期,时间,或者二者兼备).

Birth 属性应该使用 DATE 类型(生日只具体到日便可,如:2015-10-22),而 CreateTime 应该使用 TIMESTAMP 类型(建立时间应该具体到秒,如:2017-10-11 22:39:13)

补冲:使用 TABLE 生成主键详解

1.建立一个数据表 jpa_id_generators,并添加几条数据

 

2. 配置使用 TABLE 主键生成策略

复制代码
 1    //使用 TABLE 主键生成策略
 2     @TableGenerator(name="ID_GENERATOR", //该主键生成策略的名称,与 @GeneratedValue 的 generator 属性值对应
 3     table="jpa_id_generators", // 指明根据哪一个表生成主键
 4     pkColumnName="PK_NAME", // 使用 pkColumnName pkColumnValue valueColumnName 三个属性惟一的定位一个点
 5     pkColumnValue="CUSTOMER_ID",
 6     valueColumnName="PK_VALUE",
 7     allocationSize=100) //指定每次增长的数量
 8     @GeneratedValue(strategy=GenerationType.TABLE, generator="ID_GENERATOR")
 9     @Id
10     public Integer getId() {
11         return id;
12     }
复制代码

附一张表说明:

相关文章
相关标签/搜索