mybaits-plus条件构造器

简介: mybaits-plus条件构造器

条件构造器


在MP中,Wrapper接口的实现类关系如下:



在MP查询中,还可以使用lambda方式查询,降低数据库列表写错的风险。


Wrapper中基本比较操作


image.png


测试案例:


    @Test
    public void testEqCp() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        //SELECT id,user_name,password,name,age,email FROM tb_user WHERE password = ? AND age >= ? AND name IN (?,?,?)
        wrapper.eq("password", "123456")
                .ge("age", 20)
                .in("name", "李四", "王五", "赵六");
        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }


也可以用Lambda方式构造条件:


    @Test
    public void testEqCp() {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        //SELECT id,user_name,password,name,age,email FROM tb_user WHERE password = ? AND age >= ? AND name IN (?,?,?)
        wrapper.eq(User::getPassword, "123456")
                .ge(User::getAge, 20)
                .in(User::getName, "李四", "王五", "赵六");
        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }


上面是最简单的查询方法,通常在开发中要根据表达式进行判断,表达式为true则拼接条件,如下:


eq(boolean condition, R column, Object val) 
in(boolean condition, R column, Object... values) ...


上面代码中的condition就是要进行计算的表达式,最终表达式结果为boolean类型。


举个例子:


比如根据name来判断,如果name不为空则拼接条件 String name = null;


wrapper.eq(User::getPassword, "123456") 
    .ge(User::getAge, 20) 
    .in(name!=null,User::getName, "李四", "王五", "赵六");


下面那个具体的案例,条件查询测试案例:


    @Test
    public void testEq3() {
        //条件
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        String name = null;
        Integer age = 20;
        queryWrapper.eq(name != null && !name.equals(""), User::getName, name);//等于
        queryWrapper.gt(age != null, User::getAge, age);//大于?
        List<User> users = userMapper.selectList(queryWrapper);
        System.out.println(users);
    }


模糊查询


like :


LIKE '%值%' 
例: like("name", "王") ---> name like '%王%'


notLike:


NOT LIKE '%值%' 
例: notLike("name", "王") ---> name not like '%王%'


likeLeft :


LIKE '%值' 
例: likeLeft("name", "王") ---> name like '%王'


likeRight :


LIKE '值%' 
例: likeRight("name", "王") ---> name like '王%'


测试案例:


    @Test
    public void testWrapper() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        //SELECT id,user_name,password,name,age,email FROM tb_user WHERE name LIKE ?
        //Parameters: %曹%(String)
        wrapper.likeRight("name", "曹");
        wrapper.select("id", "name","birthday");
        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }


运行结果为:



逻辑查询


or


拼接 OR 
主动调用 or 表示紧接着下一个**方法**不是用 and 连接!(不调用 or 则默认为使用 and 连接) 


and


AND 嵌套 
例: and(i -> i.eq("name", "李白").ne("status", "活着")) ---> and (name = '李白' and status <> '活着') 


测试案例:


    @Test
    public void testOr() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        //SELECT id,user_name,password,name,age,email FROM tb_user WHERE name = ? OR age = ?
        wrapper.eq("name", "李四").or().eq("age", 24);
        //变为and方式
        wrapper.eq("name", "李四").eq("age", 24);
        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }


将上面代码改为lambda方式构造条件:


    @Test
    public void testOr() {
      LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();    
        //SELECT id,user_name,password,name,age,email FROM tb_user WHERE name = ? OR age = ?
    wrapper.eq(User::getName,"李四").or().eq(User::getAge, 24);
        //变为and方式
        wrapper.eq(User::getName, "李四").eq(User::getAge", 24);
        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }


select


在MP查询中,默认查询所有的字段,如果有需要也可以通过select方法进行指定字段。

测试案例:


    @Test
    public void testWrapper() {
        QueryWrapper<User> wrapper = new QueryWrapper<>(); //SELECT id,name,age FROM tb_user WHERE name = ? OR age = ? 
        wrapper.eq("name", "李四")
                .or()
                .eq("age", 24)
                .select("id", "name", "age");
        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }


Lambda方式构造条件:


LambdaQueryWrapper<User> w


LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getName, "李四")
        .or()
        .eq(User::getAge, 24)
        .select(User::getId, User::getName, User::getAge);


排序


orderByAsc :升序排序


参数:变长数组,设置多个字段名 
例: orderByAsc("id", "name") ---> order by id ASC,name ASC


orderByDesc :降序排序


参数:变长数组,设置多个字段名 
例: orderByDesc("id", "name") ---> order by id DESC,name DESC


orderBy : 自定义排序规则


方法定义:orderBy(boolean condition, boolean isAsc, R... columns) 
参数1:true有效,false无效 ,参数2:是否升序,参数3..设置多个字段 
例: `orderBy(true, true, "id", "name")`‐‐‐>`order by id ASC,name ASC` 


也可以多个orderBy拼装,如下:


orderBy(true, true, "id").orderBy(true, true, "name")


效果同上面语句。


测试案例:


    @Test
    public void testOrder() {
        QueryWrapper<User> wrapper = new QueryWrapper<>(); 
        //SELECT id,user_name,password,name,age,email FROM tb_user ORDER BY age DESC 
        wrapper.orderByDesc("age");
        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }


Lambda方式构造条件:


LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); 
wrapper.orderByDesc(User::getAge);
相关文章
|
Java 数据库连接 Spring
Spring之数据校验:Validation
【1月更文挑战第17天】 一、Spring Validation概述 二、实验一:通过Validator接口实现 三、实验二:Bean Validation注解实现 四、实验三:基于方法实现校验 五、实验四:实现自定义校验
684 2
Spring之数据校验:Validation
|
运维 Kubernetes 监控
揭秘高效运维:如何用kubectl top命令实时监控K8s资源使用情况?
揭秘高效运维:如何用kubectl top命令实时监控K8s资源使用情况?
4527 0
|
缓存 资源调度 前端开发
微前端-qiankun:vue3-vite 接入 vue3、nuxt3、vue2、nuxt2等子应用
微前端-qiankun:vue3-vite 接入 vue3、nuxt3、vue2、nuxt2等子应用
2362 0
|
前端开发 JavaScript 开发者
React 按钮组件 Button
本文介绍了 React 中按钮组件的基础概念,包括基本的 `&lt;button&gt;` 元素和自定义组件。详细探讨了事件处理、参数传递、状态管理、样式设置和可访问性优化等常见问题及其解决方案,并提供了代码示例。帮助开发者避免易错点,提升按钮组件的使用体验。
613 77
|
6月前
|
XML 人工智能 Java
注入Java Bean的方式
本文总结了 Spring Boot 中常见的 Bean 注入方式,包括字段注入(`@Autowired`)、构造器注入(推荐)、Setter 方法注入、`@Resource` 按名称注入、`@Bean` 定义复杂 Bean、`@Value` 注入配置值、XML 配置、`ApplicationContextAware` 手动获取 Bean 以及 JSR-330 的 `@Inject`。同时分析了 Setter 注入逐渐被淡化的原因,强调构造器注入的不可变性和安全性优势,并推荐结合 Lombok 简化代码。文章还提供了按需选择注解的建议和最佳实践,帮助开发者根据场景选择合适的依赖注入方式。
413 49
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
3927 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
SQL 存储 关系型数据库
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
1088 56
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
|
算法 Java 数据处理
Java中MD5加密算法的实现
Java中MD5加密算法的实现
|
Java 测试技术 数据安全/隐私保护
Spring Boot | 一种优雅的参数校验方案(个人总结)
一种优雅的参数校验方案(个人总结)
1752 1
Spring Boot | 一种优雅的参数校验方案(个人总结)
|
安全 Java 开发者
Java反射:Spring Boot背后的魔法,让你的代码质量飞跃的神秘力量!
【8月更文挑战第29天】Java反射机制允许程序在运行时访问和修改类、接口、方法等属性,而Spring Boot则广泛应用反射实现依赖注入和自动配置。本文探讨如何利用反射机制提升Spring Boot应用的代码质量,包括动态类型处理、元数据访问及依赖注入等方面。通过实战示例展示动态调用方法和自定义注解处理,强调反射机制对代码灵活性与扩展性的贡献,同时提醒开发者注意性能和安全问题。
599 0