国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Mybatis中#{}和${}區別

IT那活兒 / 3313人閱讀
Mybatis中#{}和${}區別

點擊上方“IT那活兒”,關注后了解更多內容,不管IT什么活兒,干就完了?。。?/span>





初探#{}和${}



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語句的場景。



本文作者:孫濤濤

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/129579.html

相關文章

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

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

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

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

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

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

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

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

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

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

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

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

    娣辯孩 評論0 收藏0

發表評論

0條評論

IT那活兒

|高級講師

TA的文章

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