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

一、JPA 概述

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

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

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

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

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

3)Hibernate 是 JPA 的一个实现

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

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

2)JPA 的 API

3)查询语言:JPQL

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

二、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 }

三、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 }

附一张表说明:

最新文章

  1. ES6笔记系列
  2. 如何给外部引用的js文件传递参数
  3. Linux Shell 文本处理工具集锦 zz
  4. HTTP权威指南笔记-1.概述
  5. SQL Server调优系列基础篇(并行运算总结)
  6. es配置说明
  7. myeclipse打war包
  8. ASP.NET网站如何显示自己的网页图标
  9. 英语中的 姓氏/Surname
  10. 特殊字符html,css转义大全
  11. luogu P5234 [JSOI2012]越狱老虎桥
  12. [转]kafka详解
  13. 第二章&#160;向量(c)无序向量
  14. 【NIFI】 实现数据库到数据库之间数据同步
  15. ES6学习--函数剩余参数 (rest参数)
  16. LDA模型应用实践-希拉里邮件主题分类
  17. LA 6891 Money Transfers(最短路)
  18. bzoj 1588 平衡树 splay
  19. 【Seajs源码分析】3. 工具方法2
  20. 【eclipse新增系列】eclipse新安装设计编码统一

热门文章

  1. chromdriver与geckodriver和浏览器版本问题
  2. 【HNOI 2016】网络
  3. 遇到的Cocos2dx问题
  4. krpano生成全景图
  5. php接口实现拖拽排序功能
  6. DAY18 常用模块(二)
  7. 第 10 章 容器监控 - 079 - 监控利器 sysdig
  8. jquery表单提交获取数据(带toast dialog)
  9. C#流程控制语句--迭代语句(while,do....while, for , foreach)
  10. mybatis注解调用存储过程