本文最后更新于:2 个月前
                
              
            
            
              Mybatis-plus条件构造器各种用法(三) 一、wapper介绍 1、Wrapper家族 在MP中我们可以使用通用Mapper(BaseMapper)实现基本查询,也可以使用自定义Mapper(自定义XML)来实现更高级的查询。当然你也可以结合条件构造器来方便的实现更多的高级查询。
Wrapper : 条件构造抽象类,最顶端父类  
  AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
    QueryWrapper : 查询条件封装
    UpdateWrapper : Update 条件封装
  AbstractLambdaWrapper : 使用Lambda 语法
    LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
    LambdaUpdateWrapper : Lambda 更新封装Wrapper
2、创建测试类 1 2 3 4 5 6 @SpringBootTest public  class  WrapperTests  @Resource private  UserMapper userMapper;
二、QueryWrapper 1 、例1:组装查询条件查询名字中包含n,年龄大于等于10且小于等于20,email不为空的用户
1 2 3 4 5 6 7 8 9 10 @Test public  void  test1 ()  new  QueryWrapper<>();"name" ,"n" )"age" , 10 , 20 )"email" );
2、例2:组装排序条件 按年龄降序查询用户,如果年龄相同则按id升序排列
1 2 3 4 5 6 7 8 9 @Test public  void  test2 ()  new  QueryWrapper<>();"age" )"id" );
3、例3:组装删除条件 删除email为空的用户
1 2 3 4 5 6 7 @Test public  void  test3 ()  new  QueryWrapper<>();"email" );int  result = userMapper.delete(queryWrapper); "delete return count = "  + result);
4、例4:条件的优先级 查询名字中包含n,且(年龄小于18或email为空的用户),并将这些用户的年龄设置为18,邮箱设置为 user@atguigu.com 
1 2 3 4 5 6 7 8 9 10 11 12 13 @Test public  void  test4 ()  new  QueryWrapper<>();"name" , "n" )"age" , 18 ).or().isNull("email" )); new  User();18 );"user@atguigu.com" );int  result = userMapper.update(user, queryWrapper);
5、例5:组装select子句 
查询所有用户的用户名和年龄
1 2 3 4 5 6 7 8 9 @Test public  void  test5 ()  new  QueryWrapper<>();"name" , "age" );
6、例6:实现子查询 查询id不大于3的所有用户的id列表
1 2 3 4 5 6 7 8 @Test public  void  test6 ()  new  QueryWrapper<>();"id" , "select id from user where id <= 3" );
但上面的方式容易引发sql注入
1 queryWrapper.inSql("id" , "select id from user where id <= 3 or true" ); 
可是使用下面的查询方式替换
1 2 3 queryWrapper.in("id" , 1 , 2 , 3  );"id" , 3  );
三、UpdateWrapper 例7:需求同例4 查询名字中包含n,且(年龄小于18或email为空的用户),并将这些用户的年龄设置为18,邮箱设置为 user@atguigu.com 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 @Test public  void  test7 ()  new  UpdateWrapper<>();"age" , 18 )"email" , "user@atguigu.com" )"name" , "n" )"age" , 18 ).or().isNull("email" )); new  User();int  result = userMapper.update(user, updateWrapper);
四、condition 例8:动态组装查询条件 查询名字中包含n,年龄大于10且小于20的用户,查询条件来源于用户输入,是可选的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @Test public  void  test8 ()  null ;10 ;20 ;new  QueryWrapper<>();if (StringUtils.isNotBlank(name)){"name" ,"n" );if (ageBegin != null ){"age" , ageBegin);if (ageEnd != null ){"age" , ageEnd);
上面的实现方案没有问题,但是代码比较复杂,我们可以使用带condition参数的重载方法构建查询条件,简化代码的编写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 @Test public  void  test8Condition ()  null ;10 ;20 ;new  QueryWrapper<>();"name" , "n" )null , "age" , ageBegin)null , "age" , ageEnd);
五、LambdaXxxWrapper 1、例9:Query - 需求同例8 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 @Test public  void  test9 ()  null ;10 ;20 ;new  LambdaQueryWrapper<>();"n" )null , User::getAge, ageBegin)null , User::getAge, ageEnd);
2、例10:Update - 需求同例4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 @Test public  void  test10 ()  new  LambdaUpdateWrapper<>();18 )"user@atguigu.com" )"n" )18 ).or().isNull(User::getEmail)); new  User();int  result = userMapper.update(user, updateWrapper);