【MybatisPlus】QueryWapper和LambdaQueryWrapper的区别

【MybatisPlus】QueryWapper和LambdaQueryWrapper的区别

  • (一)MyBatisPlus的条件查询构造器
    • QueryWrapper
    • LambdaQueryWrapper
    • 优缺点
    • 使用场景
  • (二)Lambda的概念
  • (三)QueryWrapper如何进化成LambdaQueryWrapper的
    • QueryWrapper最基础的使用方式
    • 开始进阶版一:引入 lambda
    • 接着进阶版二:简化 lambda
    • 进阶完成版:简化 `QueryWrapper<BannerItem>.lambda()`
  • (四)QueryWapper和LambdaQueryWrapper的常用方法
  • 参考文章

(一)MyBatisPlus的条件查询构造器

MyBatis-Plus 是一个基于 MyBatis 的增强工具库,旨在简化 MyBatis 的使用并提供更多的便利功能。
其中,QueryWrapperLambdaQueryWrapper 都是 MyBatis-Plus 提供的查询条件构造器,用于构建 SQL 查询语句的条件部分。

QueryWrapper

QueryWrapper 是 MyBatis-Plus 最基础的查询条件构造器之一。
它通过链式调用的方式构建查询条件,并使用普通的字符串作为字段名、操作符和值。它的使用方式类似于传统的 SQL 查询。

LambdaQueryWrapper

LambdaQueryWrapper 是在 QueryWrapper 的基础上增加了使用 Lambda 表达式的功能,使得构建查询条件更加类型安全、易读,并且能够在编译时进行语法检查。它通过方法引用的方式来指定实体类的属性,并提供了丰富的方法来构建查询条件。

类图

  • Wrapper:条件构造抽象类,最顶端父类
  • AbstractWrapper:用于查询条件封装,生成 sql 的 where 条件
  • QueryWrapper:Entity 对象封装操作类,不是用lambda语法
  • UpdateWrapper:Update 条件封装,用于Entity对象更新操作
  • AbstractLambdaWrapper :​Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
  • ​LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
  • ​LambdaUpdateWrapper :​Lambda 更新封装Wrapper

优缺点

QueryWrapper

  • 优点:更灵活,支持复杂查询操作和 SQL 片段拼接。
  • 缺点:类型不安全、可读性较差。

LambdaQueryWrapper

  • 优点:类型安全、易读性高,可以直接使用实体类的属性和方法。
  • 缺点:在某些复杂查询操作下可能不支持。

使用场景

  • (1)需要进行复杂的查询操作,特别是涉及到复杂的 SQL 片段拼接等情况,可能需要使用 QueryWrapper
  • (2)查询条件相对简单且你更注重代码的清晰性和类型安全性,可以优先考虑使用 LambdaQueryWrapper

(二)Lambda的概念

Lambda表达式是一种匿名函数,它可以被用作一段可传递的代码。
Lambda表达式通常用于简化代码,特别是在函数式编程中,它允许你在不创建具体方法的情况下定义一个函数。
在Java中,Lambda表达式的语法是->,它可以替代某些接口的匿名内部类。

在MyBatis-Plus中,Lambda表达式的重要性体现在构建查询条件时。
它们提供了一种更加类型安全和直观的方式来构建数据库查询条件,而不需要硬编码SQL语句。
通过使用Lambda表达式,你可以创建查询条件的对象,而不是手动编写字符串,这有助于减少SQL注入的风险,提高了代码的可维护性。

(三)QueryWrapper如何进化成LambdaQueryWrapper的

QueryWrapper最基础的使用方式

// 查询条件构造器
QueryWrapper<BannerItem> wrapper = new QueryWrapper<>();
wrapper.eq("banner_id", id);
// 查询操作
List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);

开始进阶版一:引入 lambda

然后我们可以引入lambda,避免我们在代码中写类似的于banner_id的硬编码

QueryWrapper<BannerItem> wrapper = new QueryWrapper<>();
//此处引入了lambda
wrapper.lambda().eq(BannerItem::getBannerId, id);
List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);

接着进阶版二:简化 lambda

为了简化lambda的使用,我们可以改写成LambdaQueryWrapper构造器,语法如下:

LambdaQueryWrapper<BannerItem> wrapper = new QueryWrapper<BannerItem>().lambda();
wrapper.eq(BannerItem::getBannerId, id);
List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);

进阶完成版:简化 QueryWrapper<BannerItem>.lambda()

可以直接将QueryWrapper<BannerItem>.lambda() 简化掉,变成直接使用LambdaQueryWrapper

LambdaQueryWrapper<BannerItem> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(BannerItem::getBannerId, id);
List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);

(四)QueryWapper和LambdaQueryWrapper的常用方法

在这里插入图片描述

我们主要使用以下的方法:

  • eq: 添加等于(=)条件。
  • ne: 添加不等于(<>)条件。
  • like: 添加LIKE条件。
  • gt和lt: 添加大于(>)和小于(<)条件。
  • ge和le: 添加大于等于(>=)和小于等于(<=)条件。
  • between: 添加BETWEEN条件。
  • isNull和isNotNull: 添加IS NULL和IS NOT NULL条件。
  • in和notIn: 添加IN和NOT IN条件。
  • groupBy和orderBy: 添加GROUP BY和ORDER BY条件。
  • having: 添加HAVING条件。

举例一个简单的例子

QueryWrapper写法

QueryWrapper<CustomerBussUser> qw = new QueryWrapper<>();
qw.select("CUST_ID,count(*) as custIdCount");//查询自定义列
qw.eq("user_id",userId);
qw.eq("isvalid","1");
qw.groupBy("cust_Id");
qw.having("count(*) > 1");
//listMaps方法查询
List<Map<String, Object>> maps = customerBussUserService.listMaps(qw);

LambdaQueryWrapper写法

LambdaQueryWrapper<CustomerBussUser> lqw = new LambdaQueryWrapper<>();  
lqw.select("CUST_ID, count(*) as custIdCount")  .eq(CustomerBussUser::getUserId, userId)  .eq(CustomerBussUser::getIsvalid, "1").groupBy(CustomerBussUser::getCustId).having("count(*) > 1");
List<Map<String, Object>> maps = customerBussUserService.listMaps(lqw);

参考文章

【1】【MybatisPlus】LambdaQueryWrapper和QueryWapper的区别
【2】QueryWrapper中常用方法
【3】MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用
【4】MyBatis-Plus——超详细讲解条件构造器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/45344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫之路(2):爬天气情况

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

5G RedCap调查报告

一、5G RedCap技术背景 5G RedCap(Reduced Capability缩写,轻量化5G),是3GPP标准化组织定义下的5G裁剪版本,是5G面向中高速率连接场景的物联网技术,它的能力介于5G NR(含eMBB和uRLLC)和LPWA(如LTE-M和NR-IoT)之间,如图1所示,是5G-A(5G Advanced)的关键技术之一。…

WAV 和 FLAC 哪个音质好?常见音频格式又如何转换?

音频文件的格式种类繁多&#xff0c;每种格式都有其独特的优势和应用场景。其中&#xff0c;WAV 和 FLAC 作为两种常见的无损音频格式&#xff0c;备受音频发烧友和专业人士的青睐。它们不仅能够保留原始录音的全部细节&#xff0c;还为听众提供了近乎 CD 品质的听觉体验。然而…

昇思25天学习打卡营第13天|基于MindNLP+MusicGen生成自己的个性化音乐

关于MindNLP MindNLP是一个依赖昇思MindSpore向上生长的NLP&#xff08;自然语言处理&#xff09;框架&#xff0c;旨在利用MindSpore的优势特性&#xff0c;如函数式融合编程、动态图功能、数据处理引擎等&#xff0c;致力于提供高效、易用的NLP解决方案。通过全面拥抱Huggin…

QT实现自定义带有提示信息的透明环形进度条

1. 概述 做界面开发的童鞋可能都会遇到这样的需求&#xff0c;就是有一些界面点击了之后比较耗时的操作&#xff0c;需要界面给出一个环形进度条的进度反馈信息. 如何来实现这样的需求呢&#xff0c;话不多说&#xff0c;上效果 透明进度条 2. 代码实现 waitfeedbackprogressba…

从业务架构到应用架构技术剖析

从业务架构到应用架构 4A架构理论&#xff0c;一个企业级架构框架&#xff0c;将企业架构&#xff08;EA&#xff09;划分为四大核心领域&#xff0c;每个领域都聚焦于组织的不同维度。该理论提供了一种结构化的设计和理解企业运作方式的方法&#xff0c;确保技术解决方案能…

用Apipost压力测试接口

用Apipost压力测试接口 1.点击自动化测试 2.选择要测试的接口 3.如果没有接口&#xff0c;就先在api调试中添加要测试的接口 4.根据自己的需求设置相应的参数&#xff0c;这里我压测10次 5.这样就可以压测接口了&#xff0c;非常nice

LayoutLMv1

近年来&#xff0c;预训练技术在各种NLP任务中得到了成功的验证。尽管NLP应用程序广泛使用预训练模型&#xff0c;但它们几乎只关注文本级操作&#xff0c;而忽略了对文档图像理解至关重要的布局和样式信息。在本文中&#xff0c;我们提出了LayoutLM来联合建模文本和布局信息在…

webstorm问题解决:无法识别 @

问题解决tsconfig.json 问题 本地的 vite.config.ts 已经配置 路径 但是&#xff0c;我用webstorm 上识别不了 解决 新增文件tsconfig.json&#xff0c;添加 baseUrl 和 paths 的配置&#xff0c;以告诉 TypeScript 和 WebStorm 如何解析路径别名 tsconfig.json {&quo…

2006-2021年 291个地级市资源错配指数、劳动和资本相对扭曲指数do文件和结果

资源错配指数&#xff1a;衡量生产要素配置效率的关键指标 资源错配指数&#xff08;Misallocation Index&#xff09;是一个衡量资源配置效率的指标&#xff0c;它反映了生产要素是否得到了合理配置&#xff0c;以及是否达到了生产效率的最优状态。一个较高的资源错配指数意味…

斐讯N1盒子刷入Armbian并安装Docker拉取网络下行流量教程

一直在跑PCDN&#xff0c;目前主推八米云跟点心云&#xff0c;八米单价比点心更高&#xff0c;业务都一样&#xff0c;直播业务。 两种刷机教程我也发下。 八米云&#xff1a;点此跳转 点心云&#xff1a;点此跳转 最近各运营商对PCDN打击力度加大&#xff0c;需求拉取下行流量…

2024最新修复微信公众号无限回调系统源码下载 免授权开心版

2024最新修复微信公众号无限回调系统源码下载 免授权开心版 微信公众平台回调比较麻烦&#xff0c;还不能多次回调&#xff0c;于是搭建一个多域名回调的源码很有必要。 测试环境&#xff1a;Nginx1.24PHP7.2MySQL5.6 图片&#xff1a;

uiautomator2 多种方式键盘输入

最近做了一个爬虫项目&#xff0c;在向文本框输入的时候&#xff0c;使用了多种方法&#xff08;包含&#xff1a;send_keys、set_text&#xff09;等多种方法都无效&#xff0c;最终选择了以下方案得到完美解决。 # 切换输入法 d.set_fastinput_ime(True) op_user_modify d(…

【git】:初识Git 和 Git 的安装

目录 学习 Git 的目标 Git 安装 Linux-centos Linux-ubuntu Windows 学习 Git 的目标 技术目标 掌握 Git 企业级应用&#xff0c;深刻理解Git操作过程与操作原理&#xff0c;理解工作区&#xff0c;暂存区&#xff0c;版本库的含义 掌握 Git 版本管理&#xff0c;自由进⾏…

药监局瑞数后缀补环境教学

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; (联系看首页&#xff09; 前言 之前用…

vue + echart 饼形图

图表配置&#xff1a; import { EChartsOption, graphic } from echarts import rightCircle from /assets/imgs/index/right_circle.png export const pieOption: EChartsOption {title: {text: 100%,subtext: 游客加量,left: 19%,top: 42%,textStyle: {fontSize: 24,color:…

部署大语言模型并对话

在阿里云的https://developer.aliyun.com/adc/scenario/b105013328814fe995c0f091d708d67d 选择函数计算 设置服务器配置 复制公网地址 这个地址不能直接 在返回应用&#xff0c;创建应用LLM 对话页面 Open WebUI 点击下面的创建应用 部署完成后访问域名 打开访问地址

SpringBoot新手快速入门系列教程十:基于Docker Compose,部署一个简单的项目

前述&#xff1a; 本篇教程将略过很多docker下载环境配置的基础步骤&#xff0c;如果您对docker不太熟悉请参考我的上一个教程&#xff1a;SpringBoot新手快速入门系列教程九&#xff1a;基于docker容器&#xff0c;部署一个简单的项目 使用 Docker Compose 支持部署 Docker 项…

SQL优化之深分页

SQL优化之深分页 我们都知道&#xff0c;大型项目中的SQL语句&#xff0c;应该尽量避免深分页。 那么问题就来了&#xff1a; 深分页的性能差在哪&#xff1f;什么方案能避免深分页呢&#xff1f; 什么是深分页 深分页&#xff0c;即SQL查询过程中&#xff0c;使用的页数过…

3.Softmax回归

回归和分类 回归估计一个连续值 分类预测一个离散类别 Softmax回归实际是一个分类问题 从回归到多类分类 对类别进行一位有效编码 y [ y 1 , y 2 , ⋯ , y n ] T y[y_1,y_2,\cdots,y_n]^T y[y1​,y2​,⋯,yn​]T,如果是第i类&#xff0c;则值为1&#xff0c;否则为0 使用…