一、思维导航
springData简化了操作关系型数据库和非关系数据库,我们这章主要讲解操作关系型数据库。理解springData JPA,我们首先要理解JPA
一、JPA
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
1、标准化
JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。
2、容器级特性的支持
JPA框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。
3、简单方便
JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释,JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易地掌握。JPA基于非侵入式原则设计,因此可以很容易地和其它框架或者容器集成。
4、查询能力
JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
5、高级特性
JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。
知识总结:JPA是一个标准,没有实现具体的功能。最主要的两个标准是:
1、对象映射成数据库表
2、查询根据对象映射翻译成SQL执行CRUD
二、供应商
也就是实现JPA这个标准的具体产品:如图所示:hibernate、eclipseLink、opnJPA,当然我们常用的是hibernate.
可以这样理解:供应商遵循了JPA的标准,但是供应商有更强大的操作数据库的方式,JPA只能说是供应商的一个子功能。
三、整合者
springData JPA就是充当这个角色,它就是把操作数据库的CRUD进行封装,让CRUD更简单,但是JPA产品非常多,那么如何封装?根据多态的知识当然是抽象化。JPA是其他供应商的标准,所以springData就对JPA CRUD进行封装,具体用什么产品只要是遵循JPA标准都可行。
平时我们用的最多的供应商是hibernate,这里我们就拿hibernate与JPA进行比较,可以说会hibernate的程序员只需要半小时就可以搞定springData.当然先看耐心看完这篇文章。
1、实体对象的状态,在Hibernate有瞬时、持久、游离三种,JPA里有new,managed,detached,removed,这些状态都是一一对应的(detached,removed 类似游离状态)。
2、工厂 JPA为entityManagerFactory ,hibernate为sessionFactory
3、Query query = manager.createQuery(sql),它在Hibernate里写法上是session,而在JPA中变成了manager
四、具体操作
1、规范
以上代码是我在课堂上给同学们封装的DAO用来简化hibernate CRUD的操作,其实springData就是做了这一步,但是封装的更优美,更丰富。也就是说:只要遵循封装后的规范我们就可以少写代码,springData就自动按照规范生成SQL.
2、配置
连接池:
工厂:
我们自定义CRUD的接口交给springData(指令):
事物管理器:
3、springData 封装好的类
Repository:仅仅是一个标识,表明任何继承它的均为仓库接口类
CrudRepository:继承 Repository,实现了一组 CRUD 相关的方法
PagingAndSortingRepository:继承 CrudRepository,实现了一组分页排序相关的方法
JpaRepository:继承 PagingAndSortingRepository,实现一组 JPA 规范相关的方法
五、具体查询
1、关键字查询
直接在接口中定义查询方法,如果是符合规范的,可以不用写实现,目前支持的关键字写法如下:
2、代码实现
实体类:
自定义DAO接口:
以上代码不需要实现类就可以查询出用户集合。具体实现由springData来实现,这里的接口方法只是给springData的指令,这个指令遵循的规范是关键字And.
规范:以findBy开头,userName和userAge是条件,And是关键字,查询的对象是我们指定的泛型类:UserEntity。
规范生成的语句为:from UserEntity where userName=? and userAge=?
读到这里请你再回头看一下上面图标的关键字,你可以动手用一用其他的关键字了。
如果自己要写JPQL(类似HQL)语句可以么?当然可以,请看下图:查询人和猫放入到DTO对象。
用SQL查询 ,设置nativeQuery=true 就可以,既使用原生态的查询
分页查询:
3、springData 的分页封装
1、Page接口:可以获取到当前页、下一页、上一页、总页数、每页显示的行数
2、Pageable接口,实现类为PageRequest(起始位置,每页显示的行数,排序)
代码如下:
领取专属 10元无门槛券
私享最新 技术干货