前言:谈起操作数据库,大致可以分为几个阶段:首先是 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 }

附一张表说明:

JPA + SpringData 操作数据库--Helloworld实例的更多相关文章

  1. JPA + SpringData 操作数据库原来可以这么简单 ---- 深入了解 JPA - 2

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7704914.html ------------------------------------ ...

  2. JPA + SpringData 操作数据库 ---- 深入了解 SpringData

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7735616.html ------------------------------------ ...

  3. JPA + SpringData 操作数据库原来可以这么简单 ---- 深入了解 JPA - 1

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7703679.html ------------------------------------ ...

  4. JPA + SpringData 操作数据库原来可以这么简单 ---- 深入了解 JPA - 3

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7718741.html ------------------------------------ ...

  5. QT 操作数据库SQLite实例

    #include "widget.h" #include <QApplication> #include <QtSql> #include <QTex ...

  6. (转)JPA + SpringData

    jpa + spring data 约定优于配置 convention over configuration http://www.cnblogs.com/crawl/p/7703679.html 原 ...

  7. SQLite的介绍 操作Sqlite 具体实例

    1.SQLite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入  式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能 ...

  8. Spring_boot简单操作数据库

    Spring_boot搭配Spring Data JPA简单操作数据库 spring boot 配置文件可以使用yml文件,默认spring boot 会加载resources目录的下的applica ...

  9. VC++下使用ADO操作数据库

    VC++下使用ADO操作数据库主要要用到 _ConnectionPtr,_CommandPtr,_RecordsetPtr三个ADO对象指针,我查找了相关资料,发现网上源码很多,但是都相对凌乱,于是自 ...

随机推荐

  1. SSH应用实战——安全防护(fail2ban)

    ssh 安全配置 端口 ssh随机端口范围在 27000-30000,可以手动修改也要改在这个范围内,建议定时修改端口. 密码 登陆密码应包含大小写.数字.特殊字符等 10 位以上,建议定期修改密码. ...

  2. 基于vue 、vue-router 、firebase的todolist小项目

    第一次写博客,都不知道改怎么写的好. 本着一颗学习的心,也希望一段时间后再回来在看看自己写的代码,会不会让自己有种不忍直视的念头 *-* 还是先上图吧~ 这是首页,主要是展示所有的列表页面,可以通过输 ...

  3. 本地连接属性:Internet协议版本4(TCP/IPv4)打开闪退解决办法

    1.命令窗口配置网络连接指定IP netsh interface ip set address "本地连接" static IP地址 子网掩码 默认网关 例:netsh inter ...

  4. CF Manthan, Codefest 16 B. A Trivial Problem

    数学技巧真有趣,看出规律就很简单了 wa 题意:给出数k  输出所有阶乘尾数有k个0的数 这题来来回回看了两三遍, 想的方法总觉得会T 后来想想  阶乘 emmm  1*2*3*4*5*6*7*8*9 ...

  5. roc曲线和auc

    只是为了复习一下,在评价分类器的性能好坏时,通常用recall和precision, PS:CNN做图像分类还是用了loss 和 accuracy 使用ROC的目的在于更好的(直观+量化)评价分类模型 ...

  6. Redis缓存之自定义CacheManager

    测试缓存:原理:CacheManager===Cache 缓存组件来实际给缓存中存储数据1,引入redis的starter,容器中保存的是RedisCacheManager2,RedisCacheMa ...

  7. jmockit mock 类的static 属性

    final Object[] originValue = new Object[1];try{ new Expectations(XXStatic.class){ { originValue[0] = ...

  8. 【sock_stream和sock_dgram】、 【AF_INET和AF_UNIX】

    [sock_stream和sock_dgram] 1.sock_stream 是有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料(如文件)传送. 2.sock_dgram 是无 ...

  9. unity项目build成webgl时选择生成目录(解决方法)

    在unity里点击File>>Build Settings...>>勾选你要生成的Scenes>>选择webgl>>后面Development Buil ...

  10. 小程序md5加密

    function md5(string) { var x = Array(); var k, AA, BB, CC, DD, a, b, c, d; , S12 = , S13 = , S14 = ; ...