天天看點

面試之-mybatis中$和#的差別*

mybatis中$和#的差別

mybatis中KaTeX parse error: Expected 'EOF', got '#' at position 2: 和#̲的差別 今天面試遇到這個面試題…,但是具體的差別還真的不清楚,今天總結一下分享給大家。

#{}是預編譯處理,KaTeX parse error: Expected 'EOF', got '#' at position 20: …符串替換。mybatis在處理#̲{}時,會将sql中的#{}替…{}時,就是把${}替換成變量的值。使用#{}可以有效的防止SQL注入,提高系統安全性。

總結一

1 #是将傳入的值當做字元串的形式,eg:select id,name,age from student where id =#{id},目前端把id值1,傳入到背景的時候,就相當于 select id,name,age from student where id =‘1’.

2 是 将 傳 入 的 數 據 直 接 顯 示 生 成 s q l 語 句 , e g : s e l e c t i d , n a m e , a g e f r o m s t u d e n t w h e r e i d = 是将傳入的資料直接顯示生成sql語句,eg:select id,name,age from student where id = 是将傳入的資料直接顯示生成sql語句,eg:selectid,name,agefromstudentwhereid={id},目前端把id值1,傳入到背景的時候,就相當于 select id,name,age from student where id = 1.

3 使用#可以很大程度上防止sql注入。(語句的拼接)

4 但是如果使用在order by 中就需要使用 $.

5 在大多數情況下還是經常使用#,但在不同情況下必須使用$.

一 : 了解mybatis中 $與#

在mybatis中的$與#都是在sql中動态的傳入參數。

eg:select id,name,age from student where name=#{name}  這個name是動态的,可變的。當你傳入什麼樣的值,就會根據你傳入的值執行sql語句。
           

二:使用$與#

#{}: 解析為一個 JDBC 預編譯語句(prepared statement)的參數标記符,一個 #{ } 被解析為一個參數占位符 。

${}: 僅僅為一個純碎的 string 替換,在動态 SQL 解析階段将會進行變量替換。

name–>cy

eg: select id,name,age from student where name=#{name} – name=‘cy’

select id,name,age from student where name=${name}    -- name=cy
           

原文

https://www.cnblogs.com/hellokitty1/p/6007801.html

總結二

今天在工作中有個點選排序的功能調試了許久,終尋因,總結之。

  需求是這樣的,頁面有個table,有一列的上下箭頭可點選并排序。對于這種需求,我的mybatis.xml的sql配置寫成了如下:

  ORDER BY columnName #{map.ColumnNameSort}

ColumnNameSort即前端傳的排序方式,asc或者desc。

然後,預計它的輸出應該是類似于下面這樣的

ORDER BY columnName desc

但是,真正跑起來時,排序的效果一直沒出現,經常一番查找,發現是mybatis 的’#{}’傳值的問題,它将sql語句編譯成了如下

ORDER BY columnName ‘desc’ 或者 ORDER BY columnName ‘asc’

這樣,desc或者asc就成了字元串而不是關鍵字,sql語句的意思是columnName的别名是desc或者asc,沒加排序關鍵字時預設是正序排序,成了如下

ORDER BY columnName “desc” asc 或者 ORDER BY columnName “asc” asc

排序沒效果的問題找到原因了,解決之,mybatis提供了另一種綁定參數的方式–${param},将sql配置改為

ORDER BY columnName ${map.ColumnNameSort}

這樣一來,mybatis會直接将ColumnNameSort的值加入sql中,不會轉義。正确結果:

ORDER BY columnName desc

最後,對于mybatis中#和$綁定參數的差別做個總結,避免以後類似的問題發生。

#{}将傳入的資料都當成一個字元串,會對自動傳入的資料加一個雙引号。如:order by #{id},如果傳入的值是111,那麼解析成sql時的值為order by “111”, 如果傳入的值是id,則解析成的sql為order by “id”。

${}将傳入的資料直接顯示生成在sql中。如:order by

${id},如果傳入的值是111,那麼解析成sql時的值為order by 111, 如果傳入的值是id,則解析成的sql為order

by id。

#方式能夠很大程度防止sql注入。

$方式無法防止Sql注入。

$方式一般用于傳入資料庫對象,例如傳入表名.

一般能用#的就别用$.

ps:在使用mybatis中還遇到<![CDATA[]]>的用法,在該符号内的語句,将不會被當成字元串來處理,而是直接當成sql語句,比如要執行一個存儲過程。

-原文:https://blog.csdn.net/u011519624/article/details/54674670/

個人總結

我覺得#與的差別最大在于:#{} 傳入值時,sql解析時,參數是帶引号的,而的差別最大在于:#{} 傳入值時,sql解析時,參數是帶引号的,而{}穿入值,sql解析時,參數是不帶引号的。

差別

#是将傳入的值當做字元串的形式拼接到sql語句中,而KaTeX parse error: Expected 'EOF', got '#' at position 25: …顯示生成sql語句。也可以認為#̲使用了一個占位符=‘?’,而是直接将資料拼接到sql語句中即=?。

注解:動态sql是mybatis的主要特性之一,在mspper中定義的參數傳到xml中後,在查詢之前mybatis會對其進行動态解析。mybatis 為我們提供了兩種支援動态 sql 的文法:#{} 以及 KaTeX parse error: Expected 'EOF', got '#' at position 16: {}。 在具體使用時,一般使用#̲{},當然在遇到一些必須是{}的情況時,就應該靈活應用,主要看那個可以達到效果,又可以防止注入攻擊為準。

歡迎讨論勘正!

繼續閱讀