專案開發過程中,在mybaitis框架中經常sql需要動態賦值,會出現# 、$兩種形式。
接下來,我們一起來看乙個案例:根據使用者的姓名來篩選使用者資訊,其中使用者姓名不確定,是動態變化的,sql如下:
select * from userinfo where user_name=「張三」; //查詢名稱是張三的資訊
在xml中 ,select * from userinfo where user_name=# //根據名稱動態查詢使用者資訊,#將引數解析成字串
或者:select * from userinfo where user_name=『$' //$會將引數解析成物件 需要加上引號引住
一、主要區別如下:
1、#將傳入的引數都當成乙個字串,會對自動傳入的資料加乙個雙引號。如:order by #,如果傳入的值是18,那麼解析成sql時的值為order by "18", 如果傳入 age ,則會解析為 order by "age"
2、 $將傳入的引數直接顯示生成在sql中,被當成乙個物件。如:order by$,如果傳入的值是18,那麼解析成sql時的值為order by 18, 如果傳入的值是age,則解析成的sql為order by age
3、#方式底層採用預編譯方式preparedstatement,能夠很大程度防止sql注入;$方式底層只是statement,無法防止sql注入。
4、$方式一般用於傳入資料庫物件,例如傳入表名.
5、一般能用#的就別用$ 注意點:mybatis排序時使用order by 動態引數時需要注意,用$而不是#
二、sql預編譯
1. 定義:
指資料庫驅動在傳送 sql 語句和引數給 dbms 之前對 sql 語句進行編譯,這樣 dbms 執行 sql 時,就不需要重新編譯。
2. 為什麼需要預編譯
jdbc 中使用物件 preparedstatement 來抽象預編譯語句,使用預編譯。預編譯階段可以優化 sql 的執行。預編譯之後的 sql 多數情況下可以直接執行,dbms 不需要再次編譯,越複雜的sql,編譯的複雜度將越大,預編譯階段可以合併多次操作為乙個操作。預編譯語句物件可以重複利用。把乙個 sql 預編譯後產生的 preparedstatement 物件快取下來,下次對於同乙個sql,可以直接使用這個快取的 preparedstate 物件。mybatis 預設情況下,將對所有的 sql 進行預編譯。
案例:動態模糊查詢
xml :
select * from c_product_info
where state=1 and (product_name like '%$%'
or key_words_list like '%$%'
or product_brand like '%$%')
註解:@select(,'%')"
})
sql 中 和 的區別
將傳入的資料直接顯示生成在sql中,那麼我們使用 的時候 select from user where name 在動態解析的時候,會將我們傳入的引數當做string字串填充到我們的語句中,就會變成下面的語句 select from user where name dato 預編譯之前的 sql 語...
sql中 和 的區別
font size 18px delete from ups role permission dataparams where role id 在這裡用到了 使用 時 1 用來傳入引數,sql在解析的時候會加上 當成字串來解析 如這裡 role id roleid 2 能夠很大程度上防止sql注入 ...
sql 中 和 的區別
在sql中對於傳入引數有兩種寫法,剛開始學的時候總是不知道是什麼原因,故此寫下此筆記作為解釋 將傳入的資料直接顯示生成在sql中,那麼我們使用 的時候 select from user where name 在動態解析的時候,會將我們傳入的引數當做string字串填充到我們的語句中,就會變成下面的語...