一篇文章弄懂Mybatis中#和$的區(qū)別
前言
在學(xué)校的時(shí)候,想必大家肯定聽(tīng)老師講過(guò),在mybatis中,配置參數(shù)要用#,不要用$符號(hào)。因?yàn)?不安全,容易被sql注入。講是這么講,但是如何注入的,大家一起來(lái)看看吧。
一:下面我們寫(xiě)個(gè)關(guān)于“#”的個(gè)sql,看能不能注入。
<select id="selectUser" resultMap="BaseResultMap"> SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name like #{userName} </select>
1.正常傳參
DfwsSysUserAccount user = new DfwsSysUserAccount(); user.setUserName("wanglingzhi"); List<DfwsSysUserAccount> list = userAccountService.selectUser(user); if(list!=null && list.size()>0){ for (DfwsSysUserAccount u:list) { System.out.println("用戶(hù)名:"+u.getUserName()); } }else{ System.out.println("暫無(wú)數(shù)據(jù)"); }
sql打印:
Preparing: SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = ??
Parameters: wanglingzhi(String)
2.拼接傳參
DfwsSysUserAccount user = new DfwsSysUserAccount(); user.setUserName("'wanglingzhi' or acc.user_name = 'shuizhong'"); List<DfwsSysUserAccount> list = userAccountService.selectUser(user); if(list!=null && list.size()>0){ for (DfwsSysUserAccount u:list) { System.out.println("用戶(hù)名:"+u.getUserName()); } }else{ System.out.println("暫無(wú)數(shù)據(jù)"); }
sql打?。?/p>
Preparing: SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = ??
Parameters: wanglingzhi or acc.user_name = shuizhong(String)
二:下面我們寫(xiě)個(gè)關(guān)于“$”的個(gè)sql,看能不能注入。
<select id="selectUser" resultMap="BaseResultMap"> SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name like ${userName} </select>
1.正常傳參
DfwsSysUserAccount user = new DfwsSysUserAccount(); user.setUserName("'wanglingzhi'"); List<DfwsSysUserAccount> list = userAccountService.selectUser(user); if(list!=null && list.size()>0){ for (DfwsSysUserAccount u:list) { System.out.println("用戶(hù)名:"+u.getUserName()); } }else{ System.out.println("暫無(wú)數(shù)據(jù)"); }
打印sql:
SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = 'wanglingzhi'
2.拼接傳參
DfwsSysUserAccount user = new DfwsSysUserAccount(); user.setUserName("'wanglingzhi' or acc.user_name = 'shuizhong'"); List<DfwsSysUserAccount> list = userAccountService.selectUser(user); if(list!=null && list.size()>0){ for (DfwsSysUserAccount u:list) { System.out.println("用戶(hù)名:"+u.getUserName()); } }else{ System.out.println("暫無(wú)數(shù)據(jù)"); }
打印sql:
SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = 'wanglingzhi' or acc.user_name = 'shuizhong'?
很顯然,這里已經(jīng)sql注入了。
總結(jié)下,一般說(shuō)來(lái),二者的區(qū)別可總結(jié)為以下6點(diǎn):
(1)#將傳入的數(shù)據(jù)都當(dāng)成一個(gè)字符串,會(huì)對(duì)自動(dòng)傳入的數(shù)據(jù)加一個(gè)雙引號(hào)。如:order by #user_id#,如果傳入的值是111,那么解析成sql時(shí)的值為order by "111",如果傳入的值是id,則解析成的sql為order by "id"。
(2)$將傳入的數(shù)據(jù)直接顯示生成在sql中。如:order by $user_id$,如果傳入的值是111,那么解析成sql時(shí)的值為order by user_id, 如果傳入的值是id,則解析成的sql為order by id。
(3)#方式在很大程度上能夠防止sql注入。
(4)$方式無(wú)法防止sql注入。
(5)$方式一般用于傳入數(shù)據(jù)庫(kù)對(duì)象,例如傳入表名。
(6)一般能用#的就別用$。
ps:在使用mybatis中還遇到<![CDATA[]]>的用法,在該符號(hào)內(nèi)的語(yǔ)句,將不會(huì)被當(dāng)成字符串來(lái)處理,而是直接當(dāng)成sql語(yǔ)句,比如要執(zhí)行一個(gè)存儲(chǔ)過(guò)程。
總結(jié)
到此這篇關(guān)于Mybatis中#和$區(qū)別的文章就介紹到這了,更多相關(guān)Mybatis #和$區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
jmeter下載及安裝配置教程(win10平臺(tái)為例)
Apache?JMeter是Apache組織開(kāi)發(fā)的基于Java的壓力測(cè)試工具,Apache?jmeter?可以用于對(duì)靜態(tài)的和動(dòng)態(tài)的資源(文件,Servlet,Perl腳本,java?對(duì)象,數(shù)據(jù)庫(kù)和查詢(xún),F(xiàn)TP服務(wù)器等等)的性能進(jìn)行測(cè)試,本文給大家介紹jmeter下載及安裝配置過(guò)程,感興趣的朋友一起看看吧2021-12-12spring?boot之使用spring?data?jpa的自定義sql方式
這篇文章主要介紹了spring?boot之使用spring?data?jpa的自定義sql方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Java中數(shù)組轉(zhuǎn)List的三種方法與對(duì)比分析
這篇文章主要給大家介紹了關(guān)于Java中數(shù)組轉(zhuǎn)List的三種方法與對(duì)比分析的相關(guān)資料,分別介紹了最常見(jiàn)方式、數(shù)組轉(zhuǎn)為L(zhǎng)ist后,支持增刪改查的方式以及通過(guò)集合工具類(lèi)Collections.addAll()方法,需要的朋友可以參考下2018-07-07Jenkins如何實(shí)現(xiàn)自動(dòng)打包部署linux
這篇文章主要介紹了Jenkins如何實(shí)現(xiàn)自動(dòng)打包部署linux,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11