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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Struts2拦截器Interceptor的原理与配置实例详解

    Struts2拦截器Interceptor的原理与配置实例详解

    拦截器是一种AOP(面向切面编程)思想的编程方式.它提供一种机制是开发者能够把相对独立的代码抽离出来,配置到Action前后执行。下面这篇文章主要给大家介绍了关于Struts2拦截器Interceptor的原理与配置的相关资料,需要的朋友可以参考下。
    2017-11-11
  • java 线程池存在的意义

    java 线程池存在的意义

    这篇文章主要介绍了java线程池存在的意义,通过多线程案例模拟锁的产生的情况展开对主题的详细介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-06-06
  • 使用java -jar命令启动Spring Boot应用时指定特定配置文件的几种实现方式

    使用java -jar命令启动Spring Boot应用时指定特定配置文件的几种实现方式

    这篇文章主要介绍了在使用java-jar命令启动SpringBoot应用时,指定特定配置文件的几种方式,文中通过代码介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2025-01-01
  • 关于WeakhashMap与HashMap之间的区别和联系

    关于WeakhashMap与HashMap之间的区别和联系

    这篇文章主要介绍了关于WeakhashMap与HashMap之间的区别和联系,WeakHashMap从名字可以得知主要和Map有关,不过还有一个Weak,我们就更能自然而然的想到这里面还牵扯到一种弱引用结构,因此想要彻底搞懂,我们还需要知道四种引用,需要的朋友可以参考下
    2023-09-09
  • SpringBoot向resources下写文件的两种方式

    SpringBoot向resources下写文件的两种方式

    这篇文章给大家分享了两种SpringBoot向resources下写文件的方式,每种方式都有详细的代码示例,对我们的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-08-08
  • 关于java String中intern的深入讲解

    关于java String中intern的深入讲解

    这篇文章主要给大家介绍了关于java String中intern的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • SpringBoot后端服务重定向的实现示例

    SpringBoot后端服务重定向的实现示例

    本文主要介绍了SpringBoot后端服务重定向的实现示例,通过重定向、路径匹配、反向代理和直接调用Controller层接口等方法来实现,感兴趣的可以了解一下
    2025-01-01
  • Spring MVC+mybatis实现注册登录功能

    Spring MVC+mybatis实现注册登录功能

    这篇文章主要为大家详细介绍了Spring MVC+mybatis实现注册登录功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • java中消息推送功能的关键实现代码

    java中消息推送功能的关键实现代码

    在日常开发中,消息推送是非常典型的业务需求,下面这篇文章主要介绍了java中消息推送功能的关键实现代码,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-09-09
  • 一文掌握Spring 中 @Component 和 @Bean 区别(最新推荐)

    一文掌握Spring 中 @Component 和 @Bean 区别(最新推荐)

    ​@Component 用于标识一个普通的类,@Bean用于配置类里面,在方法上面声明和配置 Bean 对象,这篇文章主要介绍了Spring 中 @Component 和 @Bean 区别(最新推荐),需要的朋友可以参考下
    2024-04-04

最新评论