MyBatis-Plus条件构造器Wrapper应用实例

 更新时间:2023年09月19日 09:28:34   作者:行者张良  
QueryWrapper是用于查询的Wrapper条件构造器,可以通过它来构建SELECT语句中的WHERE条件,这篇文章主要介绍了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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决fcitx输入法在IDEA中输入法候选框无法跟随光标移动的问题

    解决fcitx输入法在IDEA中输入法候选框无法跟随光标移动的问题

    这篇文章主要介绍了解决fcitx输入法在Intellij IDEA开发工具中输入法候选框无法跟随光标移动的问题,代码简单易懂对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • 详解Java实践之适配器模式

    详解Java实践之适配器模式

    在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中
    2021-06-06
  • idea使用spring Initializr 快速搭建springboot项目遇到的坑

    idea使用spring Initializr 快速搭建springboot项目遇到的坑

    这篇文章主要介绍了idea使用spring Initializr 快速搭建springboot项目遇到的坑,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • form-data与x-www-form-urlencoded的区别以及知识延伸

    form-data与x-www-form-urlencoded的区别以及知识延伸

    这篇文章主要给大家介绍了关于form-data与x-www-form-urlencoded的区别以及知识延伸,form-data和x-www-form-urlencoded都是HTTP请求中用于传输表单数据的编码格式,需要的朋友可以参考下
    2023-11-11
  • Java实现任意进制转换

    Java实现任意进制转换

    这篇文章主要为大家详细介绍了Java实现任意进制转换的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 详解SpringBoot如何创建自定义Starter

    详解SpringBoot如何创建自定义Starter

    Spring Boot的自动配置机制为开发人员提供了一种轻松集成和配置各种功能的便捷方式,本文将深入探讨在Spring Boot中如何创建自定义Starter,为构建模块化且易维护的应用提供有力的支持,需要的朋友可以参考下
    2024-02-02
  • 基于springEL表达式详解及应用

    基于springEL表达式详解及应用

    这篇文章主要介绍了springEL表达式详解及应用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • springbooot使用google验证码的功能实现

    springbooot使用google验证码的功能实现

    这篇文章主要介绍了springbooot使用google验证码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • mybatis参数String与Integer类型的判断方式

    mybatis参数String与Integer类型的判断方式

    这篇文章主要介绍了mybatis参数String与Integer类型的判断方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 使用ftpClient下载ftp上所有文件解析

    使用ftpClient下载ftp上所有文件解析

    最近项目需要写个小功能,需求就是实时下载ftp指定文件夹下的所有文件(包括子目录)到本地文件夹中,保留文件到目录路径不变。今天小编给大家分享使用ftpClient下载ftp上所有文件的方法,需要的的朋友参考下吧
    2017-04-04

最新评论