spring4系列三 spring data 解析

后端开发,简单说就是针对不同的业务建模,抽象数据,对数据进行各种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

猜你喜欢

转载自eric-weitm.iteye.com/blog/2384491