JPA 的全称是 Java Persistence API, 即 Java 持久化 API,是 SUN 公司推出的一套基于 ORM 的规范,
内部是由一系列的接口和抽象类构成。
ORM(Object-Relational Mapping) 表示对象关系映射.
简单的说: ORM 就是建立实体类和数据库表之间的关系,从而达到操作实体类就相当于操作数据库表的目的。
JPA 定义了独特的 JPQL(Java Persistence Query Language)它是针对实体的一种查询语言,操作对象是实体
JPA 与 hibernate
第一步:导入jar包
第二步:创建客户的数据库表和客户的实
第三步:实体类和数据库表的映射配置
* 所有的注解都是使用 JPA 的规范提供的注解,
* * 所以在导入注解包的时候,一定要导入 javax.persistence 下的
常用注解的说明
@Entity
作用:指定当前类是实体类。
@Table
作用:指定实体类和表之间的对应关系。
属性:
name:指定数据库表的名称
@Id
作用:指定当前字段是主键。
@GeneratedValue
作用:指定主键的生成方式。。
属性:
strategy :指定主键生成策略。
generator:指定引用 hibernate 中声明的主键策略
@Column
作用:指定实体类属性和数据库表之间的对应关系
属性:
name:指定数据库表的列名称。
unique:是否唯一
nullable:是否可以为空
inserttable:是否可以插入
updateable:是否可以更新
columnDefinition: 定义建表时创建此列的 DDL
secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字
第四步:配置 JPA 的核心配置文件
在 maven 工程的 resources 路径下创建一个名为 META-INF 的文件夹persistence.xml
<!--配置持久化单元
name:持久化单元名称
transaction-type:事务类型
RESOURCE_LOCAL:本地事务管理
JTA:分布式事务管理 -->
<persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
<!--配置 JPA 规范的服务提供商 -->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<!-- 数据库驱动 -->
<property name="javax.persistence.jdbc.driver"
value="com.mysql.jdbc.Driver" />
<!-- 数据库地址 -->
<property name="javax.persistence.jdbc.url"
value="jdbc:mysql://localhost:3306/ssh" />
<!-- 数据库用户名 -->
<property name="javax.persistence.jdbc.user" value="root" />
<!-- 数据库密码 -->
<property name="javax.persistence.jdbc.password" value="1234" />
<!--jpa 提供者的可选配置:我们的 JPA 规范的提供者为 hibernate,所以 jpa 的核心配
置中兼容 hibernate 的配 -->
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
JPA 的 API 介绍
Persistence 对象
作 用 是 用 于 获 取 EntityManagerFactory 对 象 的 。 通 过 调 用 该 类 的
createEntityManagerFactory 静态方法,根据配置文件中持久化单元名称创建 EntityManagerFactory
EntityManagerFactory
主要用来创建 EntityManager 实例,由于 EntityManagerFactory 是一个线程安全的对象只需要做到一个工程只存在一 个即可
EntityManager
是完成持久化操作的核心对象实体类作为普通 java 对象,只有在调用EntityManager 将其持久化后才会变成持久化对象
方法说明:
getTransaction : 获取事务对象 persist : 保存操作 merge : 更新操作 remove : 删除操作 find/getReference : 根据 id 查询 |
EntityTransaction
是完成事务操作的核心对象
begin:开启事务 commit:提交事务 rollback: 回滚事务 |
-------jpa的CRUD
----查询操作
1 按照id查询//注意id的类型
find 和 getReference
区别:
第一个:查询的时机不一样。 find 是立即加载 ,只要一调用方法,马上发起查询。getReference 是延迟加载,什么时候使用什么时候加载。
第二个:返回的结果不一样 find 返回的是实体类类型 getReference 返回的是实体类的代理对象
hibernate 中 * get 和 load 方法的区别和 jpa 中的 find 和 getReference 是一样的
2 查询所有
// 创建 query 对象
String jpql = "from Customer";
//jpql的语法表明变成实体名,字段名变成属性名,不支持*需要用别名select c from Customer c
Query query = em.createQuery(jpql);
// 查询并得到返回结果
List list = query.getResultList();
3 查询一行一列
// 1.创建 query 对象
String jpql = "select count(custId) from Customer";
Query query = em.createQuery(jpql);
// 2.查询并得到返回结果
Object count = query.getSingleResult();
4 条件查询
//创建 query 对象
String jpql = "from Customer where custName like ? ";
Query query = em.createQuery(jpql);
//对占位符赋值,从 1 开始
query.setParameter(1, "传智播客%");
//查询并得到返回结果
Object object = query.getSingleResult(); //得到唯一的结果集对象
5 分页查询
//创建 query 对象
String jpql = "from Customer";
Query query = em.createQuery(jpql);
//起始索引
query.setFirstResult(0);
//每页显示条数
query.setMaxResults(2);
//查询并得到返回结果
List list = query.getResultList(); //得到集合返回类型
6 排序查询
// 创建 query 对象
String jpql = "from Customer order by custId desc";
Query query = em.createQuery(jpql);
// 查询并得到返回结果
List list = query.getResultList(); // 得到集合返回类型
----更新操作(先查询再修改)
//执行操作
Customer c1 = em.find(Customer.class, 6L);
c1.setCustName("江苏学院");
em.clear();
//把 c1 对象从缓存中清除出去
em.merge(c1);
-----删除操作(先查询再删除)
// 执行操作
Customer c1 = em.find(Customer.class, 6L);
em.remove(c1); //此处只能传入查询的实体类对象但是hibernate没这个要求
------ JPA 中 RESOURCE_LOCAL 和 JTA 事务说明
JTA 事务(Java Transaction API)是 J2EE 规范中有关事务的标准。它是容器级别的事务,最大优势是可以支持分布式的事务
RESOURCE_LOCAL 事务数据库本地的事务。在 J2SE 环境中, 它是数据库级别的事务
-----persistence.xml配置文件
注意事项:
<property name="hibernate.hbm2ddl.auto" value="update" />
四种取值
update:只是更新数据不会更改表结构,因此如果的表结构发生了变化重新生成表
create:每次加载hibernate,如果数据库中存在表,将所有表删除,然后重新生成表
一般情况下只要用到查询会报错因为重新生成表没有数据、
createdrop:一开始数据库中有几个表,整个流程执行结束之后,还是几个表。
加载hibernate时创建,退出时删除表结构
validate:验证创建数据库表结构,这样 spring在加载之初,如果model层和
数据库表结构不同,就会报错,这样有助于技术运维预先发现问题