mybatis中${}和#{}的區(qū)別以及底層原理分析
${}和#{}的區(qū)別以及底層原理
${}
不會(huì)自動(dòng)加 ' ',如果傳入?yún)?shù)為簡單類型,那么必須寫 ${value},如果是對(duì)象,寫的是${屬性名};
底層解析的時(shí)候只要sql語句包含 ${ } ,在創(chuàng)建cofigration對(duì)象的時(shí)候,這條sql就會(huì)被解析成動(dòng)態(tài)類型的語句,底層不會(huì)把 ${ } 轉(zhuǎn)成 " ? "(不做處理),只會(huì)在使用Mapper接口代理對(duì)象進(jìn)行數(shù)據(jù)操作的時(shí)候把#{ }轉(zhuǎn)成 " ? ",之后再調(diào)用JDBC進(jìn)行賦值,把${ }轉(zhuǎn)成mapper接口的參數(shù)值,所以會(huì)存在SQL注入的問題
#{}
對(duì)于字符串會(huì)自動(dòng)加 ' ',如果傳入?yún)?shù)為簡單類型,可以寫 ${任意值},如果是對(duì)象,寫的是${屬性名}
底層解析的時(shí)候如果sql語句只包含 #{ } ,這條sql就會(huì)被解析成靜態(tài)類型的語句,會(huì)把 #{ }轉(zhuǎn)成 " ? ",進(jìn)行數(shù)據(jù)操作時(shí)調(diào)用JDBC進(jìn)行賦值
#{}和${}取值符號(hào)
如圖,兩個(gè)方法的參數(shù)類型為簡單類型,簡單類型包括8大基本類型和String
- 1. #{}取值符號(hào)會(huì)自動(dòng)為String類型的參數(shù)加上‘’單引號(hào)
- 2. ${}取值符號(hào)不會(huì)自動(dòng)為String加上‘’單引號(hào)
當(dāng)sql標(biāo)簽的查詢代碼是 select * from t_user where username = ‘lyx’;
這種情況,需要使用自動(dòng)加上單引號(hào)的#{}:select * from t_user where username = #{username}
當(dāng)查詢數(shù)據(jù)降序排序時(shí):
UserDao接口如下:

select * from t_user order by 排序字段名 desc
UserMapper.xml文件如下:

調(diào)用

- queryUserOrderByColumn(String column)運(yùn)行結(jié)果

- queryUserOrderByColumn2(String column)運(yùn)行結(jié)果2

- 看數(shù)據(jù)庫中的數(shù)據(jù),說明方法1沒有成功降序排序

所以對(duì)于動(dòng)態(tài)排序的sql語句,要用${},而不用#{}
對(duì)于排序正確 的代碼是
select * from t_user order by username desc
如果使用#{},會(huì)自動(dòng)為String類型添加單引號(hào),變成
select * from t_user order by 'username' desc
所以查不到數(shù)據(jù)
來看使用${}的第二種情況:模糊查詢
sql語句應(yīng)該是,
LIKE_ (單個(gè)任意字符) 列名 LIKE ‘張_' LIKE % (任意長度的任意字符) 列名 LIKE ‘張%'

顯然,使用 ${},不自動(dòng)添加單引號(hào)才是正確的
調(diào)用運(yùn)行

運(yùn)行結(jié)果:

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Mybatis中#{}和${}傳參的區(qū)別及#和$的區(qū)別小結(jié)
- MyBatis中#{}和${}的區(qū)別詳解
- MyBatis 中 ${}和 #{}的正確使用方法(千萬不要亂用)
- MyBatis中使用#{}和${}占位符傳遞參數(shù)的各種報(bào)錯(cuò)信息處理方案
- MyBatis中#{}?和?${}?的區(qū)別和動(dòng)態(tài)?SQL詳解
- 詳解mybatis #{}和${}的區(qū)別、傳參、基本語法
- MyBatis 探秘之#{} 與 ${} 參傳差異解碼(數(shù)據(jù)庫連接池筑牢數(shù)據(jù)交互根基)
- MyBatis中#{}和${}的區(qū)別及底層原理、適用場(chǎng)景和安全風(fēng)險(xiǎn)
相關(guān)文章
使用SpringBoot中web項(xiàng)目推薦目錄結(jié)構(gòu)的問題
這篇文章主要介紹了SpringBoot中web項(xiàng)目推薦目錄結(jié)構(gòu)的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01
java類訪問權(quán)限與成員訪問權(quán)限解析
這篇文章主要針對(duì)java類訪問權(quán)限與成員訪問權(quán)限進(jìn)行解析,對(duì)類與成員訪問權(quán)限進(jìn)行驗(yàn)證,感興趣的小伙伴們可以參考一下2016-02-02
Java使用新浪微博API通過賬號(hào)密碼方式登陸微博的實(shí)例
這篇文章主要介紹了Java使用新浪微博API通過賬號(hào)密碼方式登陸微博的實(shí)例,一般來說第三方App都是采用OAuth授權(quán)認(rèn)證然后跳轉(zhuǎn)之類的方法,而本文所介紹的賬號(hào)方式則更具有自由度,需要的朋友可以參考下2016-02-02
InputStreamReader 和FileReader的區(qū)別及InputStream和Reader的區(qū)別
這篇文章主要介紹了InputStreamReader 和FileReader的區(qū)別及InputStream和Reader的區(qū)別的相關(guān)資料,需要的朋友可以參考下2015-12-12
SpringCloud_Eureka服務(wù)注冊(cè)與發(fā)現(xiàn)基礎(chǔ)及構(gòu)建步驟
Eureka服務(wù)注冊(cè)中心,主要用于提供服務(wù)注冊(cè)功能,當(dāng)微服務(wù)啟動(dòng)時(shí),會(huì)將自己的服務(wù)注冊(cè)到Eureka Server,這篇文章主要介紹了SpringCloud中Eureka的配置及詳細(xì)使用,需要的朋友可以參考下2023-01-01
Springboot搭建JVM監(jiān)控(Springboot + Prometheus +&n
在應(yīng)用開發(fā)時(shí),監(jiān)控報(bào)警必不可少,本文主要介紹了Springboot搭建JVM監(jiān)控(Springboot + Prometheus + Grafana),具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05
java實(shí)現(xiàn)文件夾上傳功能實(shí)例代碼(SpringBoot框架)
在web項(xiàng)目中上傳文件夾現(xiàn)在已經(jīng)成為了一個(gè)主流的需求,下面這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)文件夾上傳功能(springBoot框架)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04

