###Repository接口简介 Repository接口是<font color="red">spring data</font>的一个核心接口,它不提供任何方法,是一个空接口。开发者需要在自己定义的接口中申明需要的方法。
接口定义:
public interface Repository<T, ID extends Serializable> {
}
###Repository的子接口
- API中的继承关系
(1)、Repository: 仅仅是一个标识,表明任何继承它的接口被IOC容器识别为一个Repository Bean 注入到IOC容器中,进而可以在该接口中定义满足一定规则的接口;
(2)、CrudRepository: 继承 Repository,实现了一组 CRUD 相关的方法;
(3)、PagingAndSortingRepository: 继承 CrudRepository,实现了一组分页排序相关的方法;
(4)、JpaRepository: 继承 PagingAndSortingRepository,实现一组 JPA 规范相关的方法。
- 通过继承关系可以看出,如果自定的xxxRepository继承JpaReposotory,那么该接口就具备了通用的数据访问控制层的能力了。
- JpaSpecificationExecutor: 不属于Repository体系,它实现一组 JPA Criteria 查询相关的方法 。
- 与继承 Repository 等价的一种方式,就是在持久层接口上使用 @RepositoryDefinition 注解,并为其指定 domainClass 和 idClass 属性。
2. 自定义接口
(1)、查询方法以find|read|get开头
(2)、涉及条件查询,条件的属性需要定义关键字连接
(3)、条件的属性名称与个数要与参数的位置与个数一一对应
(4)、要注意的是,条件的属性以首字母大写
(5)、支持属性的级联查询,若当前类有符合条件的属性,则优先使用,则不使用级联属性,若需要使用
级联属性,则属性之间使用“-”下划线进行连接
3. JpaRepository的使用
(1)、根据实体属性名称
public UserInfo findByUsername(String username);
说明:根据username获取用户对象,相当于select * from user_info where username=?
(注意user_info是表名,username是字段名)
(2)、根据实体属性名称模糊查询
List<UserInfo> getByUsernameStartingWithAndIdLessThan(String username,Integer id);
说明:相当于select * from user_info where username like ?% and id < ?
(3)、查询所有
List<UserInfo> findAll();
(4)、查询单个
UserInfo findOne(Integer id);
(5)、通过@Query注解,自定义JPQL语句查询,不带的查询
@Query("SELECT u FROM UserInfo u WHERE u.uid=(SELECT MAX(i.uid) FROM UserInfo i)")
public UserInfo getMaxUserInfo();
说明:UserInfo是实体名称,uid是实体字段名。
(6)、通过@Query注解,参数名称和参数顺序耦合
@Query("SELECT u FROM UserInfo u WHERE username = ?1 and password = ?2") //一个参数可以直接写: username=?
public UserInfo getUserInfo(@Param("username") String username, @Param("password")String pwd);
@Query("SELECT u FROM UserInfo u WHERE username = :username and password = :password")
public UserInfo getUserInfo(@Param("username") String username, @Param("password")String pwd);
说明:以上两种写法一样,第一种使用占位符方式,第二种使用命名参数方;UserInfo是实体名称,username和password是实体字段名。
(7)、通过@Query注解,设置nativeQuery=true,使用原生的sql
@Query(value="SELECT * FROM user_info t WHERE t.uid = :uid", nativeQuery=true)
public UserInfo getUserInfoById(@Param("uid") Integer id);
注意:@Param是org.springframework.data.repository.query.Param而不是ibaits里的
(8)、通过@Query注解,修改数据
@Modifying
@Transactional
@Query(value="UPDATE user_info SET username = :username WHERE uid = :uid", nativeQuery=true)
public Integer updateUserInfo(@Param("uid") Integer id,@Param("username") String username);
注意:a、可以通过自定义的 JPQL 完成 UPDATE 和 DELETE 操作。 注意: JPQL 不支持使用 INSERT,但可以通过原生sql进行INSERT;
b、在 @Query 注解中编写 JPQL 语句, 但必须使用 @Modifying 进行修饰. 以通知 SpringData, 这是一个 UPDATE 或 DELETE 操作 ;
c、UPDATE 或 DELETE 操作需要使用事务,此时需要定义 Service 层,在 Service 层的方法上添加事务操作,否则就在方法定义上使用@Transactional;
d、默认情况下, SpringData 的每个方法上有事务, 但都是一个只读事务。 他们不能完成修改操作。
(9)、通过@Query注解和nativeQuery=true属性,插入数据
@Modifying
@Transactional
@Query(value="INSERT INTO user_info(uid, username, name, password) VALUES(:uid,:username,:name,:password)", nativeQuery=true)
public Integer insertUserInfo(@Param("uid") Integer id,@Param("username") String username,@Param("name") String name, @Param("password") String password);