SpringDataJPA之Repository接口-阿里云开发者社区

开发者社区> 游客a74jvhcp7vclg> 正文

SpringDataJPA之Repository接口

简介: Repository 接口是 Spring Data JPA 中为我我们提供的所有接口中的顶层接口,而且是个标志接口,Repository 提供了两种查询方式的支持
+关注继续查看


 Repository 接口是 Spring Data JPA 中为我我们提供的所有接口中的顶层接口,而且是个标志接口,Repository 提供了两种查询方式的支持

1)基于方法名称命名规则查询

2)基于@Query 注解查询

Repository

一、基于方法名称命名规则查询

1.方法名称命名规则查询

规则:findBy(关键字)+属性名称(属性名称的首字母大写)+查询条件(首字母大写)

image.pngimage.png

2.具体使用

创建接口,并定义相关方法

/**
 * Repository 接口使用
 * 定义的方法名称 参考文档定义
 */
public interface UserDao extends Repository<Users,Integer> {
    List<Users> findByUsernameIs(String string);
    List<Users> findByUsernameLike(String string);
    List<Users> findByUsernameAndUserageGreaterThanEqual(String name,Integer age);
}

单元测试

/**
 * @program: spring-hibernate
 * @description: 单元测试
 * @author: 波波烤鸭
 * @create: 2019-05-18 09:48
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestDemo {

    @Autowired
    private UserDao usersDao;


    /**
     * 需求:使用用户名作为查询条件
     */
    @Test
    public void test1() {
        /**
         * 判断相等的条件,有三种表示方式
         * 1,什么都不写,默认的就是做相等判断
         * 2,Is
         * 3,Equal
         */
        List<Users> list = this.usersDao.findByUsernameIs("王五");
        for (Users users : list) {
            System.out.println(users);
        }
    }

    /**
     * 需求:根据用户姓名做 Like 处理
     * Like:条件关键字
     */
    @Test
    public void test2() {
        List<Users> list = this.usersDao.findByUsernameLike("王%");
        for (Users users : list) {
            System.out.println(users);
        }
    }

    /**
     * 需求:查询名称为王五,并且他的年龄大于等于 22 岁
     */
    @Test
    public void test3() {
        List<Users> list =
                this.usersDao.findByUsernameAndUserageGreaterThanEqual("王五", 22);
        for (Users users : list) {
            System.out.println(users);
        }
    }


}

查询结果

image.png

二、基于@Query 注解查询

 通过方法命令的方式使用的方式如果查询条件比较复杂,那么方法的名称就会很长,不是很方便,这时我们可以通过@Query注解的方式来实现。

2.1通过 JPQL 语句查询

 JPQL:通过 Hibernate 的 HQL 演变过来的。他和 HQL 语法及其相似。

创建接口

//使用@Query 注解查询
@Query(value="from Users where username = ?")
List<Users> queryUserByNameUseJPQL(String name);
@Query("from Users where username like ?")
List<Users> queryUserByLikeNameUseJPQL(String name);
@Query("from Users where username = ? and userage >= ?")
List<Users> queryUserByNameAndAge(String name,Integer age);

单元测试

 

   /**
     * 测试@Query 查询 JPQL
     */
    @Test
    public void test4(){
        List<Users> list = this.usersDao.queryUserByNameUseJPQL("王五");
        for (Users users : list) {
            System.out.println(users);
        }
    }
    /**
     * 测试@Query 查询 JPQL
     */
    @Test
    public void test5(){
        List<Users> list = this.usersDao.queryUserByLikeNameUseJPQL(" 王%");
        for (Users users : list) {
            System.out.println(users);
        }
    }
    /**
     * 测试@Query 查询 JPQL
     */
    @Test
    public void test6(){
        List<Users> list = this.usersDao.queryUserByNameAndAge("王五", 22);
        for (Users users : list) {
            System.out.println(users);
        }
    }

2.2通过SQL语句查询

 我们也可以直接在定义的方法头部通过@Query注解来添加Sql语句来实现,具体如下:

//使用@Query 注解查询 SQL
//nativeQuery:默认的是 false.表示不开启 sql 查询。是否对 value 中的语句做转义。
@Query(value="select * from users where username = ?",nativeQuery=true)
        List<Users> queryUserByNameUseSQL(String name);
@Query(value="select * from users where username like ?",nativeQuery=true)
        List<Users> queryUserByLikeNameUseSQL(String name);
@Query(value="select * from users where username = ? and userage >= ?",nativeQuery=true)
List<Users> queryUserByNameAndAgeUseSQL(String name,Integer age);

单元测试

 

  /**
     * 测试@Query 查询 SQL
     */
    @Test
    public void test7(){
        List<Users> list = this.usersDao.queryUserByNameUseSQL("王五");
        for (Users users : list) {
            System.out.println(users);
        }
    }
    /**
     * 测试@Query 查询 SQL
     */
    @Test
    public void test8(){
        List<Users> list = this.usersDao.queryUserByLikeNameUseSQL(" 王%");
        for (Users users : list) {
            System.out.println(users);
        }
    }
    /**
     * 测试@Query 查询 SQL
     */
    @Test
    public void test9(){
        List<Users> list = this.usersDao.queryUserByNameAndAgeUseSQL(" 王五", 22);
        for (Users users : list) {
            System.out.println(users);
        }
    }

image.png

2.3 通过@Query 注解完成数据更新

 @Query注解可以完成数据的更新操作,但是不能实现添加和删除数据的操作,实现如下:

接口中声明方法:

@Query("update Users set userage = ? where userid = ?")
@Modifying //@Modifying 当前语句是一个更新语句
void updateUserAgeById(Integer age,Integer id);

单元测试

/**
 * 测试@Query update
 */
@Test
@Transactional
@Rollback(false)
public void test10(){
    this.usersDao.updateUserAgeById(24, 6);
}

image.png

 通过以上的介绍,我们发现Repository接口主要还是实现查询相关的操作,对DML的支持并不友好,下篇我们讲介绍CrudRepository接口。下篇见~


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
HashMap 的产生与原理
数组:一片物理上连续的大小确定的储存空间。 好处:根据下标快速的查找和修改里面的内容。 缺点:大小确定,无法修改。添加新的元素或者删除元素比较麻烦。
5 0
来来来开小灶了,年后求职和跳槽的看过来,悄悄的看悄悄的收藏
面试官,您好我叫(XXX),今天来公司面试 JAVA开发工程师,之前在(XXX 公司)任职,从事这一行已经有(几)个年头了。这几年开发,主要接触的项目包括(你做过的项目!)等。在开发过程中,也用过好些框架,比如∶ springboot、springcloud、springmvc、spring、Mybatis等技术框架。熟练掌握框架之间的整合技术。有时候因为项目需求或是为了开发的高效性,自己我会研究一些技术,使用一些常用的主流 Java技术,例如∶(吹!用没用过不重要,主要是就是英文的!)。前端的技术也研究过一些。如(原生的、框架啊都往上整!)
4 0
字节工程师自行开发了基于IntelliJ的终极文档套件
众所周知,程序员最讨厌的四件事:写注释,写文档,别人不写注释,别人不写文档。因此,有必要找到降低文档编写和维护成本的方法。目前写技术文档的模式如下:
6 0
【深入浅出版】Java全套学习路线规划及配套视频和笔记
 工作难找,入坑不易,请根据自己的情况再做决定,且行且珍惜!        大家都说近两年疫情导致行情不太好,确实比起往年工作机会是少了很多,但我觉得事事是相对的。我入坑比较早,好几年了,各种各样的人和事都遇到过,也面试过很多人!
8 0
WEB 服务器配置|学习笔记
快速学习 WEB 服务器配置
5 0
ElasticSearch 面试 4 连炮,你顶得住么?
es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗?
5 0
深度剖析Saga分布式事务
saga是分布式事务领域非常重要的事务模式,特别适合解决旅游订票等长期事务。本文将深入分析saga事务的设计原理和解决订票问题的最佳实践。
7 0
案例诊断:“交易耗时8S”缉凶记
案例诊断:“交易耗时8S”缉凶记
4 0
+关注
游客a74jvhcp7vclg
10余年开发架构经验,同时乐于技术分享!
332
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载