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

----------------------------------------------------------------------------------------------------------------------------------------------------------

笔记中提供了大量的代码示例,需要说明的是,大部分代码示例都是本人所敲代码并进行测试,不足之处,请大家指正~

本博客中所有言论仅代表博主本人观点,若有疑惑或者需要本系列分享中的资料工具,敬请联系 qingqing_crawl@163.com

-----------------------------------------------------------------------------------------------------------------------------------------------------------

前言:谈起操作数据库,大致可以分为几个阶段:首先是 JDBC 阶段,初学 JDBC 可能会使用原生的 JDBC 的 API,再然后可能会使用数据库连接池,比如:c3p0、dbcp,还有一些第三方工具,比如 dbutils 等,楼主认为 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> 节点上面,否则会出小红×):

 <?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL"> <!-- 使用什么 ORM 产品作为 JPA 的实现 -->
<provider>org.hibernate.ejb.HibernatePersistence</provider> <properties>
<!-- 数据库连接的基本信息 -->
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa2" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="qiqingqing" />
<!-- 配置 JPA 实现产品的基本属性,即 Hibernate 的基本属性 -->
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties> </persistence-unit>
</persistence>

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

 package com.software.jpa.helloworld;

 import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table; @Table(name="JPA_CUSTOMERS")
@Entity
public class Customer { private Integer id; private String lastName; private String email; private Integer age; @GeneratedValue(strategy=GenerationType.AUTO)
@Id
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} @Column(name="LAST_NAME")
public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} @Override
public String toString() {
return "Customer [id=" + id + ", lastName=" + lastName + ", email=" + email + ", age=" + age + "]";
} }
 <?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL"> <!-- 使用什么 ORM 产品作为 JPA 的实现 -->
<provider>org.hibernate.ejb.HibernatePersistence</provider> <!-- 添加持久化类 -->
<class>com.software.jpa.helloworld.Customer</class> <properties>
<!-- 数据库连接的基本信息 -->
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa2" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="qiqingqing" />
<!-- 配置 JPA 实现产品的基本属性,即 Hibernate 的基本属性 -->
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties> </persistence-unit>
</persistence>

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

 package com.software.jpa.helloworld;

 import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence; public class Main { public static void main(String[] args) { //1.创建 EntityManagerFactory
String persistenceUnitName = "jpa";
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName); //2.创建 EntityManager
EntityManager entityManager = entityManagerFactory.createEntityManager(); //4.开启事务
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin(); //5.进行持久化操作
Customer customer = new Customer();
customer.setLastName("AA");
customer.setEmail("aa@163.com");
customer.setAge(20); entityManager.persist(customer); //6.提交事务
transaction.commit(); //7.关闭 EntityManager
entityManager.close(); //8.关闭 EntityManagerFactory
entityManagerFactory.close(); } }

三、JPA 的基本注解

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

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

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

 @Table(name = "JPA_CUSTOMER")
2 @Entity
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 主键生成策略

    //使用 TABLE 主键生成策略
@TableGenerator(name="ID_GENERATOR", //该主键生成策略的名称,与 @GeneratedValue 的 generator 属性值对应
table="jpa_id_generators", // 指明根据哪个表生成主键
pkColumnName="PK_NAME", // 使用 pkColumnName pkColumnValue valueColumnName 三个属性唯一的定位一个点
pkColumnValue="CUSTOMER_ID",
valueColumnName="PK_VALUE",
allocationSize=100) //指定每次增加的数量
@GeneratedValue(strategy=GenerationType.TABLE, generator="ID_GENERATOR")
@Id
public Integer getId() {
return id;
}

附一张表说明:

这一篇先介绍到这儿,内容很详细,大家可以根据此篇一步步的进行测试,如有问题或想交流请邮箱联系:qingqing_crawl@163.com 或 QQ:1656746302

----------------------------------------------------------------------------------------------------------------

相关链接:

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

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

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

手把手教你解决无法创建 JPA 工程的问题

JPA + SpringData 操作数据库原来可以这么简单 ---- 深入了解 JPA - 1的更多相关文章

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

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

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

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

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

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

  4. JPA + SpringData 操作数据库--Helloworld实例

    前言:谈起操作数据库,大致可以分为几个阶段:首先是 JDBC 阶段,初学 JDBC 可能会使用原生的 JDBC 的 API,再然后可能会使用数据库连接池,比如:c3p0.dbcp,还有一些第三方工具, ...

  5. 封装类似thinkphp连贯操作数据库的Db类(简单版)。

    <?php header("Content-Type:text/html;charset=utf-8"); /** *php操作mysql的工具类 */ class Db{ ...

  6. (转)JPA + SpringData

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

  7. JDBC操作数据库的三种方式比较

    JDBC(java Database Connectivity)java数据库连接,是一种用于执行上sql语句的javaAPI,可以为多种关系型数据库提供统一访问接口.我们项目中经常用到的MySQL. ...

  8. 用SpringBoot+MySql+JPA实现对数据库的增删改查和分页

    使用SpringBoot+Mysql+JPA实现对数据库的增删改查和分页      JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述 ...

  9. Spring_boot简单操作数据库

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

随机推荐

  1. 201521123005 《Java程序设计》 第十四周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 Q1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现 ...

  2. 201521123068《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  3. 201521123030 《Java程序设计》 第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 常用异常 1.题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...

  4. MUI如何调取相册的方法

    第一种是HTML方法 <label> <input style="opacity: 0;" type="file" accept=" ...

  5. java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector

    在使用C3P0连接池的时候,发现了这个错误-.原来要使用C3P0的使用,不仅仅要导入c3p0-0.9.2-pre1.jar这个jar包,还要导入mchange-commons-0.2.jar这个jar ...

  6. Routing in ASP.NET Core

    .NET-Core Series Server in ASP.NET-Core DI in ASP.NET-Core Routing in ASP.NET-Core Error Handling in ...

  7. Git的使用详解

    起步 关于版本控制 Git 简史 Git 基础 安装 Git 初次运行 Git 前的配置 获取帮助 小结 Git 基础 取得项目的 Git 仓库 记录每次更新到仓库 查看提交历史 撤消操作 远程仓库的 ...

  8. java初学者(新手)应该如何选择学习教材与网站

    作者:天天向上 1.学习教材选择推荐<JAVA核心技术>,想多看点代码多练习可以找<java开发实战经典>&amp;amp;lt;img src="https ...

  9. 解决外部编辑器修改Eclipse文件延迟刷新【补充】

    在之前的文章,使用gulp解决外部编辑器修改Eclipse文件延迟刷新,原理是用gulp把更改过的项目文件直接复制一份到Tomcat的webapp.root下, 现在补充另外一种方法,双击Server ...

  10. BGP协议

    BGP属于自治系统间路由协议.BGP的主要目标是为处于不同AS中的路由器之间进行路由信息通信提供保障.BGP既不是纯粹的矢量距离协议,也不是纯粹的链路状态协议,通常被称为通路向量路由协议.这是因为BG ...