目录
1.Wrapper概述
1.1.Wrapper的继承关系
1.2.Wapper介绍
1.3.各个构造器使用区别
1.4.构造器常用方法
2.Wrapper常用构造器介绍
2.1.QueryWrapper
2.2.UpdateWrapper
2.3.LambdaQueryWrapper
2.4.AbstractWrapper
3. Lambda条件构造器
3.1.示例
4.鸣谢
MyBatis-Plus系列推荐阅读顺序:
- MyBatis-Plus快速上手
- MyBatis-Plus 条件构造器(Wrapper)
- Mybatis-Plus 常用操作
1.Wrapper概述
我们在实际操作数据库的时候会涉及到很多的条件。所以MP为我们提供了一个功能强大的条件构造器 Wrapper
。使用它可以让我们非常方便的构造条件。
Wrapper是MyBatis-Plus提供的一种查询条件封装类,用于构建查询条件。它是一个抽象类,有三个具体的实现类,分别是QueryWrapper、UpdateWrapper和LambdaQueryWrapper。其中,QueryWrapper和LambdaQueryWrapper用于构建查询条件,UpdateWrapper用于构建更新条件。
使用Wrapper可以方便地构建复杂的查询条件,支持链式调用,可以通过and、or等方法将多个条件组合起来。同时,Wrapper还提供了一些常用的方法,如eq、ne、gt、ge、lt、le等,可以方便地构建等值、不等值、大于、小于等各种条件。
另外,LambdaQueryWrapper是MyBatis-Plus 3.x新增的功能,它支持使用Lambda表达式构建查询条件,使得代码更加简洁易读。
1.1.Wrapper的继承关系
Wrapper 条件构造抽象类
-- AbstractWrapper 查询条件封装,用于生成 sql 中的 where 语句。
-- QueryWrapper Entity 对象封装操作类,用于查询。
-- UpdateWrapper Update 条件封装操作类,用于更新。
-- AbstractLambdaWrapper 使用 Lambda 表达式封装 wrapper
-- LambdaQueryWrapper 使用 Lambda 语法封装条件,用于查询。
-- LambdaUpdateWrapper 使用 Lambda 语法封装条件,用于更新。
MybatisPlus的
EntityWrapper
,在3.0版本以上就没了,改为了QueryWrapper。
1.2.Wapper介绍
Wrapper : 条件构造抽象类,最顶端父类
AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
QueryWrapper : Entity 对象封装操作类,不是用lambda语法
UpdateWrapper : Update 条件封装,用于Entity对象更新操作
AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
1.3.各个构造器使用区别
1)QueryWrapper、QueryChainWrapper只能指定需要的数据库列名
2)LambdaQueryWrapper、LambdaQueryChainWrapper可以通过Lambda获取数据库列名
3)QueryWrapper 、LambdaQueryWrapper不能使用链式查询的方式,必须借助BaseMapper来执行
4)QueryChainWrapper、LambdaQueryChainWrapper可以使用链式查询的方式,如list(),one()
1.4.构造器常用方法
eq:equals,等于
gt:greater than ,大于 >
ge:greater than or equals,大于等于≥
lt:less than,小于<
le:less than or equals,小于等于≤
between:相当于SQL中的BETWEEN
like:模糊匹配。like(“name”,“黄”),相当于SQL的name like ‘%黄%’
likeRight:模糊匹配右半边。likeRight(“name”,“黄”),相当于SQL的name like ‘黄%’
likeLeft:模糊匹配左半边。likeLeft(“name”,“黄”),相当于SQL的name like ‘%黄’
notLike:notLike(“name”,“黄”),相当于SQL的name not like ‘%黄%’
isNull
isNotNull
and:SQL连接符AND
or:SQL连接符OR
in: in(“age",{1,2,3})相当于 age in(1,2,3)
groupBy: groupBy(“id”,“name”)相当于 group by id,name
orderByAsc :orderByAsc(“id”,“name”)相当于 order by id ASC,name ASC
orderByDesc :orderByDesc (“id”,“name”)相当于 order by id DESC,name DESC
2.Wrapper常用构造器介绍
字面来理解,就是定义各种各样的条件,相当于sql语句中的(where),
wrapper条件构造器是一个接口,是一个顶级父类,它下面有各种实现类,今天重点介绍LambdaQueryWrapper和LambdaUpdateWrapper
2.1.QueryWrapper
QueryWrapper是用于查询的Wrapper条件构造器,可以通过它来构建SELECT语句中的WHERE条件
@Test
public void testQueryWrapper() {
// 查询条件构造器
QueryWrapper<BannerItem> wrapper = new QueryWrapper<>();
wrapper.eq("banner_id", id);
// 查询操作
List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);
//我们可以引入lambda,避免在代码中写类似的于banner_id的硬编码
QueryWrapper<BannerItem> wrapper = new QueryWrapper<>();
wrapper.lambda().eq(BannerItem::getBannerId, id);
List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);
}
2.2.UpdateWrapper
QueryWrapper是用于查询的Wrapper条件构造器,可以通过它来构建SELECT语句中的WHERE条件:
SQL SET 字段
例: set("name", "老李头")
例: set("name", "")--->数据库字段值变为空字符串
例: set("name", null)--->数据库字段值变为null
@Test
public void testUpdateWrapper() {
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("age", 20).eq("name", "张三");
int affectedRows = userMapper.update(null, updateWrapper);
}
2.3.LambdaQueryWrapper
Lambda条件构造器是一种更加便捷、类型安全的Wrapper条件构造器,可以通过Lambda表达式来构建WHERE条件
作用:
1.字段检查,防止字段写错
2.防止传入的数据为null作为条件
书写方式如下:
1.引入对象
2.调用函数
为了简化lambda的使用,我们可以改写成LambdaQueryWrapper构造器,语法如下:
LambdaQueryWrapper<BannerItem> wrapper = new QueryWrapper<BannerItem>().lambda();
wrapper.eq(BannerItem::getBannerId, id);
List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);
我们可以再次将QueryWrapper<BannerItem>.lambda()简化,变成这个样子
LambdaQueryWrapper<BannerItem> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(BannerItem::getBannerId, id);
List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);
链式查询
MyBatis-Plus还提供了一种链式查询的方式,和上面的代码效果一样。
但是这种写法偏向于炫技,可读性没有上面的代码强,大家可以根据需要自行选择方式。
List<BannerItem> bannerItems = new LambdaQueryChainWrapper<>(bannerItemMapper)
.eq(BannerItem::getBannerId, id)
.list();
如果只想查询一条记录,例如通过id查询某条记录的详情,使用.one()即可,例如
BannerItem bannerItem = new LambdaQueryChainWrapper<>(bannerItemMapper)
.eq(BannerItem::getId, id)
.one();
2.4.AbstractWrapper
完整的AbstractWrapper方法可以参照: https://baomidou.com/guide/wrapper.html#abstractwrapper
3. Lambda条件构造器
前面在使用条件构造器时列名都是用字符串的形式去指定。这种方式无法在编译期确定列名的合法性。
所以MP提供了一个Lambda条件构造器可以让我们直接以实体类的方法引用的形式来指定列名。
Lambda条件构造器相比于传统的Wrapper条件构造器,具有以下几个好处:
-
更加简洁易懂:Lambda条件构造器使用Lambda表达式来构建WHERE条件,代码更加简洁易懂,不需要繁琐的字符串拼接(避免硬编码)。
-
更加类型安全:Lambda条件构造器在编译时就能检查出类型错误,避免在运行时出现类型转换异常的问题。
-
更加灵活:Lambda条件构造器支持链式调用,可以方便地组合多个条件,还支持自定义SQL片段,更加灵活
3.1.示例
要执行的查询对应的SQL如下
SELECT
id,user_name,PASSWORD,NAME,age,address
FROM
USER
WHERE
age > 18 AND address = '狐山'
如果使用之前的条件构造器写法如下
@Test
public void testLambdaWrapper(){
QueryWrapper<User> queryWrapper = new QueryWrapper();
queryWrapper.gt("age",30);
queryWrapper.eq("address","黄山");
List<User> users = userMapper.selectList(queryWrapper);
}
如果使用Lambda条件构造器写法如下
@Test
public void testLambdaWrapper2(){
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.gt(User::getAge,30);
queryWrapper.eq(User::getAddress,"黄山");
List<User> users = userMapper.selectList(queryWrapper);
}
4.鸣谢
[1] https://blog.csdn.net/lt326030434/article/details/106571670