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

MyBatis中#{}和${}的區(qū)別詳解

 更新時(shí)間:2016年08月18日 11:12:34   作者:jason.bai  
mybatis和ibatis總體來講都差不多的。下面小編給大家探討下mybatis中#{}和${}的區(qū)別,感興趣的朋友一起學(xué)習(xí)吧

最近在用mybatis,之前用過ibatis,總體來說差不多,不過還是遇到了不少問題,再次記錄下.

先給大家介紹下MyBatis中#{}和${}的區(qū)別,具體介紹如下:

1. #將傳入的數(shù)據(jù)都當(dāng)成一個(gè)字符串,會(huì)對(duì)自動(dòng)傳入的數(shù)據(jù)加一個(gè)雙引號(hào)。如:order by #user_id#,如果傳入的值是111,那么解析成sql時(shí)的值為order by "111", 如果傳入的值是id,則解析成的sql為order by "id".

2. $將傳入的數(shù)據(jù)直接顯示生成在sql中。如:order by $user_id$,如果傳入的值是111,那么解析成sql時(shí)的值為order by user_id, 如果傳入的值是id,則解析成的sql為order by id.

3. #方式能夠很大程度防止sql注入。 

4.$方式無法防止Sql注入。

5.$方式一般用于傳入數(shù)據(jù)庫對(duì)象,例如傳入表名.

6.一般能用#的就別用$.

MyBatis排序時(shí)使用order by 動(dòng)態(tài)參數(shù)時(shí)需要注意,用$而不是#

字符串替換

默認(rèn)情況下,使用#{}格式的語法會(huì)導(dǎo)致MyBatis創(chuàng)建預(yù)處理語句屬性并以它為背景設(shè)置安全的值(比如?)。這樣做很安全,很迅速也是首選做法,有時(shí)你只是想直接在SQL語句中插入一個(gè)不改變的字符串。比如,像ORDER BY,你可以這樣來使用:
ORDER BY ${columnName}

這里MyBatis不會(huì)修改或轉(zhuǎn)義字符串。

重要:接受從用戶輸出的內(nèi)容并提供給語句中不變的字符串,這樣做是不安全的。這會(huì)導(dǎo)致潛在的SQL注入攻擊,因此你不應(yīng)該允許用戶輸入這些字段,或者通常自行轉(zhuǎn)義并檢查。

mybatis本身的說明:

String Substitution
By default, using the #{} syntax will cause MyBatis to generate PreparedStatement properties and set the values safely against the PreparedStatement parameters (e.g. ?). While this is safer, faster and almost always preferred, sometimes you just want to directly inject a string unmodified into the SQL Statement. For example, for ORDER BY, you might use something like this:
ORDER BY ${columnName}
Here MyBatis won't modify or escape the string.
NOTE It's not safe to accept input from a user and supply it to a statement unmodified in this way. This leads to potential SQL Injection attacks and therefore you should either disallow user input in these fields, or always perform your own escapes and checks. 

從上文可以看出:

1. 使用#{}格式的語法在mybatis中使用Preparement語句來安全的設(shè)置值,執(zhí)行sql類似下面的:

PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,id); 

這樣做的好處是:更安全,更迅速,通常也是首選做法。

2. 不過有時(shí)你只是想直接在 SQL 語句中插入一個(gè)不改變的字符串。比如,像 ORDER BY,你可以這樣來使用:

ORDER BY ${columnName} 

此時(shí)MyBatis 不會(huì)修改或轉(zhuǎn)義字符串。

這種方式類似于:

Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql); 

這種方式的缺點(diǎn)是:

以這種方式接受從用戶輸出的內(nèi)容并提供給語句中不變的字符串是不安全的,會(huì)導(dǎo)致潛在的 SQL 注入攻擊,因此要么不允許用戶輸入這些字段,要么自行轉(zhuǎn)義并檢驗(yàn)。

相關(guān)文章

  • 淺談Spring Cloud下微服務(wù)權(quán)限方案

    淺談Spring Cloud下微服務(wù)權(quán)限方案

    這篇文章主要介紹了淺談Spring Cloud下微服務(wù)權(quán)限方案,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • Springboot公共字段填充及ThreadLocal模塊改進(jìn)方案

    Springboot公共字段填充及ThreadLocal模塊改進(jìn)方案

    這篇文章主要為大家介紹了Springboot公共字段填充及ThreadLocal模塊改進(jìn)方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Java實(shí)現(xiàn)整數(shù)的逆序輸出的三種方法

    Java實(shí)現(xiàn)整數(shù)的逆序輸出的三種方法

    這篇文章主要介紹了Java實(shí)現(xiàn)整數(shù)的逆序輸出的三種方法,第一種是無限制整數(shù)的逆序輸出,第二種是非負(fù)整數(shù)的逆序輸出,第三種是非特殊情況的逆序輸出,每種方法給大家講解的非常詳細(xì)需要的朋友可以參考下
    2022-11-11
  • 快速理解Java垃圾回收和jvm中的stw

    快速理解Java垃圾回收和jvm中的stw

    這篇文章主要介紹了快速理解Java垃圾回收和jvm中的stw,涉及Java代碼的停頓,jvm中的線程等相關(guān)內(nèi)容,還是十分不錯(cuò)的,需要的朋友可以參考。
    2017-10-10
  • Java設(shè)計(jì)模式之構(gòu)建者模式知識(shí)總結(jié)

    Java設(shè)計(jì)模式之構(gòu)建者模式知識(shí)總結(jié)

    這幾天剛好在復(fù)習(xí)Java的設(shè)計(jì)模式,今天就給小伙伴們?nèi)婵偨Y(jié)一下開發(fā)中最常用的設(shè)計(jì)模式-建造者模式的相關(guān)知識(shí),里面有很詳細(xì)的代碼示例及注釋哦,需要的朋友可以參考下
    2021-05-05
  • Jmeter基于JDBC請(qǐng)求實(shí)現(xiàn)MySQL數(shù)據(jù)庫測(cè)試

    Jmeter基于JDBC請(qǐng)求實(shí)現(xiàn)MySQL數(shù)據(jù)庫測(cè)試

    這篇文章主要介紹了Jmeter基于JDBC請(qǐng)求實(shí)現(xiàn)MySQL數(shù)據(jù)庫測(cè)試,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 如何解決springboot讀取配置文件的中文亂碼問題

    如何解決springboot讀取配置文件的中文亂碼問題

    本篇文章主要介紹了如何解決springboot讀取配置文件的中文亂碼問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看
    2018-05-05
  • SpringBoot?server.port配置原理詳解

    SpringBoot?server.port配置原理詳解

    這篇文章主要介紹了Spring?Boot?server.port配置原理詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 如何使用nexus在局域網(wǎng)內(nèi)搭建maven私服及idea的使用

    如何使用nexus在局域網(wǎng)內(nèi)搭建maven私服及idea的使用

    這篇文章主要介紹了如何使用nexus在局域網(wǎng)內(nèi)搭建maven私服及idea的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • Spring Boot中操作使用Redis實(shí)現(xiàn)詳解

    Spring Boot中操作使用Redis實(shí)現(xiàn)詳解

    Spring Boot與Redis結(jié)合使用,通過使用Spring Data Redis來實(shí)現(xiàn)對(duì)Redis的操作,實(shí)現(xiàn)數(shù)據(jù)緩存和高效存儲(chǔ),提高應(yīng)用程序的性能和響應(yīng)速度??梢岳肧pring Boot自帶的Redis Starter方便地集成和配置Redis
    2023-04-04

最新評(píng)論