JPA与Spring Data JPA

前言

这是在对慕课网的SpringBoot博客站实战课程学习中遇到JpaRepository接口时就想要写的,但是一直没动手,毕竟懒癌,最近延毕了,所以有点空闲时间就来开篇了。仅仅是匆忙地做个记录,还不清楚到底主旨是要表达什么,所以先用“JPA与Spring-data-Jpa”这个标题好了,后面可能再做修改。

1. JPA

JPA是Java Persistence API的缩写,它的本质是一种ORM(Object Relational Mapping,描述对象和表的关系)的规范,它虽然没有实现具体的ORM框架,但它为所有的ORM框架定义了标准的API,提供了一系列的接口,显然接口是无法直接使用的,虽然说可以面向接口编程,但是,每个开发者都自说自话地做一套实现是很不利于项目的移植扩展的。所以JPA最大的贡献是为ORM实现提供了统一的规范,这其中包括了Hibernate、TopLink等。
我从SpringData Jpa、Hibernate、Jpa 三者之间的关系这篇文章中看到一张图,十分形象地反映了JPA和各种ORM框架的关系。

2. Spring Data JPA

早先Spring在持久层的业务逻辑并没有太多的帮助,但在Spring Data JPA出现之后,各种实体类的持久性业务开发也变得轻松了起来。Spring Data JPA 在JPA的规范下提供了Repository层的实现,但Spring并没有指定使用什么样的ORM框架,因此这里依然需要开发者自行决定。
这带来的最大便利是:虽然ORM都实现了JPA的规范,但是不同框架之间的差异化依然使得切换是需要成本的(重写持久化业务逻辑代码),Spring Data JPA使得我们能够免去这部分成本,唯一要做的,就只是声明持久层的接口

3. Spring Data JPA的使用

Spring Data JPA 中定义了一个访问底层数据模型的超级接口Repository,而将其对于数据的具体操作在它的子接口中定义

public interface Repository<T, ID extends Serializable> { 

} 

所有继承这个接口的interface都被spring管理,只要遵循Spring Data规范,就无需为它编写实现类

3.1 Repository

Repository的中文语义是资源库,这里表示实体与数据映射层交互,也可以理解为DAO层。
Spring Data中提供了几个Repository,并依据层次扩展了具体功能,分别是:

  • Repository:仅仅是一个标识,表明任何继承它的接口均为仓库类,方便Spring扫描;
  • CrudRepository:继承自Repository,从名称上就可以看出它实现了一组CRUD方法;
  • PagingAndSortingRepository:继承自CrudRepository,实现了一组分页、排序相关的方法;
  • JpaRepository:继承自PagingAndSortingRepository,实现了一组JPA规范的方法;
  • JpaSpecificationExecutor:它并不属于Repository的体系,实现一组JPA Criteria查询相关的方法 。
    我们自定义的Repository通常要继承自JpaRepository,这样我们自定义的XXXRepository就具有了数据访问层的能力。

3.2 Repository的基本功能

3.2.1 CrudRepository

        T save(T entity);//保存单个实体 
        Iterable save(Iterable entities);//保存集合 
        T findOne(ID id);//根据id查找实体 
        boolean exists(ID id);//根据id判断实体是否存在 
        Iterable findAll();//查询所有实体,不用或慎用! 
        long count();//查询实体数量 
        void delete(ID id);//根据Id删除实体 
        void delete(T entity);//删除一个实体 
        void delete(Iterable entities);//删除一个实体的集合 
        void deleteAll();//删除所有实体,不用或慎用

你可能感兴趣的:(spring)