【MybatisPlus】QueryWapper和LambdaQueryWrapper的区别

news2024/9/24 19:13:27

【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.coloradmin.cn/o/1920770.html

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

相关文章

【排序算法】计数排序

目录 一.基本思想 二.缺陷及优化 三.代码实现 四.特性总结 1.可以排序负数 2.适合范围集中的整数 3.时间复杂度&#xff1a;O(Nrange) 4.空间复杂度&#xff1a;O(range) 5.稳定性&#xff1a;稳定 一.基本思想 根据待排序数组a创建一个新的数组count&#xff0c;该数组…

这个软件可无限制免费领取金币,领取后即可自由实现AI文生图,AI Chat及其AI文生PPT等AI功能

目前AI文生图工具浩如烟海&#xff0c;不过基本上都是限制使用&#xff0c;每天只能使用几次到十几次&#xff0c;如果还想继续使用&#xff0c;那么只能花钱购买&#xff0c;这对于绝大多数人来说确实是一个痛点&#xff0c;那么有没有一款软件可以实现使用自由呢&#xff1f;…

【在线词典】项目实现

15_Dictionary 在线词典 搭建客户端-服务器架构 准备必要的资源 整理原始数据 整理英汉双语对照表&#xff0c;将XLSX格式转换成CSV格式&#xff0c;准备好vocabulary_list.csv文件备用 注意&#xff1a;CSV格式的文件必须使用UTF-8的字符集&#xff1b; 建立mydatabase.…

第17周:天气预测

目录 前言 一、前期准备 1.1 导入库 1.2 导入数据 1.2.1 数据介绍 1.2.2 数据导入 二、探索式数据分析&#xff08;EDA&#xff09; 2.1 数据相关性探索 2.2 是否会下雨 2.3 地理位置与下雨的关系 2.4 湿度和压力对下雨的影响 2.5 气温对下雨的影响 三、数据预处理…

Windows 零散记录

文章目录 一、鼠标焦点丢失 一、鼠标焦点丢失 如&#xff1a;打字时没打完鼠标焦点中途就消失了 解决&#xff1a; 1、windowsR 组合键打开运行&#xff0c;输入regedit打开注册表 2、找到目录 HKEY_CURRENT_USER\Control Panel\Desktop\ForegroundLockTimeout 设置锁定超时时…

starRocks搭建

公司要使用新的大数据架构&#xff0c;打算用国产代替国外的大数据平台。所以这里我就纠结用doris还是starrocks&#xff0c;如果用doris&#xff0c;因为是开源的&#xff0c;以后就可以直接用云厂商的。如果用starrocks就得自己搭建&#xff0c;但是以后肯定会商业化&#xf…

ARM功耗管理之多核处理器启动

安全之安全(security)博客目录导读 思考&#xff1a;SecureBoot&#xff1f;多核处理器启动流程&#xff1f;PSCI启动方式&#xff1f; 一般嵌入式系统使用的都是对称多处理器&#xff08;Symmetric Multi-Processor, SMP&#xff09;系统&#xff0c;包含了多个cpu, 这几个cp…

脑电图 (EEG) :语音脑机接口(BCI)的理想选择

运动性语言障碍是一种严重的医疗状况&#xff0c;它让患者几乎或完全失去说话能力。这种状况在帕金森病患者中的发生率为90%&#xff0c;在中风患者中的发生率为45.2%&#xff0c;在肌萎缩侧索硬化症&#xff08;ALS&#xff09;患者中的发生率为95%。典型的针对语言障碍的沟通…

轮转数组(超详细!)

前言&#xff1a; 小编在上一篇文章的时候拿过轮转数组作为例子来讲述复杂度&#xff0c;但是小编并没有给出这个题目的正确解答&#xff0c;既然读者朋友已经了解复杂度了&#xff08;不了解也没关系&#xff0c;可以看小编上一篇文章&#xff09;&#xff0c;下面&#xff0c…

木舟0基础学习Java的第十六天(异常,分类,自定义异常,注意事项)

异常 异常概述&#xff1a;异常是Java程序运行过程中出现的错误 异常分类&#xff1a;API查找Throwable 1.Error(服务器宕机&#xff0c;数据库崩溃等) 2.Exception C(异常的继承体系)API查RuntimeException 运行时异常&#xff1a;一般是程序员的错误异常可以让我们发现错…

LiveNVR监控流媒体Onvif/RTSP用户手册-用户管理:编辑、添加用户、关联通道、重置密码、删除、过滤搜索

LiveNVR监控流媒体Onvif/RTSP用户手册-用户管理:编辑、添加用户、关联通道、重置密码、删除、过滤搜索 1、用户管理1.1、添加用户1.2、关联通道1.3、重置密码1.4、编辑1.5、删除1.6、过滤搜索 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、用户管理 1.1、添加用户 点击用户管理…

【源码开源】C#桌面应用开发:串口调试助手

c#桌面应用开发 1、环境搭建和工程创建&#xff1a;参照番茄定时器项目 工程创建参照 2、界面布局设计 3、具体功能函数 &#xff08;1&#xff09;端口扫描&#xff1a; private void btn_com_scan_Click(object sender, EventArgs e){//端口号扫描ReflashPortToComboBox(…

【JavaWeb程序设计】JavaBean(二)

目录 一、请设计并实现下面的Web应用 1. 运行结果 2. inputNumber.jsp代码 3. ComputerBean.java代码 4. handleCompute 5. lookResult.jsp 二、基于MVC模式完成用户注册功能&#xff0c;不允许添加重名用户&#xff0c;使用AJAX技术在用户填写时进行检查并提示是否重复&…

【产品经理】WMS多仓调拨转移说明

对于仓储管理来说&#xff0c;越来越多企业开始应用WMS进行系统化的管理&#xff0c;以提升仓库的作业效率。本文作者从业务流程和基础功能两个方面展开介绍&#xff0c;希望对你有帮助。 一、业务流程 。在线下业务流程拓展&#xff0c;仓库不断增多的过程中&#xff0c;由于…

[leetcode]circular-array-loop 环形数组是否存在循环

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool circularArrayLoop(vector<int>& nums) {int n nums.size();auto next [&](int cur) {return ((cur nums[cur]) % n n) % n; // 保证返回值在 [0,n) 中};for (int i 0; i < n; i…

Apache AGE 运算符

运算符 字符串特定比较运算符 测试数据 SELECT * FROM cypher(graph_name, $$ CREATE (:Person {name: John}),(:Person {name: Jeff}),(:Person {name: Joan}),(:Person {name: Bill}) $$) AS (result agtype);Starts With 对字符串执行区分大小写的前缀搜索。 SELECT * …

Vue2-集成Element-ui、Fontawesome、Axios介绍与使用

文章目录 前期准备Element UI介绍Element-ui安装使用Fontawesome介绍Fontawesome安装使用Axios介绍Axios安装使用本篇小结 更多相关内容可查看 前期准备 脚手架生成vue2项目&#xff1a;NodeJS安装并生成Vue脚手架(保姆级) Element UI介绍 Element UI 是一个基于 Vue.js 2.0…

【Node.js安装教程】

Node.js安装教程 第一步&#xff1a;下载 下载链接&#xff1a;https://nodejs.org/zh-cn 第二步&#xff1a;安装 **方法一&#xff1a;**建议安装在默认路径 方法二&#xff1a;如果不是默认安装路径可能会出现一系列问题&#xff1a;这时可以选择卸载重装或者配置环境变量…

将vue项目整合到springboot项目中并在阿里云上运行

第一步&#xff0c;使用springboot中的thymeleaf模板引擎 导入依赖 <!-- thymeleaf 模板 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency> 在r…

帕金森老人的锻炼建议

对于帕金森病老人来说&#xff0c;适当的锻炼可以帮助改善症状、增强肌肉力量、提高关节灵活性&#xff0c;并预防长期并发症。以下是一些基于最新信息的锻炼建议&#xff1a; 选择合适的运动类型&#xff1a;包括有氧运动、抗阻运动和牵伸运动。有氧运动如快走、慢跑、游泳和舞…