初探#{}和${}
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語句的場景。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/129579.html
摘要:跳槽時時刻刻都在發(fā)生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風(fēng),看到同事一個個都走了,自己也盲目的開始面試起來期間也沒有準(zhǔn)備充分,到底是因為技術(shù)原因影響自己的發(fā)展,偏移自己規(guī)劃的軌跡,還是錢給少了,不受重視。 跳槽時時刻刻都在發(fā)生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風(fēng),看到同事一個個都走了,自己也盲目的開始面試起來(期間也沒有準(zhǔn)備充分),到底是因為技...
摘要:執(zhí)行沒有,批處理不支持,將所有都添加到批處理中,等待統(tǒng)一執(zhí)行,它緩存了多個對象,每個對象都是完畢后,等待逐一執(zhí)行批處理。 Mybatis常見面試題 #{}和${}的區(qū)別是什么? #{}和${}的區(qū)別是什么? 在Mybatis中,有兩種占位符 #{}解析傳遞進(jìn)來的參數(shù)數(shù)據(jù) ${}對傳遞進(jìn)來的參數(shù)原樣拼接在SQL中 #{}是預(yù)編譯處理,${}是字符串替換。 使用#{}可以有效的防止...
摘要:容器自動完成裝載,默認(rèn)的方式是這部分重點(diǎn)在常用模塊的使用以及的底層實現(xiàn)原理。 對于那些想面試高級 Java 崗位的同學(xué)來說,除了算法屬于比較「天方夜譚」的題目外,剩下針對實際工作的題目就屬于真正的本事了,熱門技術(shù)的細(xì)節(jié)和難點(diǎn)成為了主要考察的內(nèi)容。 這里說「天方夜譚」并不是說算法沒用,不切實際,而是想說算法平時其實很少用到,甚至面試官都對自己出的算法題一知半解。 這里總結(jié)打磨了 70 道...
摘要:在動態(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...
摘要:我在面試前針對基礎(chǔ)也花了不少的時間,期間也將自己寫過的博文粗略地刷了一遍,同時也在網(wǎng)上找了不少比較好的資料部分是沒看完的。看面試題也是校驗自己是否真正理解了這個知識點(diǎn),也很有可能會有新的收獲。 一、前言 只有光頭才能變強(qiáng) 回顧前面: 廣州三本找Java實習(xí)經(jīng)歷 上一篇寫了自己面試的經(jīng)歷和一些在面試的時候遇到的題目(筆試題和面試題)。 我在面試前針對Java基礎(chǔ)也花了不少的時間,期間也將...
摘要:是最流行的關(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...
閱讀 1357·2023-01-11 13:20
閱讀 1707·2023-01-11 13:20
閱讀 1215·2023-01-11 13:20
閱讀 1906·2023-01-11 13:20
閱讀 4165·2023-01-11 13:20
閱讀 2757·2023-01-11 13:20
閱讀 1402·2023-01-11 13:20
閱讀 3672·2023-01-11 13:20