mybatis-plus的条件构造器(wapper相关接口)

Java知识点总结:想看的可以从这里进入

3.4、wapper条件构造器

  • Wrapper : 条件构造抽象类,最顶端父类
    • AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
      • QueryWrapper : 查询条件封装
      • UpdateWrapper : Update 条件封装
      • AbstractLambdaWrapper : 使用Lambda 语法
        • LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
        • LambdaUpdateWrapper : Lambda 更新封装Wrapper
    • AbstractChainWrapper
      • LambdaUpdateChainWrapper
      • LambdaUpdateChainWrapper
      • UpdateChainWrapper
      • QueryChainWrapper
3.4.1、AbstractWrapper

AbstractWrapper 及其子类主要用来生成 where 后的sql 条件。类似动态SQL生成。

1、allEq

可以拼接所有符合条件的数据。(= 或 is null)

image-20230306142003238

  1. 不包含null

    @Test
    public void testServcie(){
        //使用条件构造器创建条件
        QueryWrapper<User> userWrapper =  new QueryWrapper<>();
        Map<String,String> map = new HashMap<>();
        map.put("username","root");
        map.put("password","123456");
        userWrapper.allEq(map);
        //传递条件构造器
        User one = userService.getOne(userWrapper);
        System.out.println(one);
    }
    
    image-20230306142500494
  2. 包含null

    • 不含 null2IsNull 参数

      @Test
      public void testServcie(){
          //使用条件构造器创建条件
          QueryWrapper<User> userWrapper =  new QueryWrapper<>();
          Map<String,String> map = new HashMap<>();
          map.put("username","root");
          map.put("password",null);
          userWrapper.allEq(map);
          //传递条件构造器
          User one = userService.getOne(userWrapper);
          System.out.println(one);
      }
      
      image-20230306142803766
    • ​ 含 null2IsNull 参数

      @Test
      public void testServcie(){
          //使用条件构造器创建条件
          Map<String,String> map = new HashMap<>();
          map.put("username","admin");
          map.put("password",null);
      
          QueryWrapper<User> userWrapper1 =  new QueryWrapper<>();
          userWrapper1.allEq(map,true);
          //传递条件构造器
          User one = userService.getOne(userWrapper1);
          System.out.println("null2IsNull 为true:"+one);
      
          QueryWrapper<User> userWrapper2 =  new QueryWrapper<>();
          userWrapper2.allEq(map,false);
          //传递条件构造器
          User one1 = userService.getOne(userWrapper2);
          System.out.println("null2IsNull 为false:"+one1);
      }
      
      image-20230306143748545
  3. 过滤器过滤出指定的条件,只要符合条件的参数才会被拼接

    @Test
    public void testServcie(){
        QueryWrapper<User> userWrapper =  new QueryWrapper<>();
        Map<String,String> map = new HashMap<>();
        map.put("user_id","1");
        map.put("username","admin");
        map.put("password","123456");
        //只要username和password的参数才会有效
        userWrapper.allEq((k,v)->(k.equals("username") || k.equals("password") ),map);
        User one = userService.getOne(userWrapper);
    }
    

    image-20230306164237287

2、比较运算符拼接
  1. eq:等于

    image-20230306153305848
  2. ne:不等于<>

    image-20230306153647997

  3. gt:大于>

    image-20230306153903114
  4. ge:大于等于>=

    image-20230306154202403
  5. lt:小于<

    image-20230306164618454
  6. le:小于等于 <=

    image-20230306164607637
  7. between:在某个区间内 BETWEEN [ ] AND [ ]

    image-20230306154951583
  8. notBetween:不在区间内 NOT BETWEEN [] AND []

    image-20230306155121043
  9. isNull、isNotNull:专门用来判断是否为null

    image-20230306155523509

  10. in:判断是否在集合中

    image-20230306155618317
  11. notIn:和in相反

    image-20230306155701218
@Test
public void testServcie(){
    QueryWrapper<User> userWrapper =  new QueryWrapper<>();
    //id在(1,2,3,4,5,6,7,8,9),且deleted为1,且密码不为123456的
    userWrapper.in("user_id",1,2,3,4,5,6,7,8,9)
            .eq("deleted",1)
            .ne("password","123456");
    List<User> list = userService.list(userWrapper);
    list.forEach(System.out::println);
}

image-20230306165332853

image-20230306165315462
3、子查询
  1. inSql:in 后面可以跟集合,也可以跟一个select语句

  2. notinSQL:和inSql相反image-20230306155906636

  3. exists:拼接 EXISTS ( sql语句 )

    image-20230306162633293
  4. notExists

    image-20230306162652444

4、GROUP BY分组

需要配合 QueryWrapper 中 select 方法使用。

  1. groupBu:分组

    image-20230306160151874
  2. having:对分组后的数据进行过滤

    image-20230306160625155

5、ORDER BY排序
  1. orderByAsc:相当于 ORDER BY 字段, … ASC。升序排列

    image-20230306160356627
  2. orderByDesc:相当于 ORDER BY 字段, … DESC。降序排列

  3. orderBy:相当于 ORDER BY 字段, …

    image-20230306160445777
@Test
public void testServcie(){
    QueryWrapper<User> userWrapper =  new QueryWrapper<>();
    //逆序
    userWrapper.in("user_id",1,2,3)
            .orderBy(true,false,"user_id");
    List<User> list = userService.list(userWrapper);
    list.forEach(System.out::println);
}

image-20230306165749657

6、逻辑符号

and 和 or 方法都是可以嵌套的。

  1. AND():默认的拼接都是AND

    image-20230306161843594

    @Test
        public void testServcie(){
            QueryWrapper<User> userWrapper =  new QueryWrapper<>();
            userWrapper.eq("user_id",1)
                    .eq("username","root");
            List<User> list = userService.list(userWrapper);
            list.forEach(System.out::println);
        }
    
    image-20230306170104773
  2. OR():将默认的AND 变成OR

    image-20230306161732583
    @Test
    public void testServcie(){
        QueryWrapper<User> userWrapper =  new QueryWrapper<>();
        userWrapper.eq("user_id",1)
                .or().eq("username","root");
        List<User> list = userService.list(userWrapper);
        list.forEach(System.out::println);
    }
    
    image-20230306170025772
  3. nested:正常嵌套 不带 AND 或者 OR

    image-20230306162428292

7、apply

该方法可用于数据库函数 动态入参的params对应前面applySql内部的{index}部分.这样是不会有sql注入风险的,反之会有!

image-20230306162512756

8、模糊查询
  1. like:用于模糊匹配

    image-20230306155323283
  2. notLike,和like相反

    image-20230306155402930
@Test
public void testServcie(){
    QueryWrapper<User> userWrapper =  new QueryWrapper<>();
    //密码包含123的
    userWrapper.in("user_id",1,2,3,4,5)
                .like("password","%123%");
    List<User> list = userService.list(userWrapper);
    list.forEach(System.out::println);
}

image-20230306170404826

3.4.2、QueryWrapper

QueryWrapper 继承 AbstractWrapper,主要用于查询数据,select 是用来明确返回那些字段

image-20230306162830672

配合之前的分组查询进行测试

@Test
public void testServcie(){
    QueryWrapper<User> userWrapper =  new QueryWrapper<>();

    //返回字段 deleted,  COUNT(*),  GROUP_CONCAT(username)  
    userWrapper.select("deleted, COUNT(*),GROUP_CONCAT(username)")
            .in("user_id",1,2,3,4,5)
            .groupBy("deleted");

    List<Map<String, Object>> maps = userService.listMaps(userWrapper);
    maps.forEach(System.out::println);
}

image-20230306171525703

3.4.3、UpdateWrapper

继承自 AbstractWrapper,主要用于数据的增伤改。

1、set

SQL 的 SET 字段。

image-20230306172435153
@Test
public void testServcie(){
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper.eq("user_id",9)
            .set("username","updateWrapper")
            .set("password","8000");
    boolean update = userService.update(updateWrapper);
    System.out.println(update);

}
image-20230306173728998
2、setSql

和set是类似的,只不过参数的形式不一样。

image-20230306174059276

@Test
public void testServcie(){
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    //setSql是在一个参数里写的条件,没有将字段和值分开
    updateWrapper.eq("user_id",9)
            .setSql("username='setSql'")
            .setSql("password='753159'");
    boolean update = userService.update(updateWrapper);
    System.out.println(update);
}
3.4.4、支持Lambda

LambdaUpdateWrapper 和 LambdaQueryWrapper 的使用其实是类似的,只不过这两个类可以直接使用Lambda的表达式。

获取方式:

//1、直接创建LambdaUpdateWrapper 和 LambdaQueryWrapper 
LambdaUpdateWrapper<User> lambda =new LambdaUpdateWrapper<>();
LambdaQueryWrapper<User> lambda1 = new LambdaQueryWrapper<>();

//2、可以直接使用 QueryWrapper 和 UpdateWrapper 提供的lambda();方法
LambdaQueryWrapper<User> lambda1 = queryWrapper.lambda();
LambdaUpdateWrapper<User> lambda2 = updateWrapper.lambda();
@Test
public void testServcie(){
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//可以使用lambda表达式形式的参数
updateWrapper.lambda()
        .set(User::getUsername,"lambda表达式")
        .set(User::getPassword,"2312312");

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰 羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值