您好,登錄后才能下訂單哦!
這篇文章主要介紹“Mybatis中#和$的區別是什么”,在日常操作中,相信很多人在Mybatis中#和$的區別是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Mybatis中#和$的區別是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
<select id="selectUser" resultMap="BaseResultMap"> SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name like #{userName} </select>
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("用戶名:"+u.getUserName()); } }else{ System.out.println("暫無數據"); }
sql打印:
Preparing: SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = ?
Parameters: wanglingzhi(String)
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("用戶名:"+u.getUserName()); } }else{ System.out.println("暫無數據"); }
sql打印:
Preparing: SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = ?
Parameters: wanglingzhi or acc.user_name = shuizhong(String)
<select id="selectUser" resultMap="BaseResultMap"> SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name like ${userName} </select>
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("用戶名:"+u.getUserName()); } }else{ System.out.println("暫無數據"); }
打印sql:
SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = 'wanglingzhi'
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("用戶名:"+u.getUserName()); } }else{ System.out.println("暫無數據"); }
打印sql:
SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = 'wanglingzhi' or acc.user_name = 'shuizhong'
很顯然,這里已經sql注入了。
總結下,一般說來,二者的區別可總結為以下6點:
(1)#將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。如:order by #user_id#,如果傳入的值是111,那么解析成sql時的值為order by "111",如果傳入的值是id,則解析成的sql為order by "id"。
(2)$將傳入的數據直接顯示生成在sql中。如:order by $user_id$,如果傳入的值是111,那么解析成sql時的值為order by user_id, 如果傳入的值是id,則解析成的sql為order by id。
(3)#方式在很大程度上能夠防止sql注入。
(4)$方式無法防止sql注入。
(5)$方式一般用于傳入數據庫對象,例如傳入表名。
(6)一般能用#的就別用$。
ps:在使用mybatis中還遇到<![CDATA[]]>的用法,在該符號內的語句,將不會被當成字符串來處理,而是直接當成sql語句,比如要執行一個存儲過程。
到此,關于“Mybatis中#和$的區別是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。