動態 SQL 標簽對比表

動態 SQL 標簽對比表

標簽用途關鍵屬性默認行為
<if>條件判斷test條件成立則拼接
<where>處理 WHERE去除 AND/OR 開頭,加 WHERE
<set>處理 SET去除末尾逗號,加 SET
<foreach>遍歷集合collection, item, separator無默認,必須指定
<choose>/<when>/<otherwise>多路選擇test只執行第一個匹配
<trim>自定義修剪prefix, suffix, prefixOverrides靈活控制前后綴
<bind>創建變量name, value執行 OGNL 表達式
<sql> + <include>代碼復用id, refid抽取公共 SQL

? 最佳實踐建議

  1. 優先使用 <where><set>:避免手動處理 AND 和逗號。

  2. <foreach> 必須注意 collection 命名:單參數 Listlist,數組是 array,多參數用 @Param

  3. 復雜邏輯用 <trim>:比 <where><set> 更靈活。

  4. 避免過度嵌套:動態 SQL 層級不要太深,否則難以維護。

  5. 使用 <sql> 復用字段列表:避免重復寫 SELECT * 或字段名。

  6. <bind> 用于模糊查詢:避免在 Java 層拼接 %


🛠? 常見錯誤排查

問題原因解決方案
Mapped Statements collection does not contain...方法名與 XML id 不匹配檢查命名、namespace
A different statement with this id already exists多個 Mapper 有相同 id確保 namespace + id 唯一
Collection 'xxx' not foundcollection 寫錯檢查 list/array/@Param
SQL 報 AND ... 錯誤<where> 未正確使用<where><trim>
批量插入報錯<foreach> separator 缺失separator=","

一.select

1.select的屬性

id 用來引入這條語句,例如和接口名相同,用于實現接口

parameterType 傳來參數的類型

resultMap:適合使用返回值是自定義實體類的情況(用于多表)

resultType:適合使用返回值得數據類型是非自定義的,即jdk的提供的類型(用于單表)

2.select——傳遞單個參數

User getUserById(Integer id);
<select id="getUserById"  parameterType="int" resultType="com.fzy.entity.User">
select * from user where id=#{id}</select>

單個參數不需要@parm

2.select——傳遞list、數組、map

用foreach遍歷,foreach的屬性有

  • tem表示集合中每一個元素進行迭代時的別名,

  • index指定一個名字,用于表示在迭代過程中,每次迭代到的位置,

  • open表示該語句以什么開始,

  • separator表示在每次進行迭代之間以什么符號作為分隔符,

  • close表示以什么結束,

  • collection屬性

1、如果傳入的是單參數且參數類型是一個List的時候,collection屬性值為list。

List<User> getUserList(List<Integer> ids);
<select id="getUserList" resultType="com.fzy.entity.User">select * from user where id in<foreach collection="list" item="uid" index="1" separator="," open="(" close=")">#{uid}</foreach>
</select>

2、如果傳入的是單參數且參數類型是一個Array數組的時候,collection的屬性值為array 。

List<User> getUserArray(int[] array);
<select id="getUserArray" resultType="com.fzy.entity.User">select * from user where id in<foreach collection="array" item="uid" index="1" separator="," open="(" close=")">#{uid}</foreach>
</select>

3、如果傳入的參數是多個的時候,我們就需要把它們封裝成一個Map了,當然單參數也可以封裝成map,實際上如果你在傳入參數的時候,在MyBatis里面也是會把它封裝成一個Map的,map的key就是參數名,所以這個時候collection屬性值就是傳入的List或Array對象在自己封裝的map里面的key。

List<User> getUserMap(Map<String,String> map);
<select id="getUserMap" resultType="com.fzy.entity.User">select * from user where username=#{username} and password= #{password}
</select>

3.select——模糊查詢

SELECT * FROM table WHERE name LIKE CONCAT('%', #{text},'%');

SELECT * FROM tableName WHERE name LIKE '%${_parameter}%';

#{}和${}

在之前的默認情況下,使用#{}格式的語法會通知MyBatis創建預處理語句屬性并安全地設置值(比如通過?占位符)。這樣做更安全,更迅速,通常也是首選做法,不過有時只是想直接在 SQL語句中插入一個不改變的字符串。

比如,像 ORDER BY,可以這樣來使用: ORDER BY ${columnName}

#{}通過占位符的方式在sql執行前進行預編譯,給占位符賦值,安全性更高;

${}通過拼接的方式給sql賦值,可能會一起sql注入的問題,安全性降低;

sql注入

Select * from user where name=”zhansgan “ or ” and pwd=”123456”

4.select——resultMap

esultMap的設計目標就是為復雜語句通過配置文件描述數據庫表結果和Java實體類的關系(OR映射)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/99037.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/99037.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/99037.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

征程 6 灰度圖部署鏈路介紹

一、為什么是灰度圖 相較于 RGB 三通道圖像&#xff0c;灰度圖僅保留亮度信息&#xff08;Y 分量&#xff09;&#xff0c;數據量減少 2/3&#xff0c;相比于常用的 NV12 圖像&#xff0c;數據量減少 1/3&#xff0c;內存占用與計算負載顯著降低。對于下游網絡結構而言&#xf…

計算機畢業設計 基于Hadoop的健康飲食推薦系統的設計與實現 Java 大數據畢業設計 Hadoop畢業設計選題【附源碼+文檔報告+安裝調試】

博主介紹&#xff1a;?從事軟件開發10年之余&#xff0c;專注于Java技術領域、Python、大數據、人工智能及數據挖掘、小程序項目開發和Android項目開發等。CSDN、掘金、華為云、InfoQ、阿里云等平臺優質作者? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&…

基于海康SDK的C++實時視頻流逐幀抓取存圖小工具

目錄 效果 項目 使用 代碼 下載 效果 項目 使用 PlayDemo.exe <IP> <Port> <Username> <Password> 代碼 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string> #include <iostream> #include <Windows.…

windows|引用賬戶被鎖定 且暫時無法登錄

問題描述尷了個尬&#xff0c;一直認為筆記本鎖屏密碼記得很牢靠&#xff0c;沒想到因為少敲了一個點&#xff08;.&#xff09;&#xff0c;多次輸入登陸失敗&#xff0c;導致賬戶被鎖定了&#xff0c;提示&#xff1a;引用賬戶被鎖定 且暫時無法登錄。然后用手機搜索了一下&a…

系統核心解析:深入操作系統內部機制——進程管理與控制指南(三)【進程優先級/切換/調度】

???~~~~~~歡迎光臨知星小度博客空間~~~~~~??? ???零星地變得優秀~也能拼湊出星河~??? ???我們一起努力成為更好的自己~??? ???如果這一篇博客對你有幫助~別忘了點贊分享哦~??? ???如果有什么問題可以評論區留言或者私信我哦~??? ??????個人…

量子-resistant密碼學研究

當亞馬遜CloudFront在2025年9月宣布為所有TLS連接默認啟用后量子加密支持時&#xff0c;這一舉措標志著抗量子密碼學從學術研究正式邁入大規模實用部署階段。與此同時&#xff0c;密碼學家們發出警告&#xff1a;一臺擁有不到一百萬噪聲量子比特的計算機&#xff0c;可能在一周…

ARM 架構的存儲器模型

ARM 架構的存儲器模型 ARM 的存儲器模型是一個相對復雜但設計精密的體系&#xff0c;它定義了處理器如何與內存進行交互&#xff0c;包括內存訪問的順序、可見性以及緩存行為等。這對于理解多核編程、并發控制和底層系統性能至關重要。 ARM 架構&#xff0c;特別是 ARMv8 及以后…

機器學習-多層感知機MLP

線性方法->多層感知機&#xff08;MLP&#xff09; 一個全連接&#xff08;線性、dense&#xff09;層有參數W∈Rm?nW\in\R^{m*n}W∈Rm?n,b∈Rmb\in\R^mb∈Rm&#xff0c;其用于計算輸出yWxb∈RmyWxb\in\R^myWxb∈Rm 線性回歸&#xff1a;全連接層有1個輸出softmax 回歸&a…

PostgreSQL——并行查詢

這里寫目錄標題一、并行查詢相關自己置參數二、并行掃描2.1、并行順序掃描2.2、并行索引掃描2.3、并行index-only掃描2.4、并行bitmap heap掃描三、并行聚合四、多表關聯4.1、Nested loop多表關聯4.2、Merge join多表關聯4.3、Hash join多表關聯了解 Oracle 的朋友應該知道 Ora…

智能體賦能金融多模態報告自動化生成:技術原理與實現流程全解析

在金融領域&#xff0c;研報作為決策參考的核心載體&#xff0c;其生成過程往往涉及海量數據采集、多維度分析及專業內容整合&#xff0c;傳統人工制作模式不僅耗時耗力&#xff0c;還難以滿足實時性與標準化需求。隨著人工智能技術的發展&#xff0c;“智能體賦能的金融多模態…

uniapp和vue3項目中引入echarts 、lime-echart(微信小程序、H5等)

目錄標題1、獲取 lime-echart插件2、安裝 echarts3、相關代碼4、在線定制5、效果截圖1、獲取 lime-echart插件 https://gitee.com/liangei/lime-echart 將其中組件和靜態資源分別放入當前項目對應的文件夾中&#xff1a; 2、安裝 echarts npm install echarts --save具體查…

ZYNQ7020+AD9361裸機驅動驗證

1. 程序編譯驗證 a. 下載源代碼 首先需要從GitHub下載相應的源碼&#xff0c;打開git bash&#xff0c;然后在mingwin中使用以下命令下載源碼。 git clone --recursive https://github.com/MicroPhase/antsdr_standalone.git 注意&#xff1a;在下載源碼的時候&#xff0c;使…

Grafana配置連接時候證書與mongosqld啟動證書的關系

目錄 證書角色說明 1. BI Connector 端的證書 (--sslPEMKeyFile) 2. Grafana 端的證書 (TLS/SSL Client Certificate & Key) 它們之間的關系 配置建議 情況一&#xff1a;只需要服務器驗證&#xff08;最常見&#xff09; 情況二&#xff1a;需要雙向SSL認證&#x…

解決HTML/JS開發中的常見問題與實用資源

在前端開發過程中&#xff0c;即使是經驗豐富的開發者也會遇到各種小問題。本文將聚焦于兩個常見問題的解決方案&#xff0c;并推薦一些國內可訪問的優質源碼學習網站&#xff0c;幫助開發者提升效率。 一、字符編碼與亂碼問題解決 在HTML和JavaScript開發中&#xff0c;字符編…

SQLI-labs[Part 2]

本篇為SQLI-labs的Write-Up的第二部分包含Level 23- Level 27Level 23 過濾注釋符 字符注入拼接語句發現注釋符沒有生效 應該是被過濾了那只能通過拼接語句來除去后面的影響拼接?id1 or 11?id1%27%20or%20%271%27%271源碼中最后的導致語句閉合 Level 24 字符二次注入成功登錄…

宋紅康 JVM 筆記 Day17|垃圾回收器

一、今日視頻區間 P169-P203 二、一句話總結 GC分類與性能指標&#xff1b;不同的垃圾回收器概述&#xff1b;Serial回收器&#xff1a;串行回收&#xff1b;ParNew回收器&#xff1a;并行回收&#xff1b;Parallel回收器&#xff1a;吞吐量優先&#xff1b;CMS回收器&#xff…

[硬件電路-194]:NPN三極管、MOS-N, IGBT比較

NPN三極管、MOS-N&#xff08;N溝道MOS管&#xff09;和IGBT&#xff08;絕緣柵雙極型晶體管&#xff09;在電子電路設計中各有其獨特的應用場景和優勢&#xff0c;以下從工作原理、特性、應用領域三個維度進行比較&#xff1a;工作原理NPN三極管&#xff1a;結構&#xff1a;由…

【代碼隨想錄day 25】 力扣 46. 全排列

視頻講解&#xff1a;https://www.bilibili.com/video/BV19v4y1S79W/?vd_sourcea935eaede74a204ec74fd041b917810c 文檔講解&#xff1a;https://programmercarl.com/0046.%E5%85%A8%E6%8E%92%E5%88%97.html#%E6%80%9D%E8%B7%AF 力扣題目&#xff1a;https://leetcode.cn/prob…

指針(五)后半

1、 qsort 函數1.1、qsort 函數排列結構體在這里&#xff0c;我們創建結構體類型的數組&#xff0c;用于 qsort 函數的傳參。#include<stdio.h> #include<stdlib.h> #include<string.h>struct Stu//創建結構體變量 {char name[30];int age; };struct Stu arr…

TDengine 特殊選擇函數 MODE() 用戶手冊

MODE 函數用戶手冊 函數定義 MODE(expr)功能說明 MODE() 函數返回指定列中出現頻率最高的值&#xff08;眾數&#xff09;。如果有多個值具有相同的最高頻率&#xff0c;系統會返回其中一個值。該函數會忽略 NULL 值。 算法原理 MODE 函數的計算過程如下&#xff1a; 數據…