在演示UpdateWrapper的案例中,我们在代码中编写了更新的SQL语句:

@Test
void testUpadateWrapper(){List<Long> ids = List.of(1L,2L,4L);//生成SQLUpadateWrapper<User> wrapper =new UpdateWrapper<User> ().setSql("balance =balance -200").in("id",ids);// 第一个参数可以给null  不填更新字段和数据  
userMapper.update(null,wrapper);
}

​这种写法在企业中不允许 因为Sql语句最好都在持久层而不是业务层

由于条件是in语句,只能将Sql写在Mapper.xml文件中然后使用foreach来生成动态的SQL

所以,MybatisPlus提供了自定义SQL功能,可以让我们利用Wrapper生成查询条件,再结合Mapper.xml编写SQL

@Test
void testCustomWrapper() {// 1.准备自定义查询条件List<Long> ids = List.of(1L, 2L, 4L);QueryWrapper<User> wrapper = new QueryWrapper<User>().in("id", ids);// 2.调用mapper的自定义方法,直接传递WrapperuserMapper.deductBalanceByIds(200, wrapper);
}

​然后在UserMapper中自定义SQL:、

package com.itheima.mp.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itheima.mp.domain.po.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
import org.apache.ibatis.annotations.Param;public interface UserMapper extends BaseMapper<User> {@Select("UPDATE user SET balance = balance - #{money} ${ew.customSqlSegment}")void deductBalanceByIds(@Param("money") int money, @Param("ew") QueryWrapper<User> wrapper);
}

扩展ew.customSqlSegment

${ew.customSqlSegment} 是 MyBatis-Plus 中用于集成条件构造器(QueryWrapper 或 LambdaQueryWrapper)的核心占位符,主要作用是

1. 动态拼接 SQL 条件片段

2.实现 "自定义 SQL 骨架 + 动态条件拼接" 的灵活查询。

3.无需大量的手写<if>标签判断条件是否存在,简化SQL编写

4.支持复杂的条件逻辑

例如:

wrapper.eq("status", 1).and(i -> i.like("name", "张").or().like("name", "李"));

等价于

WHERE status = 1 AND (name LIKE '%张%' OR name LIKE '%李%')

多表关联

利用Wrapper中自定义条件结合自定义SQL实现多表查询的效果

例如,我们要查询出所有收货地址在北京的并且用户id在1、2、4之中的用户

<select id="queryUserByIdAndAddr" resultType="com.itheima.mp.domain.po.User">SELECT *FROM user uINNER JOIN address a ON u.id = a.user_idWHERE u.id<foreach collection="ids" separator="," item="id" open="IN (" close=")">#{id}</foreach>AND a.city = #{city}</select>

先补充一下foreach表格属性,让曦哥加深印象、

属性描述
collection指定要遍历的集合。表示传入过来的参数的数据类型。该属性是必须指定的,要做 foreach 的对象。
index索引,index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置。遍历 list 的时候 index 就是索引,遍历 map 的时候 index 表示的就是 map 的 key,item 就是 map 的值。
item表示本次迭代获取的元素,若collection为List、Set或者数组,则表示其中的元素;若collection为map,则代表key-value的value,该参数为必选
open表示该语句以什么开始,最常用的是左括弧’(’,注意:mybatis会将该字符拼接到整体的sql语句之前,并且只拼接一次,该参数为可选项
separator表示在每次进行迭代之间以什么符号作为分隔符。select * from tab where id in(1,2,3)相当于1,2,3之间的","
close表示该语句以什么结束,最常用的是右括弧’)’,注意:mybatis会将该字符拼接到整体的sql语句之后,该参数为可选项

但是基于自定义SQL结合Wrapper的玩法,我们就可以利用Wrapper来构造查询条件 然后手写Select以及From部分,从而实现多表查询

1. 首先构建一个查询条件

@Test void testCustomJionWrapper(){QueryWrapper<User> wrapper =new QueryWrapper<User>().in("u.id",List.of(1L,2L,4L).eq("a.city","北京");// 调用mapper自定义方法 List<User> users = userMapper.queryUserByWrapper(wrapper);user.forEach(System.out::println):
}

2.然后再UserMapper中自定义方法

@Select("SELECT u.* FROM user u INNER JOIN address a ON u.id = a.user_id ${ew.customSqlSegment}")
//参数通过 @Param 注解指定名称为 "ew"(是 EntityWrapper 的缩写),类型是 MyBatis-Plus 提供的条件构造器 QueryWrapper,用于动态构建查询条件
List <User> queryUserByWrapper(@Param("ew")QueryWrapper<User> wrapper)

或者也可以在UserMapper.xml中写SQL

<select id ="queryUserByIdAndAddr" resultTyp="com.itheima.mp.domain.po.user">SELECT * FROM user u INNER JOIN address a ON u.id = a.user_id ${ew.customSqlSegment}
</select>

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

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

相关文章

Deepoc科技之暖:智能助盲设备如何为视障家人点亮生活

作为一名视障人士的家属&#xff0c;我们或许都经历过这样的时刻&#xff1a;看着亲人在书架前摸索&#xff0c;却无法独自获取文字信息&#xff1b;担心他们外出时遇到障碍物或交通危险&#xff1b;心疼他们因找不到日常物品而不得不一次次求助。这些细微的日常困境&#xff0…

大模型食材识别技术革新:AI重构精准营养管理

随着健康意识的提升&#xff0c;饮食管理需求激增&#xff0c;但传统手动记录易出错、效率低。大模型食材识别技术的突破&#xff0c;让AI通过多模态输入精准识别食材种类与重量&#xff0c;结合营养数据库&#xff0c;系统可快速生成营养报告&#xff0c;实现从“经验驱动”到…

使用 Altair RapidMiner 将机器学习引入您的 Mendix 应用程序

Altair RapidMiner 使机器学习更加容易&#xff1a;无论您喜欢使用 Python 编码&#xff0c;还是在 Workflow Studio 中进行可视化工作&#xff0c;Altair AI Cloud 都能为团队提供快速构建和部署 ML 模型的工具。 将机器学习与 Mendix 集成很简单&#xff1a;通过 Mendix 的低…

EasyExcel:快速读写Excel的工具类

EasyExcel&#xff1a;快速读写Excel的工具类 项目介绍 ​EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 他能让你在不用考虑性能、内存的等因素的情况下&#xff0c;快速完成Excel的读、写等功能。 pom地址 ‍ <!--exel--> <depe…

WSL Ubuntu Docker 代理自动配置教程

WSL Ubuntu Docker 代理自动配置教程 WSL Ubuntu Docker 代理自动配置教程 背景说明 在 WSL2 环境下使用 Docker 时&#xff0c;由于网络环境限制&#xff0c;经常需要通过 Windows 主机上的代理来访问 Docker Hub。但每次 Windows 重启后&#xff0c;WSL 获取到的主机 IP 地址…

踩坑实录:Django继承AbstractUser时遇到的related_name冲突及解决方案

一、问题现象分析 咱们在用Django开发时&#xff0c;有时候需要扩展用户模型&#xff0c;就会去继承AbstractUser。但这么做的时候&#xff0c;要是没处理好groups和user_permissions这两个多对多字段的反向查询名称&#xff0c;就会遇到这样的报错&#xff1a;主要就是这种错误…

push pop 和 present dismiss

push/pop 和 present/dismiss 文章目录push/pop 和 present/dismiss前言push / poppresent普通的present多层present多层present后的父子关系问题多层弹出会遇到的问题showViewController 和 showDetailViewControllershowViewControllershowDetailViewControllerdismiss模态化…

服务器异常负载排查手册 · 隐蔽进程篇

适用范围 适用于 Linux 3.10 生产环境&#xff0c;发现 load 高但用户态 CPU 接近 0 % 的场景。1. 现场冻结目标&#xff1a;在 rootkit 干预前保存易失数据。#!/bin/bash # freeze.sh TS$(date %s) mkdir -p /srv/ir/${TS} cd /srv/ir/${TS}# 1.1 进程树&#xff08;busybox 静…

2024理想算法岗笔试笔记

要理解指令微调&#xff08;Instruction Tuning&#xff09;&#xff0c;需要先将其置于大语言模型&#xff08;LLM&#xff09;的训练框架中 —— 它并非模型训练的起点&#xff0c;而是针对 “让模型更懂人类需求” 的关键优化步骤。简单来说&#xff0c;指令微调是通过让模型…

Oracle 11g离线安装依赖包完整解决方案

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;Oracle 11g是一款广泛使用的关系型数据库管理系统&#xff0c;在离线环境下安装时需依赖多个系统库和工具。本“oracle11g依赖包”压缩文件包含了在CentOS 7.7上安装Oracle 11g可能缺失的关键依赖RPM包&#xf…

VBA数据结构选型:效率差5倍的生死抉择

VBA性能生死局&#xff1a;Dictionary与Collection效率差5倍&#xff01;90%开发者用反血亏“你以为Collection是VBA的‘轻量级选手’&#xff1f;大错特错&#xff01;实测数据显示&#xff1a;在10万级数据循环中&#xff0c;Dictionary的查询速度比Collection快5倍&#xff…

电机控制(四)-级联PID控制器与参数整定(MATLABSimulink)

PID算法 普通PID&#xff08;Proportional-Integral-Derivative&#xff09; 通过比例&#xff08;P&#xff09;、积分&#xff08;I&#xff09;和微分&#xff08;D&#xff09;三项来进行控制 比例项&#xff08;P&#xff09;&#xff1a;根据当前误差&#xff08;目标值…

数据结构深度解析:二叉树的基本原理

在数据结构体系中&#xff0c;树是一种重要的非线性层次结构&#xff0c;它通过 “节点” 与 “边” 的连接关系&#xff0c;模拟了现实世界中树的分支结构&#xff0c;能够高效地解决数据的查找、插入、删除等问题。而二叉树作为树结构中最简单、应用最广泛的类型&#xff0c;…

【React】Ant Design 5.x 实现tabs圆角及反圆角效果

需要实现的效果实现思路 利用tab页的before和after属性&#xff0c;添加tab页前后的圆弧属性&#xff0c;同时使用tab页的shadow阴影填充右下角的圆弧空缺部分。<TabsonChange{onChange}type"card"items{getTabItems()}/>.ant-tabs-nav{margin: 0;.ant-tabs-na…

WordPress过滤文章插入链接rel属性noopener noreferrer值

WordPress过滤文章插入链接rel属性noopener noreferrer值在保存文章的时候&#xff0c;WordPress会自动过滤文章内容中的链接&#xff0c;具有target属性的链接会自动添加rel"noopener noreferrer"&#xff0c;该属性是为了预防跨站攻击&#xff0c;站内链接似乎没有…

make_shared的使用

目录 1. make_shared 的基本概念 基本用法 2. 引入 make_shared 的主要原因 2.1 解决传统构造方式的问题 2.2 标准委员会的动机 3. make_shared 的核心优势 3.1 性能优势&#xff08;最重要优点&#xff09; 内存分配优化&#xff1a; 性能提升表现&#xff1a; 3.2 异…

基于 Gemini 的 CI/CD 自动化测评 API 集成实战教程

在现代软件开发中&#xff0c;CI/CD 集成 已经成为必不可少的流程。它不仅能帮助团队快速迭代&#xff0c;还能通过自动化手段提升代码质量。而在编程培训和团队内部学习中&#xff0c;如何引入 自动化测评 API&#xff0c;实现提交即测评、即时反馈呢&#xff1f;本文将以 Gem…

SOME/IP-SD(Service Discovery)协议的核心协议

<摘要> 本解析以AutoSAR AP R22-11版本为基准&#xff0c;全面系统地阐述了SOME/IP-SD&#xff08;Service Discovery&#xff09;协议的核心内容。从车载网络演进背景切入&#xff0c;详细剖析了面向服务架构&#xff08;SOA&#xff09;下服务发现的必要性&#xff0c;…

视频串行解串器(SerDes)介绍

视频串行解串器&#xff08;SerDes&#xff09;是高速数据通信中的核心接口技术&#xff0c;通过串行化与解串行化实现视频信号的高效传输&#xff0c;广泛应用于汽车电子、数据中心、高清视频传输等领域。 一、技术原理串行化&#xff08;Serializer&#xff09; 功能&#xf…

哈士奇vs网易高级数仓:数据仓库的灵魂是模型、数据质量还是计算速度?| 易错题

面试场景 面试官: (微笑,营造轻松但专业的氛围)嗨,哈士奇,欢迎来参加网易的二面。我看你简历上数据仓库的项目经验很丰富,我们今天就深入聊聊。我这里有一个经典的问题想听听你的看法:在你看来,数据仓库的灵魂是模型、数据质量还是计算速度? 哈士奇: (不假思索,…