后端开发,简单说就是针对不同的业务建模,抽象数据,对数据进行各种CRUD。根据需求不同大概有这么几类的数据:数据库(mysql),nosql(redis),全文检索引擎(solr),大数据(hdfs),云存储和CDN。其中前2个用于交易事物操作,第三个重点是快速查找,模糊查找(找到最相似的),第四个用于分析(数据仓库的升级),最后是纯粹的可靠存储(多备份的硬盘)。spring中,把所有能存储和处理数据的地方叫Repository。其目标是,提供统一的数据访问接口,尽可能避免写sql。
一、相关jar概述
spring-data-commons封装了repository和相关的annotation
spring-data-jpa实现jpaRepository
二、实现
1、基本抽象
–Repository:仅仅是一个标识,表明任何继承它的均为仓库接口类,用于封装数据库的crud
–CrudRepository:继承Repository,实现了一组CRUD相关的方法
–PagingAndSortingRepository:继承CrudRepository,实现了一组分页排序相关的方法
–JpaRepository:继承PagingAndSortingRepository,实现一组JPA规范相关的方法
–自定义的 XxxxRepository需要继承 JpaRepository,这样的XxxxRepository接口就具备了通用的数据访问控制层的能力。
–JpaSpecificationExecutor:实现一组JPACriteria查询相关的方法
2、service层存在意义就是构建page,JPACriteria等,组合底层的repository,controller层直接可以调用对应的crud
3、Repository子接口中声明方法
* 1.不是随便声明的,而需要符合一定的规范
* 2.查询方法以find|read|get开发
* 3.涉及条件查询,条件的属性需要定义关键字连接
* 4.要注意的额是,条件的属性以字母大写
* 5.支持属性的级联查询,若当前类有符合条件的属性,则优先使用,则不使用级联属性
* 若需要使用级联属性,则属性之间使用——进行连接
4、自定义查询的例子
//为@Query注解传递参数的方式1:使用占位符
@Query("SELECT P FROM Person P where P.lastName=?1 AND P.email=?2")
List<Person> testQueryAnnotationParams1(String lastName,String email);
//为@Query注解传递参数的方式2:使用命名参数方式
@Query("SELECT P FROM Person P where P.lastName=:lastName AND P.email=:email")
List<Person> testQueryAnnotationParams2(@Param("email")String email,@Param("lastName")String lastName);
//Spring Data 运行在占位符上添加%%
@Query("select p from Person p where p.lastName like %?1% or p.email like %?2%")
List<Person> testQueryAnnotationLikeParam(String lastName,String email);
//设置nativeQuery=true 可以使用原生的sql查询
@Query(value="SELECT count(id) FROM jpa_persons",nativeQuery=true)
public long getTotalCount();
//可以通过自定义的JPQL 完成update和delete操作,注意:JPQL不支持Insert操作
//在@Query注解中编写JPQL语句,但必须使用@Modify进行修饰,以通知SpringData,这是一个Update或者Delete
//Update或者delete操作,需要使用事务,此时需要定义Service层,在service层的方法上添加事务操作
//默认情况下,SpringData的每个方法上有事务,但都是一个只读事务,他们不能完成修改操作
@Modifying
@Query("update Person p set p.email=:email where id=:id")
void updatePersonEmail(@Param("id")Integer id,@Param("email")String email);
5、对应实现
jpa ->JpaRepository
solr -> SolrTemplate
redis->RedisTemplate