mybatis-plus条件构造器的操作代码

 更新时间:2022年03月24日 10:27:02   作者:流楚丶格念  
mybatis-plus提供了AbstractWrapper抽象类,提供了很多sql语法支持的方法,比如模糊查询,比较,区间,分组查询,排序,判断空,子查询等等,方便我们用面向对象的方式去实现sql语句,本文重点给大家介绍mybatis-plus条件构造器的操作代码,感兴趣的朋友一起看看吧

条件构造器

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

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

Wrapper中基本比较操作

操作方法方法说明
eq等于 =
ne不等于 <>
gt大于 >
ge大于等于 >=
lt小于 <
le小于等于 <=
betweenBETWEEN 值1 AND 值2
notBetweenNOT BETWEEN 值1 AND 值2
in字段 IN (value.get(0), value.get(1), …)
notIn字段 NOT IN (v0, v1, …)

测试案例:

    @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> 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);

到此这篇关于mybatis-plus条件构造器的文章就介绍到这了,更多相关mybatis-plus条件构造器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java之SM4加密解密的实现

    Java之SM4加密解密的实现

    这篇文章主要介绍了Java之SM4加密解密的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Mybatis Plus 自定义方法实现分页功能的示例代码

    Mybatis Plus 自定义方法实现分页功能的示例代码

    这篇文章主要介绍了Mybatis Plus 自定义方法实现分页功能的示例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 关于SpringBoot中事务失效的几种情况

    关于SpringBoot中事务失效的几种情况

    这篇文章主要介绍了关于SpringBoot中事务失效的几种情况,Spring AOP默认使用动态代理,会给被代理的类生成一个代理类,事务相关的操作都通过代理来完成,使用内部方法调用时,使用的是实例调用,没有通过代理类调用方法,因此事务不会检测到失败,需要的朋友可以参考下
    2023-08-08
  • java中文传值乱码问题的解决方法

    java中文传值乱码问题的解决方法

    这篇文章主要为大家详细介绍了java中文传值乱码问题的解决方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • 关于Selenium的UI自动化测试屏幕截图功能实例代码

    关于Selenium的UI自动化测试屏幕截图功能实例代码

    今天小编就为大家分享一篇关于Selenium的UI自动化测试屏幕截图功能实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 安装IDEA和配置Maven的步骤详解

    安装IDEA和配置Maven的步骤详解

    这篇文章主要介绍了安装IDEA和配置Maven的步骤详解,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Springboot 使用 JSR 303 对 Controller 控制层校验及 Service 服务层 AOP 校验 使用消息资源文件对消息国际化

    Springboot 使用 JSR 303 对 Controller 控制层校验及 Service 服务层 AOP 校验

    这篇文章主要介绍了Springboot 使用 JSR 303 对 Controller 控制层校验及 Service 服务层 AOP 校验 使用消息资源文件对消息国际化的相关知识,需要的朋友可以参考下
    2017-12-12
  • java实现http请求工具类示例

    java实现http请求工具类示例

    这篇文章主要介绍了java实现http请求工具类示例,需要的朋友可以参考下
    2014-05-05
  • 详解Java程序并发的Wait-Notify机制

    详解Java程序并发的Wait-Notify机制

    这篇文章主要介绍了详解Java程序并发的Wait-Notify机制,多线程并发是Java编程中的重要部分,需要的朋友可以参考下
    2015-07-07
  • 基于SpringBoot多线程@Async的使用体验

    基于SpringBoot多线程@Async的使用体验

    这篇文章主要介绍了SpringBoot多线程@Async的使用体验,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12

最新评论