中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Mybatis中#和$的區別是什么

發布時間:2021-12-21 16:23:02 來源:億速云 閱讀:164 作者:iii 欄目:開發技術

這篇文章主要介紹“Mybatis中#和$的區別是什么”,在日常操作中,相信很多人在Mybatis中#和$的區別是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Mybatis中#和$的區別是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一:下面我們寫個關于“#”的個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("用戶名:"+u.getUserName());
    }
}else{
        System.out.println("暫無數據");
}

Mybatis中#和$的區別是什么

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("用戶名:"+u.getUserName());
    }
}else{
        System.out.println("暫無數據");
}

Mybatis中#和$的區別是什么

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)

二:下面我們寫個關于“$”的個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("用戶名:"+u.getUserName());
    }
}else{
        System.out.println("暫無數據");
}

Mybatis中#和$的區別是什么

打印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("用戶名:"+u.getUserName());
    }
}else{
        System.out.println("暫無數據");
}

Mybatis中#和$的區別是什么

打印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中#和$的區別是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吉木乃县| 连州市| 肃南| 锦屏县| 凯里市| 体育| 西和县| 大冶市| 石屏县| 兰西县| 合作市| 海兴县| 呼图壁县| 靖江市| 昌黎县| 周口市| 海门市| 张家港市| 泾源县| 禹城市| 南充市| 怀宁县| 惠东县| 泽普县| 五家渠市| 宁陵县| 高州市| 雷山县| 岑溪市| 资源县| 卢氏县| 闽清县| 平远县| 白城市| 武穴市| 闸北区| 迁安市| 五家渠市| 固阳县| 蓬安县| 西安市|