在Mybatis plus中如何使用自定義Sql

在演示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網易高級數倉:數據倉庫的靈魂是模型、數據質量還是計算速度?| 易錯題

面試場景 面試官: (微笑,營造輕松但專業的氛圍)嗨,哈士奇,歡迎來參加網易的二面。我看你簡歷上數據倉庫的項目經驗很豐富,我們今天就深入聊聊。我這里有一個經典的問題想聽聽你的看法:在你看來,數據倉庫的靈魂是模型、數據質量還是計算速度? 哈士奇: (不假思索,…