#可以進行預編譯、型別匹配等操作,#會轉化為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...