专栏首页波波烤鸭SpringDataJPA之Repository接口

SpringDataJPA之Repository接口

  Repository 接口是 Spring Data JPA 中为我我们提供的所有接口中的顶层接口,而且是个标志接口,Repository 提供了两种查询方式的支持 1)基于方法名称命名规则查询 2)基于@Query 注解查询

Repository

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

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

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

关键字

方法名

sql where 子句

And

findByNameAndPwd

where name= ? and pwd =?

Or

findByNameOrSex

where name= ? or sex=?

Is,Equal

findById,findByIdEquals

where id= ?

Between

findByIdBetween

where id between ? and ?

LessThan

findByIdLessThan

where id < ?

LessThanEqual

findByIdLessThanEquals

where id <= ?

GreaterThan

findByIdGreaterThan

where id > ?

GreaterThanEqual

findByIdGreaterThanEquals

where id > = ?

After

findByIdAfter

where id > ?

Before

findByIdBefore

where id < ?

IsNull

findByNameIsNull

where name is null

isNotNull,Not

findByNameNotNull

where name is not Null null

Like

findByNameLike

where name like ?

NotLike

findByNameNotLike

where name not like ?

StartingWith

findByNameStartingWith

where name like ‘?%’

EndingWith

findByNameEndingWith

where name like ‘%?’

Containing

findByNameContaining

where name like ‘%?%’

OrderBy

findByIdOrderByXDesc

where id=? order by x desc

Not

findByNameNot

where name <> ?

In

findByIdIn(Collection<?> c)

where id in (?)

NotIn

findByIdNotIn(Collection<?> c)

where id not in (?)

True

findByAaaTue

where aaa = true

False

findByAaaFalse

where aaa = false

IgnoreCase

findByNameIgnoreCase

where UPPER(name)=UPPER(?)

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);
        }
    }


}

查询结果

二、基于@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);
        }
    }

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);
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringDataJPA之JpaRepository和JpaSpecificationExecutor接口

      JpaRepository 接口是我们开发时使用的最多的接口。其特点是可以帮助我们将其他接口的方法的返回值做适配处理。可以使得我们在开发时更方便的使用这些方...

    用户4919348
  • Java项目架构的演变

      大型网站都是从小型网站发展而来的,网站架构也是一样,是从小型网站架构逐步演化而来的,小型网站最开始没有太多人访问,只需要一台服务器就绰绰有余了,这时的架构如...

    用户4919348
  • SpringData【Spring整合HibernateJPA】

      现如今的ORM框架还是比较多的比如Hibernate,TopLink以及OpenJPA等等,为了简化ORM框架的使用,JPA随之产生。   JPA是Jav...

    用户4919348
  • 【2020腾讯广告算法大赛】TI-ONE 平台 SDK 操作案例

    2020腾讯广告算法大赛报名链接:https://algo.qq.com/index.html?rfisource=TICP0416

    腾讯智能钛AI开发者
  • 域名Deskbike.com刚注册没多久就以五位数结拍

    大家进行域名投资,主要是看中域名未来可能会带来巨大收益。最近,米市接连传出域名高价交易的消息,也是振奋着不是投资人的心。无论域名以何种价格成交,其自身...

    躲在树上的域小名
  • 50 个JS 必须懂的面试题为你助力金九银十

    JavaScript 是一种轻量级的解释型编程语言,具有面向对象的特性,允许各位在其他静态HTML页面中构建交互性。 该语言的通用核心已嵌入Netscape,I...

    前端小智@大迁世界
  • 微软脑波新专利,用脑控为你打开Windows应用程序

    VRPinea
  • 金九银十: 50 个JS 必须懂的面试题为你助力

    Java是一种OOP编程语言, 它创建在虚拟机或浏览器中运行的应用程序, 需要编译Java代码。 JavaScript是一种OOP脚本语言, 代码只在浏览器上...

    Javanx
  • 手把手教你分析Mysql死锁问题

    这时候可以用 select*frominformation_schema.innodb_locks;查看锁情况:

    捡田螺的小男孩
  • 【PMP】8.9早上题

    1、审查商业论证后,项目经理下一步应该做什么?C A、制定项目进度计划 B、审查工作分解结构 C、创建项目章程 D、审核范围管理计划 2、项目管理办公...

    心跳包

扫码关注云+社区

领取腾讯云代金券