MyBatisPlus的条件构造器

一、Wrapper类层次结构

Wrapper : 条件构造抽象类,最顶端父类

  • AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件

--- QueryWrapper : 查询条件封装

--- UpdateWrapper : Update 条件封装

---AbstractLambdaWrapper : 使用Lambda 语法

------ LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper

------- LambdaUpdateWrapper : Lambda 更新封装Wrapper

二、QueryWrapper完整示例

1. 组装查询条件(AND组合)
java 复制代码
//    QueryWrapper
//    1.组装查询条件,queryWrapper不可使用lamdbaWrapper的语法如实体类::get字段名,否则会报错
    @Test
    public void Test01(){
        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        queryWrapper.like("name","s")
                .between("age",21,25)
                .isNotNull("a_email");
        List<User> results=userService.list(queryWrapper);
        results.forEach(System.out::println);
    }

动态条件拼接逻辑参考

2. 组装排序条件
java 复制代码
//    2.组装排序条件,Asc升序,Desc降序
     @Test
     public void Test02(){
         QueryWrapper<User> queryWrapper=new QueryWrapper<>();
//         queryWrapper.orderByAsc("id").like("name","s");
         queryWrapper.orderByDesc("id").like("name","s");

         List<User> results=userService.list(queryWrapper);
         results.forEach(System.out::println);
    }
3. 组装删除条件
java 复制代码
//    组装删除条件,实际是逻辑删除
    @Test
    public void Test03(){
        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        queryWrapper.isNull("a_email");
       boolean deleteResult=userService.remove(queryWrapper);
   }
4. 组装SELECT子句
java 复制代码
//   条件的优先级,and的优先级高于or的优先级,修改
//    SELECT u_id AS id,name,age,a_email AS email,is_deleted FROM c_user WHERE is_deleted=0 AND (name LIKE ? AND age > ? AND a_email IS NOT NULL)
    @Test
    public void Test04(){
        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        queryWrapper.like("name","s")
                .gt("age",20)
                .isNotNull("a_email");
        User user = new User();
        user.setAge(18);
        user.setEmail("user@qcby.com");
        boolean result= userService.update(user,queryWrapper);
    }
5. 条件的优先级
java 复制代码
//   条件的优先级,and的优先级高于or的优先级,修改
//    SELECT u_id AS id,name,age,a_email AS email,is_deleted FROM c_user WHERE is_deleted=0 AND (name LIKE ? AND age > ? AND a_email IS NOT NULL)
    @Test
    public void Test04(){
        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        queryWrapper.like("name","s")
                .gt("age",20)
                .isNotNull("a_email");
        User user = new User();
        user.setAge(18);
        user.setEmail("user@qcby.com");
        boolean result= userService.update(user,queryWrapper);
    }
//    条件的优先级
//     UPDATE c_user SET age=?, a_email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR a_email IS NULL))
//    所以这个sql的运行,先运行(age > ? OR a_email IS NULL),再运行其他的
    @Test
    public void Test05(){
        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        queryWrapper.like("name","s")
                .and(i->i.gt("age",20).or().isNull("a_email"));
        User user = new User();
        user.setAge(18);
        user.setEmail("user@qcby.com");
        boolean result= userService.update(user,queryWrapper);
    }
6.组装 select 子句
java 复制代码
//5.组装select子句,这个是指定查询的字段
    @Test
    public void Test06(){
        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        queryWrapper.select("name","age");
        userService.list(queryWrapper);

    }
7.实现子查询
java 复制代码
//    实现子查询
//    SELECT u_id AS id,name,age,a_email AS email,is_deleted FROM c_user WHERE is_deleted=0 AND (u_id IN (select u_id from c_user where u_id <= 3))
    @Test
    public void Test07(){
        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        queryWrapper.inSql("u_id","select u_id from c_user where u_id <= 3");
        userService.list(queryWrapper);
    }

三、UpdateWrapper完整示例

java 复制代码
//     UpdateWrapper
    @Test
    public void test07(){
        UpdateWrapper<User> updateWrapper=new UpdateWrapper<>();
        updateWrapper.set("age",18)
                .set("a_email", "user@qcby.com")
                .like("name", "s")
                .and(i->i.gt("age",20).or().isNull("a_email"));
        userService.update(updateWrapper);
    }

四、动态条件处理(Condition)

带Condition参数的重构
java 复制代码
  @Test
//    组装条件condition,if ,test
    public void test08(){
        String name=null;
        Integer ageBegin = 10;
        Integer ageEnd = 24;
        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        if (StringUtils.isNotBlank(name)){
            queryWrapper.like("name","s");
        }
        if(ageBegin !=null){
            queryWrapper.ge("age",ageBegin);
        }
        if(ageEnd!=null){
            queryWrapper.le("age",ageEnd);
        }
        userService.list(queryWrapper);
    }
java 复制代码
//    SELECT u_id AS id,name,age,a_email AS email,is_deleted FROM c_user WHERE is_deleted=0 AND (age >= ? AND age <= ?)
//    那个条件成立对应生成对应的where语句
    @Test
    public void test08UseCondition(){
        String name = null;
        Integer ageBegin = 10;
        Integer ageEnd = 24;
//        判断字符串 name 是否为「非空且包含有效字符」
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.like(StringUtils.isNotBlank(name),"name","s")
                .ge(ageBegin!=null,"age",20)
                .le(ageEnd!=null,"age",25);
        userService.list(queryWrapper);

    }

五、LambdaQueryWrapper完整示例

java 复制代码
//     LambdaQueryWrapper
        @Test
        public void test9(){
            String name = "s";
            Integer ageBegin = 10;
            Integer ageEnd = 24;
            LambdaQueryWrapper<User> queryWrapper=new LambdaQueryWrapper<>();
            queryWrapper.like(StringUtils.isNotBlank(name),User::getName,name)
                    .ge(ageBegin != null, User::getAge, ageBegin)
                    .le(ageEnd != null, User::getAge, ageEnd);

            userService.list(queryWrapper);
        }

六、LambdaUpdateWrapper完整示例

java 复制代码
//     LambdaUpdateWrapper
    @Test
    public void test10(){
        LambdaUpdateWrapper<User> updateWrapper=new LambdaUpdateWrapper<>();
        updateWrapper.set(User::getAge,18)
                .set(User::getEmail,"user@qcby.com")
                .like(User::getName, "s")
                .and(i->i.lt(User::getAge,24).or().isNull(User::getEmail));
        User user = new User();
        userService.update(user,updateWrapper);
    }

七,测试过滤器

java 复制代码
 @Test
    public void testWrapper(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();

// 1. JDK1.8 兼容:用 HashMap 创建查询字段候选集(替代 Map.of())
        Map<String, Object> queryMap = new HashMap<>();
        queryMap
                .put("id", 1);
        queryMap
                .put("name", "老王");
        queryMap
                .put("age", 30); // 取第二个代码的 age=30(替代原 null)

// 2. 保留原过滤器逻辑:只筛选字段名包含"a"的字段
        queryWrapper
                .allEq((field, value) -> field.contains("a"), queryMap);
        userService.listMaps(queryWrapper);
    }
相关推荐
非凡ghost2 小时前
AIMP(音乐播放软件)
前端·windows·音视频·firefox
xifangge20252 小时前
【2026终极解法】彻底解决“由于找不到 msvcp140.dll,无法继续执行代码”报错(附微软运行库一键修复包)
windows·mysql·microsoft·报错·开发环境
摇滚侠2 小时前
Windows 查看占用端口的进程,并关闭进程
windows
汤姆yu2 小时前
Windows系统下TRAE的安装与完整使用教程
windows·ai·trae·ai编程工具
维齐洛波奇特利(male)2 小时前
@Pointcut(“execution(* com.hdzx..*(..))“)切入点与aop 导致无限循环
java·开发语言
色空大师2 小时前
【日志文件配置详解】
java·logback·log4j2·日志
treacle田2 小时前
达梦数据库-达梦数据库中link链接访问远程Sql Sever-记录总结
数据库·达梦-sqlserver
ClouGence2 小时前
不用搭复杂系统,也能做跨地域数据迁移?
大数据·数据库·saas
xcjbqd02 小时前
SQL中视图能否嵌套存储过程_实现复杂自动化报表逻辑
jvm·数据库·python
迷藏4942 小时前
**发散创新:基于角色与属性的混合权限模型在微服务架构中的实战落地**在现代分布式系统中,
java·python·微服务·云原生·架构