基于SpringBoot打造在线教育系统(2)-- 深入学习JPA与Junit测试2

简介: 现在User表已经有了,而且对应mysql数据库里面,已经建好了用户表。

0a3d081ac46817f30b437e8ae0ecca0b.png

地址:https://blog.csdn.net/qq_33405420/article/details/89469293

兔子:“这写的没问题啊,只是别人不知道你这么菜而已,他也不知道你直接在junit测试类里面去测试dao的方法,而且还不加事物。”

dc381c4233d8c1537f3332fc5ec4488a.png

“。。。好吧,那我后面建立service方法的时候,一定加上事物。”


兔子:“没事,我刚开始也这样,慢慢来就好了。对了,我已经把公众号的名字改成了【java小白翻身】,记得关注哦~”


##4. 试试jpa的其他修改用法

话说这JPA还真好用,基本的增删改查我都不用写一句sql,对于一些复杂的业务逻辑,我也可以自己写jpql语句(其实还是sql语句,算是面向对象的sql语句吧)。


接下来,我就试试别的方法。刚才已经插入了一条数据,现在我再用另一种方法去修改数据,比如,我把密码改成123吧。

  @Test
  public void modifyPassword(){
    User user = new User();
    user.setUserName("root");
    user.setPassword("123");
    userDao.saveAndFlush(user);
    System.out.println("修改成功");
  }

运行,结果崩了…

982cb4afbe7ad6b789fc223eef063f97.png

其他的数据全没了,看来这种更新是全量的更新,不是增量的。我还以为他会只更新userName和password呢,看来是我太天真了。不怕,我再运行一下adduser测试方法,数据不就回来了嘛。。

我太机智了。

2e903f849040e847169d87e352c78071.png

再运行一次,数据果然回来了。

这回得小心一点了,我先根据主键userName去拿到这个用户,然后再修改密码:

  @Test
  public void modifyPassword(){
    User user = new User();
    user.setUserName("root");
    //先找到userName为root的用户
    user = userDao.findOne("root");
    //修改密码
    user.setPassword("123");
    userDao.saveAndFlush(user);
    System.out.println("修改成功");
  }

f1b38291189248e97805d2c8dab5bf10.png

这下子就成功了。

##5. JPA的奇技淫巧

springDataJpa还实现了一个非常牛逼的东西,就是根据方法名自动进行sql查询。

比如,我想根据roleId去做查询,就可以直接写一个方法:

public List<User> findByRoleId(String roleId);

####SpringData JPA方法命名规则查询


顾名思义,方法命名规则查询就是根据方法的名字,就能创建查询。


只需要按照Spring Data JPA提供的方法命名规则定义方法的名称,就可以完成查询工作。


Spring Data JPA在程序执行的时候会根据方法名称进行解析,并自动生成查询语句进行查询


按照Spring Data JPA 定义的规则,查询方法以findBy开头,涉及条件查询时,条件的属性用条件关键字连接,


要注意的是:条件属性首字母需大写。框架在进行方法名解析时,会先把方法名多余的前缀截取掉,然后对剩下部分进行解析。

6075585063a4be8bc42d353dd123c227.png

我们多造一点测试数据,用addUser方法。

0ca9ee7b954b6c90736181e6681f07ca.png

比如,我们现在要查询nickName里面带有“剽悍”的,就用like。

public List<User> findByNickNameLike(String nickName);

测试:

  @Test
  public void userQuery(){
    List<User> users = userDao.findByNickNameLike("%剽悍%");
    for (int i = 0; i < users.size(); i++) {
      System.out.println(users.get(i).getNickName());
    }
  }

结果:

8d83872cecfa4e7eda51d88108d3bcc8.png

这个算是jpa里面一个很有意思的用法了,但是我感觉这样心里好没底啊,哈哈。最稳妥的办法,还是直接写JPQL语句吧。

比如,我这样写:

@Query("select u from User u where userName = ?1 and password = ?2")
public User findByUserNameAndPassword(String userName,String password);

这样的好处就是,你想写什么查询就写什么查询,是最放心的。

50f8d4ba73dba720ad3b78b9abde8f16.png

JPA里面最常用的两种传参方式,就是这两种。


其实,jpa里面还有很多其他的拼接方法,但是我看来看去,都太麻烦了,还是直接用JPQL最省事。对于简单的查询,就直接用默认的方法即可,复杂的查询,就老老实实自己写sql吧。



相关文章
|
6天前
|
监控 测试技术
如何进行系统压力测试?
【10月更文挑战第11天】如何进行系统压力测试?
63 34
|
6天前
|
存储 监控 网络协议
服务器压力测试是一种评估系统在极端条件下的表现和稳定性的技术
【10月更文挑战第11天】服务器压力测试是一种评估系统在极端条件下的表现和稳定性的技术
62 32
|
10天前
|
安全 Java 数据库
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
这篇文章是关于Apache Shiro权限管理框架的详细学习指南,涵盖了Shiro的基本概念、认证与授权流程,并通过Spring Boot测试模块演示了Shiro在单应用环境下的使用,包括与IniRealm、JdbcRealm的集成以及自定义Realm的实现。
26 3
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
|
4天前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
24 9
|
5天前
|
XML Java 数据格式
Spring学习
【10月更文挑战第6天】Spring学习
15 1
|
9天前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
27 2
|
9天前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
25 1
|
9天前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
13 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
9天前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
12 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
9天前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
14 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库