MyBatis-Plus条件构造器Wrapper应用实例
作者:行者张良
一、Wapper分类
Wrapper : 条件构造抽象类,最顶端父类
AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
QueryWrapper : Entity 对象封装操作类,不是用lambda语法
UpdateWrapper : Update 条件封装,用于Entity对象更新操作
AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column
LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
二、各构造器的区别
1)QueryWrapper、QueryChainWrapper只能指定需要的数据库列名;
2)LambdaQueryWrapper、LambdaQueryChainWrapper可以通过Lambda获取数据库列名;
3)QueryWrapper 、LambdaQueryWrapper不能使用链式查询的方式,必须借助BaseMapper来执行;
4)QueryChainWrapper、LambdaQueryChainWrapper可以使用链式查询的方式,如list(),one();
三、构造器常用方法
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
四、Wrapper常用构造器应用实例
4.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); }
4.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); }
4.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.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();
4.4Lambda条件构造器
前面在使用条件构造器时列名都是用字符串的形式去指定。这种方式无法在编译期确定列名的合法性。
所以MP提供了一个Lambda条件构造器可以让我们直接以实体类的方法引用的形式来指定列名。
Lambda条件构造器相比于传统的Wrapper条件构造器,具有以下几个好处:
更加简洁易懂:Lambda条件构造器使用Lambda表达式来构建WHERE条件,代码更加简洁易懂,不需要繁琐的字符串拼接(避免硬编码)。
更加类型安全:Lambda条件构造器在编译时就能检查出类型错误,避免在运行时出现类型转换异常的问题。
更加灵活:Lambda条件构造器支持链式调用,可以方便地组合多个条件,还支持自定义SQL片段,更加灵活
4.5.示例
要执行的查询对应的SQL如下
SELECT id,user_name,PASSWORD,NAME,age,address FROM USER WHERE age > 18 AND address = '狐山'
如果使用之前的条件构造器写法如下
@Test public void testLambdaWrapper(){ QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.gt(“age”,30); queryWrapper.eq(“address”,“黄山”); List 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); }
到此这篇关于MyBatis-Plus数据表操作条件构造器Wrapper的文章就介绍到这了,更多相关MyBatis-Plus条件构造器Wrapper内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!