SpringBoot使用JPA,详细介绍

一、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 组装查询方式 (精确, 模糊, 范围 …) ;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值