Mybatis-plus中Wrapper、QueryWrapper、UpdateWrapper、lambdaQueryWrapper、lambdaUpdateWrapper
在项目中使用时,需导入mybatis-plus的jar包,maven项目需要在pom.xml文件中加入如下代码:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
version中填入版本号,建议使用最新版本,目前官方最新版本为2022.2.14更新的3.5.1版本,最新版本请去GitHub上寻找,GitHub地址如下:
mybatis-plus 最新github地址
关于Wrapper、QueryWrapper、UpdateWrapper、lambdaQueryWrapper、lambdaUpdateWrapper之间有什么不同这里也简单说一下,后面四个都来源于wrapper这个抽象类,下面来看一下源码
lambdaQueryWrapper:
public class LambdaQueryWrapper<T> extends AbstractLambdaWrapper<T, LambdaQueryWrapper<T>> implements Query<LambdaQueryWrapper<T>, T, SFunction<T, ?>> {...}
lambdaUpdateWrapper:
public class LambdaUpdateWrapper<T> extends AbstractLambdaWrapper<T, LambdaUpdateWrapper<T>> implements Update<LambdaUpdateWrapper<T>, SFunction<T, ?>> {...}
QueryWrapper:
public class QueryWrapper<T> extends AbstractWrapper<T, String, QueryWrapper<T>> implements Query<QueryWrapper<T>, T, String> {...}
UpdateWrapper:
public class UpdateWrapper<T> extends AbstractWrapper<T, String, UpdateWrapper<T>> implements Update<UpdateWrapper<T>, String> {...}
这里可以看到,LambdaQueryWrapper和LambdaUpdateWrapper都继承自AbstractLambdaWrapper,那我们来看看AbstractLambdaWrapper的源码:
public abstract class AbstractLambdaWrapper<T, Children extends AbstractLambdaWrapper<T, Children>> extends AbstractWrapper<T, SFunction<T, ?>, Children> {...}
我们可以看到,AbstractLambdaWrapper是一个抽象类,和QueryWrapper、UpdateWrapper一样继承自AbstractWrapper抽象类,我们来看AbstractWrapper的源码:
public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T, R, Children>> extends Wrapper<T> implements Compare<Children, R>, Nested<Children, Children>, Join<Children>, Func<Children, R> {...}
AbstractWrapper抽象类继承自Wrapper。那Wrapper上面还有没有呢?看一下源码:
public abstract class Wrapper<T> implements ISqlSegment {...}
Wrapper没有再继承其他类,所以他们的关系是下面这样:
相关函数
eq
等于 =
代码:
wrapper.eq(User::getName,'张三')
等价于sql:
name = '张三'
ne
不等于 <>
同上
gt
大于 >
同上
ge
大于等于 >=
同上
lt
小于<
同上
le
小于等于<=
同上
between、notBetween
代码:
wrapper.between(User::getAge,18,30).notBetween(User::getAge,26,28)
等价于sql:
age between 18 and 30
and age not between 26 and 28
like、notLike、likeLeft、likeRight
模糊匹配
代码:
wrapper.like(User::getName,'三');
wrapper.notLike(User::getName,'三');
wrapper.likeLeft(User::getName,'三');
wrapper.likeRight(User::getName,'三');
对应sql:
name like '%三%';
name not like '%三%';
name like '%三';
name like '三%';
isNull、isNotNull
不为空
代码:
wrapper.isNull(User::getName);
wrapper.isNotNull(User::getName);
等价于:
name is null;
name is not null;
in、notIn
代码:
in(User::getAge,{17,18,19})
等价于sql:
age in (17,18,19)
inSql、notInSql
代码:
wrapper.inSql(User1::getAge, "select age from user2");
wrapper.notInSql(User1::getAge, "select age from user2");
等价于sql:
user1.age in (select age from user2);
user1.age not in (select age from user2);
groupBy
代码:
wapper.groupBy(User::getType)
等价于sql:
groupBy type
orderBy、orderByAsc、orderByDesc
排序,ASC为顺序,DESC为逆序,sql中使用orderBy默认为顺序
代码:
wapper.orderByAsc(User::getAge)
wapper.order(true,true,User::getAge)
等价于sql:
orderBy age ASC
orderBy age ASC
使用
haveing
代码:
wrapper.having("sum(num) > {0}", 10)
等价于sql:
having sum(num) > 10
注意,这里的having必须用在聚合函数之后,也就是having后的判断字段必须是聚合函数返回的结果
or、and
sql中and的优先级高于or,如果不用.or()方法,默认用and连接
代码:
wrapper.eq(User::getName,"Ance").eq(User::getAge, 18);
Wrapper.eq(User::getAge, 18).or().eq(User::getName,"Ance");
等价于sql:
name = 'Ance' and age = 18;
age = 18 or name = 'Ance'
apply
拼接sql
last
无视优化规则直接拼接到sql最后
exists
拼接EXISTS(SQL语句)
notExists
拼接NOT EXISTS(SQL语句)
nested
正常嵌套不带and和or