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

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

調(diào)用

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

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

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

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

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

運行結(jié)果:

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
圖數(shù)據(jù)庫NebulaGraph的Java 數(shù)據(jù)解析實踐與指導(dǎo)詳解
這篇文章主要介紹了圖數(shù)據(jù)庫NebulaGraph的Java 數(shù)據(jù)解析實踐與指導(dǎo)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04
SpringBoot使用?Sleuth?進行分布式跟蹤的過程分析
Spring Boot Sleuth是一個分布式跟蹤解決方案,它可以幫助您在分布式系統(tǒng)中跟蹤請求并分析性能問題,Spring Boot Sleuth是Spring Cloud的一部分,它提供了分布式跟蹤的功能,本文將介紹如何在Spring Boot應(yīng)用程序中使用Sleuth進行分布式跟蹤,感興趣的朋友一起看看吧2023-10-10
SpringBoot學(xué)習(xí)篇之@Valid與@Validated的區(qū)別
@Valid是使用Hibernate?validation的時候使用,@Validated是只用Spring?Validator校驗機制使用,下面這篇文章主要給大家介紹了關(guān)于SpringBoot學(xué)習(xí)篇之@Valid與@Validated區(qū)別的相關(guān)資料,需要的朋友可以參考下2022-11-11
JAVA中 redisTemplate 和 jedis的配合使用操作
這篇文章主要介紹了JAVA中 redisTemplate 和 jedis的配合使用操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02

