Mybatis中${param}與#{param}的區(qū)別說明
${param}與#{param}的區(qū)別
${param}表達(dá)式主要用戶獲取配置文件數(shù)據(jù),DAO接口中的參數(shù)信息,當(dāng) $ 出現(xiàn)在映射文件的 SQl 語句中時創(chuàng)建的不是預(yù)編譯的 SQL ,而是字符串的拼接有可能會導(dǎo)致 SQL 注入的問題,所以一般使用 $ 接收 DAO 參數(shù)時,這些參數(shù)一般是字段名,表名等.例如 order by {column}
#{param} 表達(dá)式主要是用戶獲取 DAO 中的參數(shù)數(shù)據(jù),在映射文件的SQL 語句中出現(xiàn) #{} 表達(dá)式,底層會創(chuàng)建預(yù)編譯的 SQL .性能會相對較好
${} 獲取 DAO 參數(shù)數(shù)據(jù)時,參數(shù)必須使用 @param 注解進(jìn)行修飾
#{} 獲取 DAO 參數(shù)數(shù)據(jù)時,假如參數(shù)個數(shù)多于一個,可有選擇的使用@param
Mybatis中#{}與${}使用總結(jié)
#{ }與${ }的區(qū)別
1、#{ }將傳入的數(shù)據(jù)都當(dāng)成一個字符串,會對自動傳入的數(shù)據(jù)加一個雙引號。 如:
delete from user where name= #{name}實際相當(dāng)于一個占位符:
delete from user where name= ?
如果傳入的值是123,那么解析成sql時的值為 delete from user where name= 123, 如果傳入的值是字符串 Rose,則解析成的sql為delete from user where name= 'Rose'
2、${ }將傳入的數(shù)據(jù)直接顯示生成在sql中,即原樣拼接。對于
delete from user where name= ${name}如果傳入的值int類型的123,那么解析成sql時的值為
delete from user where name= 123
如果傳入的值是字符串Rose,則解析成的sql為
delete from user where name= Rose
這樣就是錯誤的,必須將原來的語句改為
delete from user where name= '${name}'3、#方式能夠防止sql注入;$方式無法防止Sql注入
$方式一般用于傳入數(shù)據(jù)庫對象,例如傳入表名
默認(rèn)情況下,使用#{}格式的語法會導(dǎo)致MyBatis創(chuàng)建預(yù)處理語句屬性并以它為背景設(shè)置安全的值。這樣做很安全,很迅速也是首選做法,有時只是想直接在SQL語句中插入一個不改變的字符串,可以使用${ }。
使用總結(jié)
1、#{ }:多用于傳遞查詢的參數(shù);一般用在用戶輸入值的地方,在sql中:字段 比較符號(=、>、<、!=、<>) #{用戶輸入的值};
- 如果傳遞參數(shù)是基本類型(非字符類型),獲取參數(shù)是原樣獲取, 如果是字符串,#{}獲取時會自動給加一個引號。
- 對于基本類型和String類型可以在#{ }內(nèi)任意填寫,一半填寫對應(yīng)值。
2、${ }:一般用于傳入數(shù)據(jù)庫對象,例如傳入表名,如:$(表名);一般用于order by的后面,如:order by $(字段);表名作為變量時,必須使用 ${ };用在我們能夠確定值的地方,也就是我們程序員自己賦值的地方;
- 如果傳遞是基本類型的闡述,int,String等等。${}只能寫value,如${value}
3、如果傳遞參數(shù)是對象:#{}和${}都是ognl表達(dá)式來獲取 (對象導(dǎo)航語言 屬性.屬性.屬性)
- 如:
<update id="updateUserByID" parameterType="domain.User">
?update user set username=#{username},sex=#{sex},birthday=#{birthday} where id=#{id}
</update>- #{}內(nèi)的內(nèi)容必須是User對應(yīng)的屬性值。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于Springboot+Vue實現(xiàn)的在線答題闖關(guān)系統(tǒng)全過程
這篇文章主要介紹了基于Springboot+Vue實現(xiàn)的在線答題闖關(guān)系統(tǒng)的相關(guān)資料,文中包括前端Vue.js、后端SpringBoot及MySQL數(shù)據(jù)庫的使用,系統(tǒng)功能涵蓋順序出題、體型練習(xí)、隨機出題、錯題本、收藏題和答題統(tǒng)計等,需要的朋友可以參考下2024-12-12
Java字符串?dāng)?shù)組的創(chuàng)建代碼示例
這篇文章主要介紹了Java中字符串?dāng)?shù)組的聲明、初始化、默認(rèn)值、遍歷和常見操作,文中通過代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2025-03-03
如何在Intellij中安裝LeetCode刷題插件方便Java刷題
這篇文章主要介紹了如何在Intellij中安裝LeetCode刷題插件方便Java刷題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
springboot?vue測試列表遞歸查詢子節(jié)點下的接口功能實現(xiàn)
這篇文章主要為大家介紹了springboot?vue測試列表遞歸查詢子節(jié)點下的接口功能實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Java的方法和this關(guān)鍵字如何理解與應(yīng)用
Java語言中的“方法”(Method)在其他語言當(dāng)中也可能被稱為“函數(shù)”(Function)。對于一些復(fù)雜的代碼邏輯,如果希望重復(fù)使用這些代碼,并且做到“隨時任意使用”,那么就可以將這些代碼放在一個大括號{}當(dāng)中,并且起一個名字。使用代碼的時候,直接找到名字調(diào)用即可2021-10-10

