SpringDataJPA简介
SpringDataJPA是Spring的基于ORM框架,它在JPA的基础上封装了一套JPA应用框架,可以使开发者用极简的代码即可实现数据库的访问和操作,它提供了包括CRUD在内的常用操作.
SpringDataJPA使开发者脱离了DAO层的操作,基本上所有的CRUD都可以用它来实现,一般使用SpringDataJPA+ORM框架(如:Hibernate)来实现操作,这样在切换ORM框架时及其方便,实现解耦.
JPA 和 Hibernate 和 SpringDataJPA
JPA是一种规范,其中主要是一些接口和抽象类.
Hibernate是JPA的一种实现方式,JPA的实现方式有很多.
SpringDataJPA是在JPA的基础上更高层次的封装
我们在使用的时候一般是使用SpringDataJPA中的接口,但是实际操作数据库的是Hibernate.
SpringDataJPA如何使用?
第一步:导入Maven坐标
第二步:如果使用SpringBoot则配置配置文件,如果不适用则需要编写配置文件
第三步:创建数据库
第四步:使用注解建立实体类和数据库表的映射关系
第五步:编写DAO层接口继承JpaRepository和JpaSpecification两个接口并且提供相应实体类的泛型
- JpaRepository的泛型是<实体类,主键>,JpaSpecification的泛型是<实体类>这样我们的Dao层接口就有这两个父接口中的所有方法了,我们可直接使用.
SpringDataJPA原理分析
程序在运行的时候自动帮我们创建它的实现类,底层原理是动态代理.
通过JdkDynamicAopProxy代理类创建代理对象SimpleJpaRepository.
在SimpleJpaRepository类中实现了我们用到的方法,如findOne(),findAll()方法.其实在这个类中创建了JPA中的EntityManger对象,通过调用其中的方法实现CRUD.
复杂查询
1.jpa自带复杂查询方式
count():查询总数
exists():判断是否存在
findOne():调用JPA中的find()方法
getOne():调用JPA中的getReference()方法
2.jpql查询
步骤:
1.在Dao接口中定义方法
2.在方法上使用@Query(value=“jpql语句”)注解
*注意:
如果方法中的参数和Jpql语句中的占位符不一致,可使用"?索引"的方式进行绑定.
在进行更新操作时要使用@Query,@Modifying注解并且使用@Transactional注解添加事务支持,并且需要使用@Rollback(value=false)(因为在springDataJpa中执行更新或者删除操作的时候默认回滚事务,而不是提交).
3.SQL查询
步骤:
1.在Dao接口中定义方法
2.在方法上使用@Query(value=“Sql语句”)注解需要注意的是:@Query还有一个属性nativeQuery,使用nativeQuery属性决定使用SQL还是JPQL,
当@nativeQuery(value=true)时候,使用本地查询即SQL查询,默认为false.
注意:在查询出来的是多条数据时返回类型时List<Object[]>
4.方法名规则查询
规则:
findByXXX,其中"XXX"为实体类中的属性名首字母大写.
findByXXX+“查询方式(like | isnull)”
findByXXX+"“查询方式”+“多条件连接符(and | or )”+ XXX + “查询方式”
它是对JPQL更深一层的封装,在运行时将方法名转为JPQL语句.