SpringData之Repository接口

###Repository接口简介     Repository接口是<font color="red">spring data</font>的一个核心接口,它不提供任何方法,是一个空接口。开发者需要在自己定义的接口中申明需要的方法。

接口定义:

public interface Repository<T, ID extends Serializable> {

}

###Repository的子接口

  1. 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);

转载于:https://my.oschina.net/u/2500438/blog/1358309

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值