MyBatis中 #{} 和 ${} 區別

Mybatis的Mapper映射文件中,有兩種方式可以引用形參變量進行取值: #{} 和 ${}。本文將簡述兩種方式的區別和適用場景

取值引用

#{} 方式

#{}: 解析為SQL時,會將形參變量的值取出,并自動給其添加引號。 例如:當實參username="Amy"時,傳入下Mapper映射文件后

......<select id="findByName" parameterType="String" resultMap="studentResultMap">SELECT * FROM user WHERE username=#{value}</select>....

SQL將解析為:

SELECT * FROM user WHERE username='Amy'

${} 方式

${}: 解析為SQL時,將形參變量的值直接取出,直接拼接顯示在SQL中

例如:當實參username="Amy"時,傳入下Mapper映射文件后

......<select id="findByName" parameterType="String" resultMap="studentResultMap">SELECT * FROM user WHERE username=${value}</select>....

SQL將解析如下:

SELECT * FROM user WHERE username=Amy

顯而該SQL無法正常執行,故需要在mppaer映射文件中的${value}前后手動添加引號,如下所示:

......<select id="findByName" parameterType="String" resultMap="studentResultMap">SELECT * FROM user WHERE username='${value}'</select>....

SQL將解析為:

SELECT * FROM user WHERE username='Amy'

SQL 注入

${}方式是將形參和SQL語句直接拼接形成完整的SQL命令后,再進行編譯,所以可以通過精心設計的形參變量的值,來改變原SQL語句的使用意圖從而產生安全隱患,即為SQL注入攻擊。現舉例說明:

現有Mapper映射文件如下:

......<select id="findByName" parameterType="String" resultMap="studentResultMap">SELECT * FROM user WHERE username='${value}'</select>....

當 username = "' OR 1=1 OR '" 傳入后,${}將變量內容直接和SQL語句進行拼接,結果如下:

SELECT * FROM user WHERE username='' OR 1=1 OR '';

顯而易見,上述語句將把整個數據庫內容直接暴露出來了

#{}方式則是先用占位符代替參數將SQL語句先進行預編譯,然后再將參數中的內容替換進來。由于SQL語句已經被預編譯過,其SQL意圖將無法通過非法的參數內容實現更改,其參數中的內容,無法變為SQL命令的一部分。故,#{}可以防止SQL注入而${}卻不行

適用場景

#{} 和 ${} 均適用場景

由于SQL注入的原因,${}和#{}在都可以使用的場景下,很明顯推薦使用#{}。這里除了上文的WHERE語句例子,再介紹一個LIKE模糊查詢的場景(username = "Amy"):

<select id="findAddByName" parameterType="String" resultMap="studentResultMap">SELECT * FROM user WHERE username LIKE '%${value}%'</select>

該SQL解析為:

SELECT * FROM user WHERE username LIKE '%Amy%';

上述通過${}雖然可以實現對包含"Amy"對模糊查詢,但是不安全,可以改用#{},如下所示:

<select id="findAddByName" parameterType="String" resultMap="studentResultMap">SELECT * FROM USER WHERE username LIKE CONCAT('%', #{username}, '%')</select>

該SQL解析為下文所示,其效果和上文方式一致

SELECT * FROM USER WHERE username LIKE CONCAT('%', 'Amy','%');

只能使用${}的場景

由于#{}會給參數內容自動加上引號,會在有些需要表示字段名、表名的場景下,SQL將無法正常執行。現舉一例說明:

期望查詢結果按sex字段升序排列,參數String orderCol = "sex",mapper映射文件使用#{}:

<select id="findAddByName3" parameterType="String" resultMap="studentResultMap">SELECT * FROM USER WHERE username LIKE '%Am%' ORDER BY #{value} ASC</select>

則SQL解析及執行結果如下所示,很明顯 ORDER 子句的字段名錯誤的被加上了引號,致使查詢結果沒有按期排序輸出

SELECT * FROM USER WHERE username LIKE '%Am%' ORDER BY 'sex' ASC;

這時,現改為${}測試效果:

<select id="findAddByName3" parameterType="String" resultMap="studentResultMap">SELECT * FROM USER WHERE username LIKE '%Am%' ORDER BY ${value} ASC</select>

則SQL解析及執行結果如下所示:

SELECT * FROM USER WHERE username LIKE '%Am%' ORDER BY sex ASC;

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

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

相關文章

AI 筆記助手,你的思路整理助手

大家好&#xff0c;今天給大家介紹一款非常實用的 AI 筆記助手——AI Note。這款助手就像是一個貼心的小助手&#xff0c;能幫助我們整理筆記&#xff0c;提高學習和工作效率。 &#x1f916; AI Note 可以智能總結筆記內容&#xff0c;準確標記重點&#xff0c;讓我們更快地獲…

final關鍵字有什么作用

final關鍵字在Java中用于聲明變量、方法和類&#xff0c;表示它們的值或行為不能被修改。 被 final 修飾的類不可以被繼承 被 final 修飾的方法不可以被重寫 被 final 修飾的變量不可變&#xff0c;被 final 修飾的變量必須被顯式第指定初始值&#xff0c;還得注意的是&#…

學習助手:借助AI大模型,學習更高效!

在當今的數字時代&#xff0c;人工智能&#xff08;AI&#xff09;的崛起已經徹底改變了我們獲取信息、處理數據以及學習新知識的方式。AI大模型&#xff0c;特別是如OpenAI開發的GPT-4這類先進的技術&#xff0c;已成為學習和教育領域的一大助力。本文旨在探索如何借助AI大模型…

了解 SYN Flood 攻擊

文章目錄&#xff1a; 什么是 SYN Flood 攻擊&#xff1f;對網絡的影響SYN Flood 發生的跡象如何解決&#xff1f; 什么是 SYN Flood 攻擊&#xff1f; SYN Flood&#xff08;SYN 洪水攻擊&#xff09;是一種常見的分布式拒絕服務&#xff08;DDoS - Distributed Denial of Se…

購買騰訊云服務器請先領取代金券,2024騰訊云優惠

騰訊云優惠代金券領取入口共三個渠道&#xff0c;騰訊云新用戶和老用戶均可領取8888元代金券&#xff0c;可用于云服務器等產品購買、續費和升級使用&#xff0c;阿騰云atengyun.com整理騰訊云優惠券&#xff08;代金券&#xff09;領取入口、代金券查詢、優惠券兌換碼使用方法…

FL Studio選購指南:新手小白應該選擇哪個版本FL Studio?

很多打算入手正版FL Studio的新手朋友都會糾結一個問題&#xff1a;哪個版本的FL Studio更適合我&#xff0c;到底應該入手哪一款FL Studio&#xff1f;本文會介紹每個版本之間的差異點&#xff0c;并帶大家選擇適合自己的FL Sudio版本。 FL Studio全版本 在選購前有一些小知識…

UE5常見問題處理筆記

一、C工程中的文件出現很多頭文件找不到&#xff0c;比如&#xff1a;#include CoreMinimal.h文件提示找不到。 解決方法&#xff1a;在UE編輯器中選擇菜單Tools -> Refresh Visual Studio Project。 二、莫名其妙的編譯錯誤。 解決方法&#xff0c;找到工程根目錄下的Bi…

GO流程控制

1. if else 在Go語言中&#xff0c;關鍵字if是用于測試某個條件&#xff08;布爾型或邏輯型&#xff09;的語句&#xff0c;如果該條件成立&#xff0c;則會執行 if 后由大括號{}括起來的代碼塊&#xff0c;否則就忽略該代碼塊繼續執行后續的代碼。 if condition {// 條件為真…

qwen.cpp

1、Release模式 git clone --recursive https://github.com/QwenLM/qwen.cpp && cd qwen.cpp git submodule update --init --recursive python3 qwen_cpp/convert.py -i /mnt/workspace/qwen.cpp/Qianwen/qwen/Qwen-7B-Chat -t q4_0 -o qwen7b-ggml.bincmake -B buil…

什么是MAC地址? win10電腦查看MAC地址的多種方法

您是否知道連接到家庭網絡的每件硬件都有自己的身份&#xff1f;正如每個設備都分配有自己的 IP 地址一樣&#xff0c;每個硬件都有一個唯一的網絡標識符。 該標識符稱為MAC 地址。MAC 代表媒體訪問控制。您可能需要 MAC 地址來解決網絡問題或配置新設備。在 Windows 中查找您…

three.js 點乘判斷平行向量方向異同

效果&#xff1a; 代碼&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs"></div><div>判斷的前提是兩個向量平行<el-button click"judge"…

一文掌握大模型提示詞技巧:從戰略到戰術

作者&#xff1a;明明如月學長&#xff0c; CSDN 博客專家&#xff0c;大廠高級 Java 工程師&#xff0c;《性能優化方法論》作者、《解鎖大廠思維&#xff1a;剖析《阿里巴巴Java開發手冊》》、《再學經典&#xff1a;《Effective Java》獨家解析》專欄作者。 熱門文章推薦&am…

pytest 的 request fixture:實現個性化測試需求

在前文章中&#xff0c;我們看到pytest_repeat源碼中有這樣一段 pytest.fixture def __pytest_repeat_step_number(request):marker request.node.get_closest_marker("repeat")count marker and marker.args[0] or request.config.option.count......看到參數為r…

Stable Cascade又升級了,現在只需要兩個模型

Stable Cascade這個模型&#xff0c;大家如果還有印象的話&#xff0c;是需要下載三個模型的&#xff0c;分別是Stage_a,Stage_b和Stage_c,如果全都下載下來&#xff0c;需要20多個G&#xff0c;但是最近使用ComfyUI做嘗試的時候&#xff0c;發現官方的案例中已經沒有用到單獨的…

手擼AI-2: 設置腳本參數與設置隨機種子

一.設置腳本參數 1. 代碼示例 在完整的模型訓練代碼中,我們時常能看到通過python train.py --params 來訓練模型,這也是在無UI界面的服務器上訓練模型最主要的方法,因此使用腳本并設置腳本參數尤為重要. 我們通常會將腳本設置的代碼寫在config,py中,再用訓練主函數main.py進行…

P4715 【深基16.例1】淘汰賽題解

題目 有&#xff08;n≤7&#xff09;個國家參加世界杯決賽圈且進入淘汰賽環節。已經知道各個國家的能力值&#xff0c;且都不相等。能力值高的國家和能力值低的國家踢比賽時高者獲勝。1號國家和2號國家踢一場比賽&#xff0c;勝者晉級。3號國家和4號國家也踢一場&#xff0c;…

C++用臨時對象構造新對象

C用臨時對象構造新對象 //用臨時對象構造同類型的新對象&#xff0c;該臨時對象不產生&#xff1b; // 直接用生成臨時對象的方法構造新對象&#xff0c;這是編譯器對代碼的優化&#xff0c;效率更高 #include<iostream> using namespace std; class MyClass { public:…

Golang 調度器 GPM模型

Golang 調度器 GPM模型 1 多進程/線程時代有了調度器需求 在多進程/多線程的操作系統中&#xff0c;就解決了阻塞的問題&#xff0c;因為一個進程阻塞cpu可以立刻切換到其他進程中去執行&#xff0c;而且調度cpu的算法可以保證在運行的進程都可以被分配到cpu的運行時間片。這…

chatgpt:還有哪些人工智能和科技值得關注?

今天&#xff0c;很多人的目光都被ChatGPT吸引&#xff0c;其實&#xff0c;人工智能的范圍很大&#xff0c;遠不止ChatGPT或者其他自然語言的處理工具。所以說不管ChatGPT的結果如何&#xff0c;人工智能依然是未來。 那么在ChatGPT之外&#xff0c;還有沒有什么值得關注的人…

在網頁上踢球:打造我自己的python(Django)足球網站

足球不僅僅是球場上的90分鐘。它是一個不斷發展的故事&#xff0c;一個全球球迷社群的粘合劑&#xff0c;一個數據和熱情交織的世界。作為一名開發者和球迷&#xff0c;我決定將這兩大愛好結合起來&#xff0c;用 Django 打造一個足球網站&#xff0c;讓球迷們能夠追蹤他們最愛…