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);
    }
相关推荐
有味道的男人1 小时前
速卖通商品详情接口(速卖通API系列)
java·大数据·数据库
一只小透明啊啊啊啊1 小时前
垃圾回收算法有哪些
java·jvm
DanB241 小时前
Java(网络编程)
java·网络·php
蟹至之1 小时前
【MySQL】用户和权限管理
数据库·mysql·权限
5***84641 小时前
Spring全家桶简介
java·后端·spring
u***1371 小时前
Tomcat的server.xml配置详解
xml·java·tomcat
沐夜听风1 小时前
MySQL的主从---1
数据库·mysql·主从原理
1***35771 小时前
SQL之CASE WHEN用法详解
数据库·python·sql
lnnn~1 小时前
2025美亚杯个人赛WP
数据库·网络安全