MyBatis中 號與美元符號的區別

2021-07-25 23:45:19 字數 1070 閱讀 2489

#可以進行預編譯、型別匹配等操作,#會轉化為jdbc的型別。

select * from tablename where id = #

假設id的值為12,其中如果資料庫欄位id為字元型,那麼#表示的就是'12',如果id為整型,那麼id就是12,並且mybatis會將上面sql語句轉化為jdbc的select * from tablename where id=?,把?引數設定為id的值。

$不進行資料型別匹配,直接替換。

select * from tablename where id = $

如果欄位id為整型,sql語句就不會出錯,但是如果欄位id為字元型, 那麼sql語句應該寫成select * from table where id = '$'。

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

$方式無法方式sql注入。

$方式一般用於傳入資料庫物件,例如傳入表名。

盡量多用#方式,少用$方式。

mybatis框架作為一款半自動化的持久層框架,其sql語句都要我們自己來手動編寫,這個時候當然需要防止sql注入。其實mybatis的sql是乙個具有「輸入+輸出」功能,類似於函式的結構,如下:

select id="getblogbyid" resulttype="blog" parametertype=」int」>

select id,title,author,content 

from blog where id=# 

這裡,parametertype標示了輸入的引數型別,resulttype標示了輸出的引數型別。回應上文,如果我們想防止sql注入,理所當然地要在輸入引數上下功夫。上面**中高亮部分即輸入引數在sql中拼接的部分,傳入引數後,列印出執行的sql語句,會看到sql是這樣的:

select id,title,author,content from blog where id = ?

不管輸入什麼引數,列印出的sql都是這樣的。這是因為mybatis啟用了預編譯功能,在sql執行前,會先將上面的sql傳送給資料庫進行編譯,執行時,直接使用編譯好的sql,替換佔位符「?」就可以了。因為sql注入只能對編譯過程起作用,所以這樣的方式就很好地避免了sql注入的問題。

MyBatis中 號與美元符號的區別

可以進行預編譯 型別匹配等操作,會轉化為jdbc的型別。select from tablename where id 假設id的值為12,其中如果資料庫欄位id為字元型,那麼 表示的就是 12 如果id為整型,那麼id就是12,並且mybatis會將上面sql語句轉化為jdbc的select fro...

對映檔案中 號與 符號的區別

1.佔位符 preparesatement 預編譯 拼接字串 satment 拼接 可以將 放在這裡進行拼接。2.和 都是用來設定sql對映檔案中statement引數的佔位符,通過parametertype設定statemenet的引數型別,這裡可以有string字串 基本型別 pojo map型...

Linux Shell中的美元符號

linux腳中經常會遇到一大堆美元符號 有些符號容易搞混,他們代表的含義我做個記錄 0 shell的命令本身 包括完整路徑 1到 9 數字表示shell 的第幾個引數 傳遞到指令碼的引數個數 以乙個單字串顯示所有向指令碼傳遞的引數 指令碼執行的id號 後台執行的最後乙個程序的id號 與 相同。顯示s...