当前位置:   article > 正文

MyBatis-Plus02 条件构造器QueryWrapper、UpdateWrapper、Condition、LambdaQuery用法详解_lambdaupdatewrapper

lambdaupdatewrapper

目录

①. 条件构造器与常用的接口

②. QueryWrapper

③. UpdateWrapper

④. Condition——简化代码开发

⑤. LambdaQueryWrapper

⑥. LambdaUpdateWrapper

①. 条件构造器与常用的接口

  • ①. Wrapper介绍:

条件构造器(Wrapper)的作用

MyBatis-Plus提供的通用Mapper中,删改查(没有insert)的方法通常会需要我们传入一个条件构造器,用来生成最后执行的SQL语句。

​ 比如List selectList( Wrapper wrapper)方法,当我们传入null时,默认生成的语句就是select * from xxx,这条语句没有查询条件,排序,子查询,模糊查询并且固定查询所有的字段,如果我们需要一些复杂的查询条件,就可以使用条件构造器来指定我们的SQL需要拼接那些查询条件。

  1.  Wrapper : 条件构造抽象类,最顶端父类
  2. AbstractWrapper : 用于查询条件封装,生成sql的where条件
  3. QueryWrapper : 查询条件封装
  4. UpdateWrapper : Update 条件封装
  5. AbstractLambdaWrapper : 使用Lambda语法
  6. LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
  7. LambdaUpdateWrapper : Lambda 更新封装Wrapper
  • ②. 条件构造器中各个方法及应用场景: (重中之重!)

②. QueryWrapper 

  • ①. 组装查询条件

        查询用户名包含a,年龄在20到30直接,邮箱信息不为空的信息 

(注释中的sql语句就是mybatis-plus为我们生成的sql语句,is_deleted字段为逻辑删除字段,在对数据库进行操作时都要筛选出未被逻辑删除的字段再对其进行CRUD操作)

  1. @DisplayName("条件构造器组装查询条件")
  2. @Test
  3. public void test01(){
  4. // SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)
  5. QueryWrapper<User> wrapper=new QueryWrapper<>();
  6. wrapper.like("name","a").
  7. between("age",20,30).
  8. isNotNull("email");
  9. List<User> list = userMapper.selectList(wrapper);
  10. list.forEach(System.out::println);
  11. }
  •  ②. 组装排序条件

        查询用户信息,按照年龄降序排序,若年龄相同,则按id升序排序 

  1. @DisplayName("条件构造器组装排序条件")
  2. @Test
  3. public void test02(){
  4. //SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 ORDER BY age DESC,id ASC
  5. QueryWrapper<User> queryWrapper=new QueryWrapper<>();
  6. queryWrapper.orderByDesc("age").orderByAsc("id");
  7. List<User> list = userMapper.selectList(queryWrapper);
  8. list.forEach(System.out::println);
  9. }
  •  ③. 组装删除条件

        删除邮箱地址为null的数据 

  1. @DisplayName("条件构造器删除功能")
  2. @Test
  3. public void test03(){
  4. //UPDATE user SET is_deleted=1 WHERE is_deleted=0 AND (email IS NULL)
  5. QueryWrapper<User> queryWrapper=new QueryWrapper<>();
  6. queryWrapper.isNull("email");
  7. int delete = userMapper.delete(queryWrapper);
  8. System.out.println(delete);
  9. }
  •  ④. 条件的优先级(lambda中的优先级最高)
  1. @DisplayName("使用queryWrapper来实现修改功能")
  2. @Test
  3. public void test04(){
  4. //1.先查询出要修改的数据
  5. //将(年龄大于20并且用户名中包含a)或者邮箱为Null的用户进行修改
  6. //UPDATE user SET name=? WHERE is_deleted=0 AND (age > ? AND name LIKE ? OR email IS NULL)
  7. QueryWrapper<User> queryWrapper=new QueryWrapper<>();
  8. queryWrapper.gt("age",20)
  9. .like("name","a")
  10. .or()
  11. .isNull("email");
  12. //2.再对其进行修改
  13. User user=new User();
  14. user.setName("桥桥");
  15. int update = userMapper.update(user, queryWrapper);
  16. System.out.println(update);
  17. }
  18. @DisplayName("使用queryWrapper来实现修改功能(查询的优先级)")
  19. @Test
  20. public void test05(){
  21. //将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
  22. //UPDATE user SET name=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
  23. //lambda中的条件优先执行
  24. //.and(i就是条件构造器的意思)
  25. QueryWrapper<User> queryWrapper=new QueryWrapper<>();
  26. queryWrapper.like("name","a")
  27. .and(i->i.gt("age",20).or().isNull("email"));
  28. User user=new User();
  29. user.setName("桥桥");
  30. int update = userMapper.update(user, queryWrapper);
  31. System.out.println(update);
  32. }
  • ⑤. 组装select子句,查询部分字段

        查询用户的用户名、年龄 

  1. @DisplayName("查询部分字段")
  2. @Test
  3. public void test06(){
  4. //SELECT name,age FROM user WHERE is_deleted=0
  5. QueryWrapper<User> queryWrapper=new QueryWrapper<>();
  6. queryWrapper.select("name","age");
  7. List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
  8. maps.forEach(System.out::println);
  9. }
  • ⑥. 子查询语句的组装

             查询id<=100的用户信息

  1. @DisplayName("条件构造器实现子查询")
  2. @Test
  3. public void test07(){
  4. // SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (id IN (select id from user where id <=6))
  5. QueryWrapper<User> queryWrapper=new QueryWrapper<>();
  6. queryWrapper.inSql("id","select id from user where id <=6");
  7. queryWrapper.like("name","桥");
  8. List<User> list = userMapper.selectList(queryWrapper);
  9. list.forEach(System.out::println);
  10. }

③. UpdateWrapper

            将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改 

  1. @DisplayName("updateWrapper设置修改条件")
  2. @Test
  3. public void test08(){
  4. //UPDATE user SET name=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
  5. UpdateWrapper<User> updateWrapper=new UpdateWrapper<>();
  6. updateWrapper.like("name","a")
  7. .and(i->i.gt("age",20).or().isNull("email"))
  8. .set("name","旋旋").set("email","big");
  9. int update = userMapper.update(null, updateWrapper);
  10. System.out.println(update);
  11. }

④. Condition——简化代码开发

  • ①. 在真正开发的过程中,组装条件是常见的功能,而这些条件数据来源于用户输入,是可选的,因此我们在组装这些条件时,必须先判断用户是否选择了这些条件,若选择则需要组装该条件,若没有选择则一定不能组装,以免影响SQL执行的结果

        test09测试模拟了根据前端传过来的姓名、最大最小年龄来进行查询,查询前要先判断传过来的数据是否存在,若不存在则不作为查询条件。 

  1. @Test
  2. public void test09(){
  3. String name="";
  4. Integer ageBegin=20;
  5. Integer ageEnd=30;
  6. QueryWrapper<User> queryWrapper=new QueryWrapper<>();
  7. //SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (age >= ? AND age <= ?)
  8. if (StringUtils.isNotBlank(name)){
  9. //isNotBlank判断某个字符串是否不为空,不为Null,不为空白符
  10. queryWrapper.like("name",name);
  11. }
  12. if(ageBegin!=null){
  13. queryWrapper.ge("age",ageBegin);
  14. }
  15. if (ageEnd!=null){
  16. queryWrapper.le("age",ageEnd);
  17. }
  18. List<User> list = userMapper.selectList(queryWrapper);
  19. list.forEach(System.out::println);
  20. }
  • ②. 上面的实现方案没有问题,但是代码比较复杂,我们可以使用带condition参数的重载方法构建查询条件,简化代码的编写
  1. @Test
  2. public void test10(){
  3. //与test09一致,简化,把判断条件放到构造语句中
  4. //SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (age >= ? AND age <= ?)
  5. String name=" ";
  6. Integer ageBegin=20;
  7. Integer ageEnd=30;
  8. QueryWrapper<User> queryWrapper=new QueryWrapper<>();
  9. queryWrapper.like(StringUtils.isNotBlank(name),"name","a")
  10. .ge(ageBegin!=null,"age",20)
  11. .le(ageEnd!=null,"age",30);
  12. List<User> list = userMapper.selectList(queryWrapper);
  13. list.forEach(System.out::println);
  14. }

⑤. LambdaQueryWrapper

        为了防止我们写错字段名,我们使用lambda函数式接口来访问属性对应的字段名称 

  1. @DisplayName("lambdaQueryWrapper测试")
  2. @Test
  3. public void test11(){
  4. //SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (name LIKE ? AND age >= ? AND age <= ?)
  5. String name="a";
  6. Integer ageBegin=20;
  7. Integer ageEnd=30;
  8. LambdaQueryWrapper<User> lambdaQueryWrapper=new LambdaQueryWrapper<>();
  9. lambdaQueryWrapper.like(StringUtils.isNotBlank(name),User::getName,name)
  10. .ge(ageBegin!=null,User::getAge,ageBegin)
  11. .le(ageEnd!=null,User::getAge,ageEnd);
  12. List<User> list = userMapper.selectList(lambdaQueryWrapper);
  13. list.forEach(System.out::println);
  14. }

⑥. LambdaUpdateWrapper

         将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改 

  1. @DisplayName("lambda设置修改条件")
  2. @Test
  3. public void test12(){
  4. //UPDATE user SET name=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
  5. LambdaUpdateWrapper<User> updateWrapper=new LambdaUpdateWrapper<>();
  6. updateWrapper.like(User::getName,"a")
  7. .and(i->i.gt(User::getAge,20).or().isNull(User::getEmail))
  8. .set(User::getName,"旋旋").set(User::getEmail,"big");
  9. int update = userMapper.update(null, updateWrapper);
  10. System.out.println(update);
  11. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读