地址:https://blog.csdn.net/qq_33405420/article/details/89469293
兔子:“这写的没问题啊,只是别人不知道你这么菜而已,他也不知道你直接在junit测试类里面去测试dao的方法,而且还不加事物。”
“。。。好吧,那我后面建立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("修改成功"); }
运行,结果崩了…
其他的数据全没了,看来这种更新是全量的更新,不是增量的。我还以为他会只更新userName和password呢,看来是我太天真了。不怕,我再运行一下adduser测试方法,数据不就回来了嘛。。
我太机智了。
再运行一次,数据果然回来了。
这回得小心一点了,我先根据主键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("修改成功"); }
这下子就成功了。
##5. JPA的奇技淫巧
springDataJpa还实现了一个非常牛逼的东西,就是根据方法名自动进行sql查询。
比如,我想根据roleId去做查询,就可以直接写一个方法:
public List<User> findByRoleId(String roleId);
####SpringData JPA方法命名规则查询
顾名思义,方法命名规则查询就是根据方法的名字,就能创建查询。
只需要按照Spring Data JPA提供的方法命名规则定义方法的名称,就可以完成查询工作。
Spring Data JPA在程序执行的时候会根据方法名称进行解析,并自动生成查询语句进行查询
按照Spring Data JPA 定义的规则,查询方法以findBy开头,涉及条件查询时,条件的属性用条件关键字连接,
要注意的是:条件属性首字母需大写。框架在进行方法名解析时,会先把方法名多余的前缀截取掉,然后对剩下部分进行解析。
我们多造一点测试数据,用addUser方法。
比如,我们现在要查询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()); } }
结果:
这个算是jpa里面一个很有意思的用法了,但是我感觉这样心里好没底啊,哈哈。最稳妥的办法,还是直接写JPQL语句吧。
比如,我这样写:
@Query("select u from User u where userName = ?1 and password = ?2") public User findByUserNameAndPassword(String userName,String password);
这样的好处就是,你想写什么查询就写什么查询,是最放心的。
JPA里面最常用的两种传参方式,就是这两种。
其实,jpa里面还有很多其他的拼接方法,但是我看来看去,都太麻烦了,还是直接用JPQL最省事。对于简单的查询,就直接用默认的方法即可,复杂的查询,就老老实实自己写sql吧。