成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Mybatis中#{}和${}區(qū)別

IT那活兒 / 3315人閱讀
Mybatis中#{}和${}區(qū)別

點(diǎn)擊上方“IT那活兒”,關(guān)注后了解更多內(nèi)容,不管IT什么活兒,干就完了?。?!





初探#{}和${}



Mybatis中#{}和${}是傳遞查詢參數(shù)的兩種方式,首先看下他們的使用方式,這里以查詢姓名中包含字符“J”的數(shù)據(jù)列表為例。

現(xiàn)有一張User表,結(jié)構(gòu)和數(shù)據(jù)如下:

定義Dao接口:

定義Mapper文件:

執(zhí)行單元測試:

查看結(jié)果,兩種方式都查詢出了兩條記錄,都實現(xiàn)了需求。





SQL注入



#{}和${}雖然都能實現(xiàn)查詢,但區(qū)別還是有的,最大區(qū)別是${}方式可能導(dǎo)致SQL注入問題

看個例子,把上面的查詢條件改動下,在條件后加入 or 1=1 -- ,再分別看下結(jié)果。

修改查詢條件:

查看執(zhí)行結(jié)果,可以看到#{}方式查詢結(jié)果為0條,${}方式查出了所有記錄。

細(xì)思極恐啊,如果采用${}方式執(zhí)行update或delete操作,那整張表數(shù)據(jù)都會受到影響。





#{}和${}區(qū)別



查看mysql執(zhí)行l(wèi)og日志,拿到兩種方式執(zhí)行的sql語句如下:

對比發(fā)現(xiàn),雖然兩種方式查詢條件傳入的字符串一樣,但是Mysql執(zhí)行時生成的語句并不一樣,${}是字符串替換,而#{}是預(yù)處理,預(yù)處理時會對特殊字符進(jìn)行轉(zhuǎn)義操作。

Mybatis在處理${}時,就是把${}值直接替換成變量值。而在處理#{}時,會對sql語句進(jìn)行預(yù)處理,將sql中的#{}替換為?號,調(diào)用PreparedStatement的set方法來賦值。

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





應(yīng)用場景



我們已經(jīng)知道#{}可以有效的防止SQL注入,那為什么還要有${}方式呢?

既然存在,那肯定有用武之地,${}采用字符串拼接方式,還是舉個例子來介紹它的使用場景。

例如,針對查詢時表名不確定的情況,需要在查詢時將表名通過參數(shù)傳遞進(jìn)來,分別使用兩種方式測試下。

Mapper文件如下:

執(zhí)行單元測試:

查看結(jié)果,${}方式可以查詢出結(jié)果,而#{}方式拋出異常,這種情況下只能選擇${}方式查詢。





總  結(jié)



#{}針對輸入字符串進(jìn)行了轉(zhuǎn)義過濾處理,能夠防止SQL注入,適用于給SQL語句的where條件傳值的使用場景;

${}設(shè)計就是用于參與SQL的語法生成,適用于需要通過傳遞值來拼接SQL語句的場景。



本文作者:孫濤濤

本文來源:IT那活兒(上海新炬王翦團(tuán)隊)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/129579.html

相關(guān)文章

  • 手撕面試官系列(二):開源框架面試題Spring+SpringMVC+MyBatis

    摘要:跳槽時時刻刻都在發(fā)生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風(fēng),看到同事一個個都走了,自己也盲目的開始面試起來期間也沒有準(zhǔn)備充分,到底是因為技術(shù)原因影響自己的發(fā)展,偏移自己規(guī)劃的軌跡,還是錢給少了,不受重視。 跳槽時時刻刻都在發(fā)生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風(fēng),看到同事一個個都走了,自己也盲目的開始面試起來(期間也沒有準(zhǔn)備充分),到底是因為技...

    Flink_China 評論0 收藏0
  • Mybatis常見面試題

    摘要:執(zhí)行沒有,批處理不支持,將所有都添加到批處理中,等待統(tǒng)一執(zhí)行,它緩存了多個對象,每個對象都是完畢后,等待逐一執(zhí)行批處理。 Mybatis常見面試題 #{}和${}的區(qū)別是什么? #{}和${}的區(qū)別是什么? 在Mybatis中,有兩種占位符 #{}解析傳遞進(jìn)來的參數(shù)數(shù)據(jù) ${}對傳遞進(jìn)來的參數(shù)原樣拼接在SQL中 #{}是預(yù)編譯處理,${}是字符串替換。 使用#{}可以有效的防止...

    liuchengxu 評論0 收藏0
  • 70 個 Spring 最常見面試題,Java 晉升必會

    摘要:容器自動完成裝載,默認(rèn)的方式是這部分重點(diǎn)在常用模塊的使用以及的底層實現(xiàn)原理。 對于那些想面試高級 Java 崗位的同學(xué)來說,除了算法屬于比較「天方夜譚」的題目外,剩下針對實際工作的題目就屬于真正的本事了,熱門技術(shù)的細(xì)節(jié)和難點(diǎn)成為了主要考察的內(nèi)容。 這里說「天方夜譚」并不是說算法沒用,不切實際,而是想說算法平時其實很少用到,甚至面試官都對自己出的算法題一知半解。 這里總結(jié)打磨了 70 道...

    Ashin 評論0 收藏0
  • mybatis深入理解(一)之 # 與 $ 區(qū)別以及 sql 預(yù)編譯

    摘要:在動態(tài)解析階段,和會有不同的表現(xiàn)解析為一個預(yù)編譯語句的參數(shù)標(biāo)記符。其次,在預(yù)編譯之前已經(jīng)被變量替換了,這會存在注入問題。預(yù)編譯語句對象可以重復(fù)利用。默認(rèn)情況下,將對所有的進(jìn)行預(yù)編譯??偨Y(jié)本文主要深入探究了對和的不同處理方式,并了解了預(yù)編譯。 mybatis 中使用 sqlMap 進(jìn)行 sql 查詢時,經(jīng)常需要動態(tài)傳遞參數(shù),例如我們需要根據(jù)用戶的姓名來篩選用戶時,sql 如下: sele...

    shadowbook 評論0 收藏0
  • Java面試前需要了解的東西

    摘要:我在面試前針對基礎(chǔ)也花了不少的時間,期間也將自己寫過的博文粗略地刷了一遍,同時也在網(wǎng)上找了不少比較好的資料部分是沒看完的。看面試題也是校驗自己是否真正理解了這個知識點(diǎn),也很有可能會有新的收獲。 一、前言 只有光頭才能變強(qiáng) 回顧前面: 廣州三本找Java實習(xí)經(jīng)歷 上一篇寫了自己面試的經(jīng)歷和一些在面試的時候遇到的題目(筆試題和面試題)。 我在面試前針對Java基礎(chǔ)也花了不少的時間,期間也將...

    renweihub 評論0 收藏0
  • MyBatis-Plus初步

    摘要:是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在應(yīng)用方面,是最好的,關(guān)系數(shù)據(jù)庫管理系統(tǒng)應(yīng)用軟件。是一種關(guān)系數(shù)據(jù)庫管理系統(tǒng),關(guān)系數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。 本章主要是對MyBatis-Plus的初步介紹,包括一些背景知識、環(huán)境搭建、初步使用等知識和例子。對于背景知識,主要包含對MyBatis-Plus的特性介紹、為什么使用MyB...

    娣辯孩 評論0 收藏0

發(fā)表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<