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);
    }
相关推荐
马克Markorg6 小时前
常见的向量数据库和具有向量数据库能力的数据库
数据库
JH30737 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
Coder_Boy_8 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
玉梅小洋8 小时前
Windows 10 Android 构建配置指南
android·windows
helloworldandy8 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
invicinble9 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟9 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖9 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
数据知道10 小时前
PostgreSQL 故障排查:如何找出数据库中最耗时的 SQL 语句
数据库·sql·postgresql
qq_124987075310 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计