一、ORM思想
定义:ORM就是建立实体类和数据库表之间的关系,从而达到操作实体类就相当于操作数据库表的目的。
常见的ORM框架:Mybatis(ibatis)、Hibernate、Jpa规范
二、Hibernate
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
三、JPA规范
Java 持久化API,是一套基于ORM的规范,内部是由一系列的接口和抽象类构成。JPA通过JDK 5.0注解描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
四、三者之间的联系
JPA是标准,事实上也是,JPA几乎都是接口,实现都是Hibernate在做,Hibernate作为JPA的提供商,Hibernate除了作为ORM框架之外,它也是一种JPA实现。如果使用JPA规范进行数据库操作,底层需要hibernate作为其实现类完成数据持久化工作。
JPA是一套规范,内部是由接口和抽象类组成的。hibernate是一套成熟的ORM框架,而且Hibernate实现了JPA规范,所以也可以称hibernate为JPA的一种实现方式,我们使用JPA的API编程
Spring Data JPA是Spring提供的一套对JPA操作更加高级的封装,是在JPA规范下的专门用来进行数据持久化的解决方案。
五、实体类和数据库表的映射配置
所有的注解都是使用JPA的规范提供的注解
@Entity
作用:指定当前类是实体类。
@Table
作用:指定实体类和表之间的对应关系。
属性:
name:指定数据库表的名称
@Id
作用:指定当前字段是主键。
@GeneratedValue
作用:指定主键的生成方式。
属性:
strategy :指定主键生成策略。
JPA提供的四种标准用法为TABLE(建立第三张表),SEQUENCE(oracle),IDENTITY(mysql),AUTO。
@Column
作用:指定实体类属性和数据库表之间的对应关系
属性:
name:指定数据库表的列名称。
unique:是否唯一
nullable:是否可以为空
inserttable:是否可以插入
updateable:是否可以更新
columnDefinition: 定义建表时创建此列的DDL
secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字
六、核心配置文件
<!--配置持久化单元 name:持久化单元名称
transaction-type:事务类型
RESOURCE_LOCAL:本地事务管理 JTA:分布式事务管理 -->
<persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
<!--配置JPA规范的服务提供商 -->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<!-- 数据库驱动 -->...
<!-- 数据库地址 -->...
<!-- 数据库用户名 -->...
<!-- 数据库密码 -->...
<!--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>
</persistence>
七、API介绍
Persistence(持久化)对象:主要作用是用于获取EntityManagerFactory对象的 。通过调用该类的createEntityManagerFactory静态方法,根据配置文件中持久化单元名称创建EntityManagerFactory。
EntityManagerFactory接口:主要用来创建 EntityManager 实例
EntityManager:调用EntityManager的方法完成获取事务,以及持久化数据库的操作
getTransaction : 获取事务对象-------EntityTransaction是完成事务操作的核心对象(begin:开启事务,commit:提交事务,rollback:回滚事务)
persist : 保存操作
merge : 更新操作
remove : 删除操作
find/getReference : 根据id查询
八、工具类
public final class JPAUtil {
static {
em = Persistence.createEntityManagerFactory("myPersistUnit");
}
public static EntityManager getEntityManager() {
return em.createEntityManager();
}
}
九、JPQL
Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起•使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。
EG: // 创建query对象
//SQL:SELECT * FROM Customer
String jpql = “from Customer”;
Query query = em.createQuery(jpql);
// 查询并得到返回结果
List list = query.getResultList(); // 得到集合返回类型
十、与Spring整合
导包
xml:
1.dataSource 配置数据库连接池
2.配置entityManagerFactory
3.事务管理器
4.txAdvice
5.aop
Spring Data JPA只需要按照框架的规范提供dao接口,不需要实现类就可以完成数据库的增删改查、分页查询等方法的定义
1.创建一个Dao层接口,并实现JpaRepository和JpaSpecificationExecutor
2.提供相应的泛型(JpaRepository<实体类类型,主键类型>:用来完成基本CRUD操作,JpaSpecificationExecutor<实体类类型>:用于复杂查询(分页等查询操作))
Spring Data JPA完整的调用过程:Spring Data JPA—>JPA规范—>Hibernate—>数据库
十一、查询方式
使用Spring Data JPA中接口定义的方法进行查询:继承JpaRepository,和JpaRepository接口后
使用JPQL的方式查询:使用@Query注解,结合JPQL的语句方式完成查询
使用SQL语句查询:支持sql语句的查询
方法命名规则查询:程序执行的时候会根据方法名称进行解析,并自动生成查询语句进行查询,查询方法以findBy开头,涉及条件查询时,条件的属性用条件关键字连接
十二、Specifications动态查询
在Spring Data JPA中可以通过JpaSpecificationExecutor接口查动态询
public interface JpaSpecificationExecutor {
//根据条件查询一个对象
T findOne(Specification spec);
//根据条件查询集合
List findAll(Specification spec);
//根据条件分页查询
Page findAll(Specification spec, Pageable pageable);
//排序查询查询
List findAll(Specification spec, Sort sort);
//统计查询
long count(Specification spec);
}
对于JpaSpecificationExecutor,这个接口基本是围绕着Specification接口来定义的。我们可以简单的理解为,Specification构造的就是查询条件。
public Predicate toPredicate(Root root, CriteriaQuery<?> query, CriteriaBuilder cb);
构建查询条件步骤:
1). 实现 Specification 接口, 实现 toPredicate 方法
2). 通过 root 获取查询的对象属性 , CriteriaBuilder 组装查询方式 (精确, 模糊, 范围 …) ;