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);
    }
相关推荐
Data_agent几秒前
京东图片搜索商品API,json数据返回
数据库·python·json
HTouying1 分钟前
线程池【工具类】
java
深盾科技7 分钟前
融合C++与Python:兼顾开发效率与运行性能
java·c++·python
我待_JAVA_如初恋7 分钟前
idea创建MavenJavaWeb项目以后,包结构缺java
java·ide·intellij-idea
来深圳13 分钟前
leetcode 739. 每日温度
java·算法·leetcode
CC大煊17 分钟前
【java】Druid数据库连接池完整配置指南:从入门到生产环境优化
java·数据库·springboot
学Linux的语莫24 分钟前
mysql主从同步(复制)搭建
数据库·mysql
SelectDB30 分钟前
慢 SQL 诊断准确率 99.99%,天翼云基于 Apache Doris MCP 的 AI 智能运维实践
数据库·人工智能·apache
JIngJaneIL31 分钟前
基于java+ vue交友系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·交友
苹果酱056738 分钟前
解决linux mysql命令 bash: mysql: command not found 的方法
java·vue.js·spring boot·mysql·课程设计