MyBatis中#號與美元符號的區(qū)別
#{變量名}可以進行預(yù)編譯、類型匹配等操作,#{變量名}會轉(zhuǎn)化為jdbc的類型。
select * from tablename where id = #{id}
假設(shè)id的值為12,其中如果數(shù)據(jù)庫字段id為字符型,那么#{id}表示的就是'12',如果id為整型,那么id就是12,并且MyBatis會將上面SQL語句轉(zhuǎn)化為jdbc的select * from tablename where id=?,把?參數(shù)設(shè)置為id的值。
${變量名}不進行數(shù)據(jù)類型匹配,直接替換。
select * from tablename where id = ${id}
如果字段id為整型,sql語句就不會出錯,但是如果字段id為字符型, 那么sql語句應(yīng)該寫成
select * from table where id = '${id}'
#方式能夠很大程度防止sql注入。
$方式無法方式sql注入。
$方式一般用于傳入數(shù)據(jù)庫對象,例如傳入表名。
盡量多用#方式,少用$方式。
mybatis框架作為一款半自動化的持久層框架,其sql語句都要我們自己來手動編寫,這個時候當(dāng)然需要防止sql注入。其實Mybatis的sql是一個具有“輸入+輸出”功能,類似于函數(shù)的結(jié)構(gòu),如下:
select id="getBlogById" resultType="Blog" parameterType=”int”>
select id,title,author,content
from blog where id=#{id}
</select>
這里,parameterType標(biāo)示了輸入的參數(shù)類型,resultType標(biāo)示了輸出的參數(shù)類型?;貞?yīng)上文,如果我們想防止sql注入,理所當(dāng)然地要在輸入?yún)?shù)上下功夫。上面代碼中高亮部分即輸入?yún)?shù)在sql中拼接的部分,傳入?yún)?shù)后,打印出執(zhí)行的sql語句,會看到sql是這樣的:
select id,title,author,content from blog where id = ?
不管輸入什么參數(shù),打印出的sql都是這樣的。這是因為mybatis啟用了預(yù)編譯功能,在sql執(zhí)行前,會先將上面的sql發(fā)送給數(shù)據(jù)庫進行編譯,執(zhí)行時,直接使用編譯好的sql,替換占位符“?”就可以了。因為sql注入只能對編譯過程起作用,所以這樣的方式就很好地避免了sql注入的問題。
以上所述是小編給大家介紹的MyBatis中#號與美元符號的區(qū)別,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
JDBC中PreparedStatement詳解以及應(yīng)用場景實例介紹
PreparedStatement對象代表的是一個預(yù)編譯的SQL語句,用它提供的setter方法可以傳入查詢的變量,這篇文章主要給大家介紹了關(guān)于JDBC中PreparedStatement詳解以及應(yīng)用場景實例介紹的相關(guān)資料,需要的朋友可以參考下2024-02-02
Spring 環(huán)境下實現(xiàn)策略模式的示例
這篇文章主要介紹了Spring 環(huán)境下實現(xiàn)策略模式的示例,幫助大家更好的理解和使用spring框架,感興趣的朋友可以了解下2020-10-10
詳解SpringMVC和MyBatis框架開發(fā)環(huán)境搭建和簡單實用
這篇文章主要介紹了詳解SpringMVC和MyBatis框架開發(fā)環(huán)境搭建和簡單實用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05

