mybatis-plus wrapper使用_Mybatis Plus QueryWrapper使用详解

QueryWrapper是Mybatis Plus中一个优雅的条件拼装查询器,作用是让我们以Java对象的方式构建where之后的查询条件,不用直接写SQL。

204430faddb67bc5d6ee1b36f0c656f1.png

Mybatis Plus QueryWrapper使用详解

QueryWrapper的使用上也是非常简单,整体思路和写SQL是非常相似的,我们来看一下下面的示例。

1、多条件匹配查询,并且多个条件之间是AND的关系

相当于sql中的 where 列名1= xxx and 列名2= xxx

源码中的方法定义:

default  Children allEq(Map params) {        return allEq(params, true);    }

代码:

    @Test    public void testAllEq() {        System.out.println(("----- allEq method test ------"));        QueryWrapper wrapper = new QueryWrapper();        Map map = new HashMap<>();        map.put("Name", "Jack");        map.put("Age", "20");        wrapper.allEq(map);        List userList = userMapper.selectList(wrapper);        userList.forEach(System.out::println);    }

输出:

==>  Preparing: SELECT id,name,age,email FROM user WHERE (Age = ? AND Name = ?) ==> Parameters: 20(String), Jack(String)<==    Columns: ID, NAME, AGE, EMAIL<==        Row: 2, Jack, 20, test2@baomidou.com<==      Total: 1User(id=2, name=Jack, age=20, email=test2@baomidou.com)

2、单个条件匹配查询,也就是指定一个字段和这个字段对应要匹配的值

相当于SQL的 where 列=xxx

源码中的方法定义:

default Children eq(R column, Object val) {        return eq(true, column, val);    }

代码:

    @Test    public void testEq() {        System.out.println(("----- eq method test ------"));        QueryWrapper wrapper = new QueryWrapper();        wrapper.eq("Name","Jack");        List userList = userMapper.selectList(wrapper);        userList.forEach(System.out::println);    }

输出:

==>  Preparing: SELECT id,name,age,email FROM user WHERE (Name = ?) ==> Parameters: Jack(String)<==    Columns: ID, NAME, AGE, EMAIL<==        Row: 2, Jack, 20, test2@baomidou.com<==      Total: 1User(id=2, name=Jack, age=20, email=test2@baomidou.com)

3、不等于查询,也就是排除掉某些数据

相当于SQL中的 where 列 != xxx

也可以写成

where 列 <> xxx

源码中的方法定义:

default Children ne(R column, Object val) {        return ne(true, column, val);    }

代码:

    @Test    public void testNe() {        System.out.println(("----- eq method test ------"));        QueryWrapper wrapper = new QueryWrapper();        wrapper.ne("Name","Jack");        List userList = userMapper.selectList(wrapper);        userList.forEach(System.out::println);    }

输出:

==>  Preparing: SELECT id,name,age,email FROM user WHERE (Name <> ?) ==> Parameters: Jack(String)<==    Columns: ID, NAME, AGE, EMAIL<==        Row: 1, Jone, 18, test1@baomidou.com<==        Row: 3, Tom, 28, test3@baomidou.com<==        Row: 4, Sandy, 21, test4@baomidou.com<==        Row: 5, Billie, 24, test5@baomidou.com<==      Total: 4User(id=1, name=Jone, age=18, email=test1@baomidou.com)User(id=3, name=Tom, age=28, email=test3@baomidou.com)User(id=4, name=Sandy, age=21, email=test4@baomidou.com)User(id=5, name=Billie, age=24, email=test5@baomidou.com)

4、大于操作

相当于SQL的 where 列 > xxx

源码中的方法定义:

default Children gt(R column, Object val) {        return gt(true, column, val);    }

代码:查询年龄大于22岁的

    @Test    public void testGt() {        System.out.println(("----- gt method test ------"));        QueryWrapper wrapper = new QueryWrapper();        wrapper.gt("Age","22");        List userList = userMapper.selectList(wrapper);        userList.forEach(System.out::println);    }

输出:

==>  Preparing: SELECT id,name,age,email FROM user WHERE (Age > ?) ==> Parameters: 22(String)<==    Columns: ID, NAME, AGE, EMAIL<==        Row: 3, Tom, 28, test3@baomidou.com<==        Row: 5, Billie, 24, test5@baomidou.com<==      Total: 2User(id=3, name=Tom, age=28, email=test3@baomidou.com)User(id=5, name=Billie, age=24, email=test5@baomidou.com)

mybatis-plus还有相似的方法如 ge是大于等于,lt是小于,le是小于等于

5、配置一个有起始和结束区间的查询条件

SQL中的 between xxx and xxx

源码中的方法定义:

default Children between(R column, Object val1, Object val2) {        return between(true, column, val1, val2);    }

源码中的方法定义:

    @Test    public void testBetween() {        System.out.println(("----- between method test ------"));        QueryWrapper wrapper = new QueryWrapper();        wrapper.between("Age","21","25");        List userList = userMapper.selectList(wrapper);        userList.forEach(System.out::println);    }

输出:

==>  Preparing: SELECT id,name,age,email FROM user WHERE (Age BETWEEN ? AND ?) ==> Parameters: 21(String), 25(String)<==    Columns: ID, NAME, AGE, EMAIL<==        Row: 4, Sandy, 21, test4@baomidou.com<==        Row: 5, Billie, 24, test5@baomidou.com<==      Total: 2User(id=4, name=Sandy, age=21, email=test4@baomidou.com)User(id=5, name=Billie, age=24, email=test5@baomidou.com)

另外,还有与之相似的 notBetween方法,相信看名字你也知道它的作用。

6、模糊查找,like

源码中的方法定义:

    default Children like(R column, Object val) {        return like(true, column, val);    }

代码:

    @Test    public void testLike() {        System.out.println(("----- like method test ------"));        QueryWrapper wrapper = new QueryWrapper();        wrapper.like("Name", "Ja");        List userList = userMapper.selectList(wrapper);        userList.forEach(System.out::println);    }

输出:

==>  Preparing: SELECT id,name,age,email FROM user WHERE (Name LIKE ?) ==> Parameters: %Ja%(String)<==    Columns: ID, NAME, AGE, EMAIL<==        Row: 2, Jack, 20, test2@baomidou.com<==      Total: 1User(id=2, name=Jack, age=20, email=test2@baomidou.com)

还有相似功能的方法:notLike、likeLeft、likeRight

7、查找指定的某列值为空

SQL中的 is null

源码中的方法定义:

    default Children isNull(R column) {        return isNull(true, column);    }

代码:

    @Test    public void testIsNull() {        System.out.println(("----- isNull method test ------"));        QueryWrapper wrapper = new QueryWrapper();        wrapper.isNull("Name");        List userList = userMapper.selectList(wrapper);        userList.forEach(System.out::println);    }

输出:

==>  Preparing: SELECT id,name,age,email FROM user WHERE (Name IS NULL) ==> Parameters: <==      Total: 0

还有类似的方法:isNotNull

8、匹配多个值

SQL中的 in(x,xx, xxx)

源码中的方法定义:

    default Children in(R column, Object... values) {        return in(true, column, values);    }

代码:

    @Test    public void testIn() {        System.out.println(("----- in method test ------"));        QueryWrapper wrapper = new QueryWrapper();        wrapper.in("Age",20,21,22,23);        List userList = userMapper.selectList(wrapper);        userList.forEach(System.out::println);    }

输出:

==>  Preparing: SELECT id,name,age,email FROM user WHERE (Age IN (?,?,?,?)) ==> Parameters: 20(Integer), 21(Integer), 22(Integer), 23(Integer)<==    Columns: ID, NAME, AGE, EMAIL<==        Row: 2, Jack, 20, test2@baomidou.com<==        Row: 4, Sandy, 21, test4@baomidou.com<==      Total: 2User(id=2, name=Jack, age=20, email=test2@baomidou.com)User(id=4, name=Sandy, age=21, email=test4@baomidou.com)

类似的方法:notIn、inSql、notInSql

我们使用in的时候,有时候会使用子查询,也就是in的括号里是一个sql语句,inSql、notInSql两个方法就是支持sql语句的in语法。

8、数据分组

SQL:groupBy

源码中的方法定义:

    default Children groupBy(R column) {        return groupBy(true, column);    }

代码:按照年龄求所有人的年龄分组列表,也就是看看当前表里所有人都在哪个年龄

    @Test    public void testGroupBy() {        System.out.println(("----- groupBy method test ------"));        LambdaQueryWrapper lqw = new LambdaQueryWrapper();        lqw.groupBy(User::getAge).select(User::getAge);        List userList = userMapper.selectList(lqw);        userList.forEach(System.out::println);    }

输出:

==>  Preparing: SELECT age FROM user GROUP BY age ==> Parameters: <==    Columns: AGE<==        Row: 18<==        Row: 20<==        Row: 21<==        Row: 24<==        Row: 28<==      Total: 5User(id=null, name=null, age=18, email=null)User(id=null, name=null, age=20, email=null)User(id=null, name=null, age=21, email=null)User(id=null, name=null, age=24, email=null)User(id=null, name=null, age=28, email=null)

9、按照指定属性列的顺序排序,并输出数据

SQL:ORDER BY

源码中的方法定义:

    default Children orderByAsc(R column) {        return orderByAsc(true, column);    }

代码:

    @Test    public void testOrderBy() {        System.out.println(("----- orderBy method test ------"));        QueryWrapper wrapper = new QueryWrapper();        wrapper.orderByAsc("Age");        List userList = userMapper.selectList(wrapper);        userList.forEach(System.out::println);    }

输出:

==>  Preparing: SELECT id,name,age,email FROM user ORDER BY Age ASC ==> Parameters: <==    Columns: ID, NAME, AGE, EMAIL<==        Row: 1, Jone, 18, test1@baomidou.com<==        Row: 2, Jack, 20, test2@baomidou.com<==        Row: 4, Sandy, 21, test4@baomidou.com<==        Row: 5, Billie, 24, test5@baomidou.com<==        Row: 3, Tom, 28, test3@baomidou.com<==      Total: 5User(id=1, name=Jone, age=18, email=test1@baomidou.com)User(id=2, name=Jack, age=20, email=test2@baomidou.com)User(id=4, name=Sandy, age=21, email=test4@baomidou.com)User(id=5, name=Billie, age=24, email=test5@baomidou.com)User(id=3, name=Tom, age=28, email=test3@baomidou.com)

QueryWrapper提供的条件配置方法还有很多,基本完全覆盖了我们平时开发中的所需要写的SQL场景,大家可以动手写一写,练一练,感受一下QueryWrapper使用便携性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值