亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

IT那活兒 / 3349人閱讀
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í)行單元測(cè)試:

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





SQL注入



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

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

修改查詢條件:

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

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





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



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

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

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

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





應(yīng)用場景



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

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

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

Mapper文件如下:

執(zhí)行單元測(cè)試:

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





總  結(jié)



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

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



本文作者:孫濤濤

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/129579.html

相關(guān)文章

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

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

    Flink_China 評(píng)論0 收藏0
  • Mybatis常見面試題

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

    liuchengxu 評(píng)論0 收藏0
  • 70 個(gè) Spring 最常見面試題,Java 晉升必會(huì)

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

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

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

    shadowbook 評(píng)論0 收藏0
  • Java面試前需要了解的東西

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

    renweihub 評(píng)論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ù)放在一個(gè)大倉庫內(nèi),這樣就增加了速度并提高了靈活性。 本章主要是對(duì)MyBatis-Plus的初步介紹,包括一些背景知識(shí)、環(huán)境搭建、初步使用等知識(shí)和例子。對(duì)于背景知識(shí),主要包含對(duì)MyBatis-Plus的特性介紹、為什么使用MyB...

    娣辯孩 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<