欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis中 #{} 和 ${} 的區(qū)別小結(jié)

 更新時(shí)間:2024年12月08日 09:26:37   作者:這孩子叫逆  
MyBatis中#{}和${}是兩種占位符,本文就來(lái)介紹一下MyBatis中 #{} 和 ${} 的區(qū)別小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在MyBatis中,#{}${}是兩種常見(jiàn)的占位符,它們的作用和使用場(chǎng)景有所不同。理解它們的區(qū)別對(duì)于正確使用MyBatis非常重要。

在Mybatis面試中常涉及到關(guān)于#{}和${}的區(qū)別

1、#{}是預(yù)編譯處理,$ {}是字符串替換。

2、MyBatis在處理#{}時(shí),會(huì)將SQL中的#{}替換為?號(hào),使用PreparedStatement的set方法來(lái)賦值;MyBatis在處理 $ { } 時(shí),就是把 ${ } 替換成變量的值。

3、使用 #{} 可以有效的防止SQL注入,提高系統(tǒng)安全性。

1. #{} 和 ${} 的基本區(qū)別

#{}:SQL參數(shù)占位符

作用#{}用于將傳入的參數(shù)安全地綁定到SQL語(yǔ)句中,它會(huì)自動(dòng)使用PreparedStatement?占位符機(jī)制,并且MyBatis會(huì)對(duì)傳入的參數(shù)進(jìn)行預(yù)處理(例如防止SQL注入)。

參數(shù)替換:在生成SQL語(yǔ)句時(shí),#{}會(huì)被替換為一個(gè)?,然后由JDBC驅(qū)動(dòng)程序?qū)?shù)值綁定到這個(gè)?占位符上。

使用場(chǎng)景:通常用于傳遞用戶(hù)輸入的參數(shù),如查詢(xún)條件、插入或更新的數(shù)據(jù)等。

示例

<select id="findUserById" resultType="User">
    SELECT * FROM users WHERE id = #{id}
</select>
  • 如果傳入的id為1,MyBatis生成的SQL類(lèi)似于:SELECT * FROM users WHERE id = ?,然后通過(guò)PreparedStatement?替換為1。

${}:SQL文本占位符

作用${}用于直接將傳入的參數(shù)值替換到SQL語(yǔ)句中,它不會(huì)進(jìn)行預(yù)處理,因此直接將參數(shù)值插入到SQL語(yǔ)句中。這意味著${}會(huì)將參數(shù)視為SQL的一部分,可能會(huì)導(dǎo)致SQL注入風(fēng)險(xiǎn)。

參數(shù)替換:在生成SQL語(yǔ)句時(shí),${}會(huì)直接將傳入的值替換到SQL語(yǔ)句中,而不會(huì)使用?占位符。

使用場(chǎng)景:通常用于動(dòng)態(tài)生成SQL片段,比如排序字段名、表名、列名等不直接來(lái)自用戶(hù)輸入的參數(shù)。

示例

<select id="findUserByColumn" resultType="User">
    SELECT * FROM users WHERE ${columnName} = #{value}
</select>
  • 如果傳入的columnNameusername,valueJohn,MyBatis生成的SQL類(lèi)似于:SELECT * FROM users WHERE username = ?,然后通過(guò)PreparedStatement?替換為John。

2. 安全性和使用建議

  • SQL注入防護(hù):由于#{}會(huì)使用PreparedStatement的參數(shù)綁定機(jī)制,因此可以有效防止SQL注入攻擊。而${}直接將參數(shù)值拼接到SQL中,可能導(dǎo)致SQL注入,因此應(yīng)慎重使用。

  • 動(dòng)態(tài)SQL生成${}更適合用于生成動(dòng)態(tài)的SQL片段,比如動(dòng)態(tài)表名、列名等。但要確保傳入的值是可信任的,或者通過(guò)其他手段確保安全。

3. 具體示例

使用 #{} 的示例

<select id="findUserById" resultType="User">
    SELECT * FROM users WHERE id = #{id}
</select>

傳入id為1,生成SQL為:

SELECT * FROM users WHERE id = ?

然后將參數(shù)1安全地綁定到?上。

使用 ${} 的示例

<select id="findUserByColumn" resultType="User">
    SELECT * FROM users WHERE ${columnName} = #{value}
</select>

傳入columnNameusername,valueJohn,生成SQL為:

SELECT * FROM users WHERE username = ?

然后將參數(shù)John綁定到?上。

SQL注入風(fēng)險(xiǎn)示例

<select id="findUserByColumn" resultType="User">
    SELECT * FROM users WHERE ${columnName} = #{value}
</select>

如果傳入的columnNameusername OR '1'='1',生成的SQL可能是:

SELECT * FROM users WHERE username OR '1'='1' = ?

這樣就可能導(dǎo)致SQL注入問(wèn)題。

總結(jié)

  • #{}:安全地傳遞參數(shù),防止SQL注入,常用于傳遞用戶(hù)輸入的參數(shù)。

  • ${}:直接將參數(shù)值插入到SQL中,適用于動(dòng)態(tài)生成SQL片段(如表名、列名),但存在SQL注入風(fēng)險(xiǎn),應(yīng)謹(jǐn)慎使用。

在實(shí)際開(kāi)發(fā)中,建議盡量使用#{}來(lái)傳遞參數(shù),以確保SQL安全性,而對(duì)于使用${}的場(chǎng)景,需要確保傳入的參數(shù)是安全且經(jīng)過(guò)驗(yàn)證的。

到此這篇關(guān)于MyBatis中 /#{} 和 /${} 的區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)MyBatis  /#{} 和 /${}內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Spring Framework 時(shí)常犯的十大錯(cuò)誤(小結(jié))

    使用Spring Framework 時(shí)常犯的十大錯(cuò)誤(小結(jié))

    這篇文章主要介紹了使用Spring Framework 時(shí)常犯的十大錯(cuò)誤(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 為什么Spring官方推薦的@Transational還能導(dǎo)致生產(chǎn)事故

    為什么Spring官方推薦的@Transational還能導(dǎo)致生產(chǎn)事故

    在Spring中進(jìn)行事務(wù)管理非常簡(jiǎn)單,只需要在方法上加上注解@Transactional,那么為什么Spring官方推薦的@Transational還能導(dǎo)致生產(chǎn)事故,本文就詳細(xì)的介紹一下
    2021-11-11
  • Java代理模式的深入了解

    Java代理模式的深入了解

    這篇文章主要為大家介紹了Java代理模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • SpringMVC按Ctrl上傳多個(gè)文件的方法

    SpringMVC按Ctrl上傳多個(gè)文件的方法

    這篇文章主要為大家詳細(xì)介紹了SpringMVC按Ctrl上傳多個(gè)文件的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Java獲取七牛云存儲(chǔ)空間中圖片外鏈

    Java獲取七牛云存儲(chǔ)空間中圖片外鏈

    本文主要介紹了Java獲取七牛云存儲(chǔ)空間中圖片外鏈,需要獲取在七牛云中存儲(chǔ)的所有圖片,并返回外鏈地址,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • 使用AOP的@Around后無(wú)返回值的解決

    使用AOP的@Around后無(wú)返回值的解決

    這篇文章主要介紹了使用AOP的@Around后無(wú)返回值的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • SpringBoot中定義Bean的方法總結(jié)

    SpringBoot中定義Bean的方法總結(jié)

    在Spring Boot應(yīng)用程序中,定義Bean是非常常見(jiàn)的操作,它是構(gòu)建應(yīng)用程序的基礎(chǔ),pring Boot提供了多種方式來(lái)定義Bean,每種方式都有其適用的場(chǎng)景和優(yōu)勢(shì),本文將介紹Spring Boot中定義Bean的幾種常見(jiàn)方式,需要的朋友可以參考下
    2023-12-12
  • Java基于SpringBoot和tk.mybatis實(shí)現(xiàn)事務(wù)讀寫(xiě)分離代碼實(shí)例

    Java基于SpringBoot和tk.mybatis實(shí)現(xiàn)事務(wù)讀寫(xiě)分離代碼實(shí)例

    這篇文章主要介紹了Java基于SpringBoot和tk.mybatis實(shí)現(xiàn)事務(wù)讀寫(xiě)分離代碼實(shí)例,讀寫(xiě)分離,基本的原理是讓主數(shù)據(jù)庫(kù)處理事務(wù)性增、改、刪操作,而從數(shù)據(jù)庫(kù)處理SELECT查詢(xún)操作,數(shù)據(jù)庫(kù)復(fù)制被用來(lái)把事務(wù)性操作導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫(kù),需要的朋友可以參考下
    2023-10-10
  • Mybatis中如何映射mysql中的JSON字段

    Mybatis中如何映射mysql中的JSON字段

    在mapper.xml中,需要在字段映射時(shí)加入typeHandler,具體:<id?property="abnormalEigenList"?column="AbnormalEigen"?typeHandler="com.xxx.config.JsonHandler">,下面通過(guò)本文給大家介紹Mybatis中,映射mysql中的JSON字段,需要的朋友可以參考下
    2023-10-10
  • spring aop action中驗(yàn)證用戶(hù)登錄狀態(tài)的實(shí)例代碼

    spring aop action中驗(yàn)證用戶(hù)登錄狀態(tài)的實(shí)例代碼

    本篇文章主要介紹了spring aop action中驗(yàn)證用戶(hù)登錄狀態(tài)的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07

最新評(píng)論