最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一篇文章弄懂Mybatis中#和$的區(qū)別

 更新時(shí)間:2021年12月20日 11:49:54   作者:一個(gè)小馬龍  
mybatis為我們提供了兩種支持動(dòng)態(tài)sql的語法#{}以及${},兩者都是動(dòng)態(tài)的向sql語句中傳入需要的參數(shù),下面這篇文章主要給大家介紹了如何通過一篇文章弄懂Mybatis中#和$區(qū)別的相關(guān)資料,需要的朋友可以參考下

前言

在學(xué)校的時(shí)候,想必大家肯定聽老師講過,在mybatis中,配置參數(shù)要用#,不要用$符號。因?yàn)?不安全,容易被sql注入。講是這么講,但是如何注入的,大家一起來看看吧。

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

二:下面我們寫個(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("用戶名:"+u.getUserName());
    }
}else{
        System.out.println("暫無數(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("用戶名:"+u.getUserName());
    }
}else{
        System.out.println("暫無數(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é)下,一般說來,二者的區(qū)別可總結(jié)為以下6點(diǎn):

(1)#將傳入的數(shù)據(jù)都當(dāng)成一個(gè)字符串,會(huì)對自動(dòng)傳入的數(shù)據(jù)加一個(gè)雙引號。如: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)$方式無法防止sql注入。

(5)$方式一般用于傳入數(shù)據(jù)庫對象,例如傳入表名。

(6)一般能用#的就別用$。

ps:在使用mybatis中還遇到<![CDATA[]]>的用法,在該符號內(nèi)的語句,將不會(huì)被當(dāng)成字符串來處理,而是直接當(dāng)成sql語句,比如要執(zhí)行一個(gè)存儲(chǔ)過程。

總結(jié)

到此這篇關(guān)于Mybatis中#和$區(qū)別的文章就介紹到這了,更多相關(guān)Mybatis #和$區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入了解為什么Java中只有值傳遞?

    深入了解為什么Java中只有值傳遞?

    這篇文章主要介紹了為什么 Java 中只有值傳遞?下面我們來簡單了解一下吧
    2019-05-05
  • SpringBoot中的文件上傳和異常處理詳解

    SpringBoot中的文件上傳和異常處理詳解

    這篇文章主要介紹了SpringBoot中的文件上傳和異常處理詳解,對于機(jī)器客戶端,它將生成JSON響應(yīng),其中包含錯(cuò)誤,HTTP狀態(tài)和異常消息的詳細(xì)信息,對于瀏覽器客戶端,響應(yīng)一個(gè)"whitelabel"錯(cuò)誤視圖,以HTML格式呈現(xiàn)相同的數(shù)據(jù),需要的朋友可以參考下
    2023-09-09
  • Java中抽象類的作用及說明

    Java中抽象類的作用及說明

    這篇文章主要介紹了Java中抽象類的作用及說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Java中的ZooKeeper使用

    Java中的ZooKeeper使用

    本文主要介紹了Java中的ZooKeeper使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • Java輕量級權(quán)限認(rèn)證框架Sa-Token的使用

    Java輕量級權(quán)限認(rèn)證框架Sa-Token的使用

    Sa-Token是一個(gè)輕量級Java權(quán)限認(rèn)證框架,本文就詳細(xì)的來介紹一下Java輕量級權(quán)限認(rèn)證框架Sa-Token的使用,主要解決:登錄認(rèn)證、權(quán)限認(rèn)證、Session會(huì)話、單點(diǎn)登錄、OAuth2.0、微服務(wù)網(wǎng)關(guān)鑒權(quán)等,感興趣的可以了解一下
    2022-03-03
  • Java合并集合幾種常見方式總結(jié)(List、Set、Map)

    Java合并集合幾種常見方式總結(jié)(List、Set、Map)

    這篇文章主要介紹了Java中合并List、Set、Map的多種方法,包括addAll()、Stream.concat()、Stream.of()+flatMap()、List.copyOf()、putAll()、merge()、compute()和StreamAPI等,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • 詳解如何解析pom文件方法示例

    詳解如何解析pom文件方法示例

    這篇文章主要為大家介紹了詳解如何解析pom文件方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Java常見基本數(shù)據(jù)結(jié)構(gòu)概覽

    Java常見基本數(shù)據(jù)結(jié)構(gòu)概覽

    這篇文章主要介紹了Java常見的幾種基本數(shù)據(jù)結(jié)構(gòu),包括其含義和用法,,需要的朋友可以參考下
    2017-09-09
  • Java swing實(shí)現(xiàn)的計(jì)算器功能完整實(shí)例

    Java swing實(shí)現(xiàn)的計(jì)算器功能完整實(shí)例

    這篇文章主要介紹了Java swing實(shí)現(xiàn)的計(jì)算器功能,結(jié)合完整實(shí)例形式分析了java基于swing組件實(shí)現(xiàn)計(jì)算器布局與運(yùn)算功能的具體操作技巧,需要的朋友可以參考下
    2017-12-12
  • java公眾平臺通用接口工具類HttpConnectUtil實(shí)例代碼

    java公眾平臺通用接口工具類HttpConnectUtil實(shí)例代碼

    下面小編就為大家分享一篇java公眾平臺通用接口工具類HttpConnectUtil實(shí)例代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01

最新評論

乌兰浩特市| 海安县| 方正县| 广灵县| 鄂温| 中阳县| 汾西县| 桃园市| 嘉黎县| 衡水市| 靖远县| 青冈县| 连城县| 濮阳市| 库车县| 宿迁市| 龙里县| 基隆市| 中方县| 上蔡县| 康乐县| 华池县| 怀仁县| 文登市| 库车县| 高雄县| 永平县| 莆田市| 平泉县| 蒙自县| 封开县| 新建县| 毕节市| 通榆县| 陆川县| 米易县| 延庆县| 宜章县| 化州市| 望奎县| 丽江市|