什么是数据仓库层Repository?
数据仓库接口的作用:Repository原意指的是仓库,即数据仓库的意思。Repository居于业务层和数据层之间,将两者隔离开来,在它的内部封装了数据查询和存储的逻辑。
Repository接口:
1、CrudRepository
2、PagingAndSortingRepository
3、JpaRepository
CrudRepository、PagingAndSortingRepository和JpaRepository三者的关系图如下所示:
综上所述,JpaRepository的功能最全、最强大,所以我们的数据仓库类继承JpaRepository
注意: 创建的数据仓库类是一个接口(不是抽象类、也不是普通类),针对这个接口添加注解@Repository。
Repository和DAO的区别
DAO是传统MVC中Model的关键角色,全称是Data Access Object。DAO直接负责数据库的存取工作,乍一看两者非常类似,但从架构设计上讲两者有着本质的区别:Repository是相对对象而言,DAO则是相对数据库而言,虽然可能是同一个东西 ,但侧重点完全不同。
JpaSpecificationExecutor
JpaSpecificationExecutor(用于特殊的业务场景如:既要有分页又要有排序,里面还有各种动态的查询,虽然此时通过JpaRepository能实现,但是JpaSpecificationExecutor更简单)
自定义接口继承JpaRepository
/*公司数据仓库接口(创建的数据仓库类是一个接口(不是抽象类、也不是普通类),针对这个接口添加注解@Repository。)*/
//类只能继承单个,但是接口可以继承多个
@Repository
public interface CompanyRepo extends JpaRepository<Company,String> { // 指向对应的实体类Company,String与主键的类型一致(uuid string类型),如果是自增列则填写int
// 原生sql语句查询,需要nativeQuery=true,如果为false则表示使用HQL语句
@Query(value = "select * from company where comname=?1",nativeQuery = true) // 精准查询
List<Company> findByNativeSQL(String comname); // 表示传入一个公司名称comname,那么就会把所有满足该名称的信息查询出来
@Query(value="select * from company where comname like '%?1%'",nativeQuery = true) // 模糊查询
List<Company> findByNativeSQL1(String comname);
//原生sql语句操作(涉及到数据变动的,如删除和更新,必须加注解@Modifying)
@Modifying
@Query(value = "update company set comaddress =?1 where comname=?2",nativeQuery = true)
void updateByName(String comaddress,String comname);
}