初探#{}和${}
Mybatis中#{}和${}是傳遞查詢參數的兩種方式,首先看下他們的使用方式,這里以查詢姓名中包含字符“J”的數據列表為例。
現有一張User表,結構和數據如下:
定義Dao接口:
定義Mapper文件:
執行單元測試:
查看結果,兩種方式都查詢出了兩條記錄,都實現了需求。
SQL注入
#{}和${}雖然都能實現查詢,但區別還是有的,最大區別是${}方式可能導致SQL注入問題。
看個例子,把上面的查詢條件改動下,在條件后加入 or 1=1 -- ,再分別看下結果。
修改查詢條件:
查看執行結果,可以看到#{}方式查詢結果為0條,${}方式查出了所有記錄。
細思極恐啊,如果采用${}方式執行update或delete操作,那整張表數據都會受到影響。
#{}和${}區別
查看mysql執行log日志,拿到兩種方式執行的sql語句如下:
對比發現,雖然兩種方式查詢條件傳入的字符串一樣,但是Mysql執行時生成的語句并不一樣,${}是字符串替換,而#{}是預處理,預處理時會對特殊字符進行轉義操作。
Mybatis在處理${}時,就是把${}值直接替換成變量值。而在處理#{}時,會對sql語句進行預處理,將sql中的#{}替換為?號,調用PreparedStatement的set方法來賦值。
因此,使用#{}可以有效的防止SQL注入,提高系統安全性。
應用場景
我們已經知道#{}可以有效的防止SQL注入,那為什么還要有${}方式呢?
既然存在,那肯定有用武之地,${}采用字符串拼接方式,還是舉個例子來介紹它的使用場景。
例如,針對查詢時表名不確定的情況,需要在查詢時將表名通過參數傳遞進來,分別使用兩種方式測試下。
Mapper文件如下:
執行單元測試:
查看結果,${}方式可以查詢出結果,而#{}方式拋出異常,這種情況下只能選擇${}方式查詢。
總 結
#{}針對輸入字符串進行了轉義過濾處理,能夠防止SQL注入,適用于給SQL語句的where條件傳值的使用場景;
${}設計就是用于參與SQL的語法生成,適用于需要通過傳遞值來拼接SQL語句的場景。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/129579.html
摘要:跳槽時時刻刻都在發生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風,看到同事一個個都走了,自己也盲目的開始面試起來期間也沒有準備充分,到底是因為技術原因影響自己的發展,偏移自己規劃的軌跡,還是錢給少了,不受重視。 跳槽時時刻刻都在發生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風,看到同事一個個都走了,自己也盲目的開始面試起來(期間也沒有準備充分),到底是因為技...
摘要:執行沒有,批處理不支持,將所有都添加到批處理中,等待統一執行,它緩存了多個對象,每個對象都是完畢后,等待逐一執行批處理。 Mybatis常見面試題 #{}和${}的區別是什么? #{}和${}的區別是什么? 在Mybatis中,有兩種占位符 #{}解析傳遞進來的參數數據 ${}對傳遞進來的參數原樣拼接在SQL中 #{}是預編譯處理,${}是字符串替換。 使用#{}可以有效的防止...
摘要:容器自動完成裝載,默認的方式是這部分重點在常用模塊的使用以及的底層實現原理。 對于那些想面試高級 Java 崗位的同學來說,除了算法屬于比較「天方夜譚」的題目外,剩下針對實際工作的題目就屬于真正的本事了,熱門技術的細節和難點成為了主要考察的內容。 這里說「天方夜譚」并不是說算法沒用,不切實際,而是想說算法平時其實很少用到,甚至面試官都對自己出的算法題一知半解。 這里總結打磨了 70 道...
摘要:在動態解析階段,和會有不同的表現解析為一個預編譯語句的參數標記符。其次,在預編譯之前已經被變量替換了,這會存在注入問題。預編譯語句對象可以重復利用。默認情況下,將對所有的進行預編譯??偨Y本文主要深入探究了對和的不同處理方式,并了解了預編譯。 mybatis 中使用 sqlMap 進行 sql 查詢時,經常需要動態傳遞參數,例如我們需要根據用戶的姓名來篩選用戶時,sql 如下: sele...
摘要:我在面試前針對基礎也花了不少的時間,期間也將自己寫過的博文粗略地刷了一遍,同時也在網上找了不少比較好的資料部分是沒看完的??疵嬖囶}也是校驗自己是否真正理解了這個知識點,也很有可能會有新的收獲。 一、前言 只有光頭才能變強 回顧前面: 廣州三本找Java實習經歷 上一篇寫了自己面試的經歷和一些在面試的時候遇到的題目(筆試題和面試題)。 我在面試前針對Java基礎也花了不少的時間,期間也將...
摘要:是最流行的關系型數據庫管理系統之一,在應用方面,是最好的,關系數據庫管理系統應用軟件。是一種關系數據庫管理系統,關系數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度并提高了靈活性。 本章主要是對MyBatis-Plus的初步介紹,包括一些背景知識、環境搭建、初步使用等知識和例子。對于背景知識,主要包含對MyBatis-Plus的特性介紹、為什么使用MyB...
閱讀 1353·2023-01-11 13:20
閱讀 1700·2023-01-11 13:20
閱讀 1211·2023-01-11 13:20
閱讀 1904·2023-01-11 13:20
閱讀 4162·2023-01-11 13:20
閱讀 2751·2023-01-11 13:20
閱讀 1397·2023-01-11 13:20
閱讀 3665·2023-01-11 13:20