欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

在學(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)為例)

    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-12
  • spring?boot之使用spring?data?jpa的自定義sql方式

    spring?boot之使用spring?data?jpa的自定義sql方式

    這篇文章主要介紹了spring?boot之使用spring?data?jpa的自定義sql方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java中數(shù)組轉(zhuǎn)List的三種方法與對(duì)比分析

    Java中數(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-07
  • Spring框架中部署log4j.xml的詳細(xì)步驟

    Spring框架中部署log4j.xml的詳細(xì)步驟

    Log4j是一個(gè)常用的日志記錄工具,它可以幫助我們記錄應(yīng)用程序的運(yùn)行日志并進(jìn)行靈活的配置,在Spring框架中,我們可以很方便地部署log4j.xml配置文件來(lái)管理日志記錄,這篇文章主要介紹了Spring框架中部署log4j.xml的詳細(xì)步驟并提供相應(yīng)的代碼示例,需要的朋友可以參考下
    2023-09-09
  • Jenkins如何實(shí)現(xiàn)自動(dòng)打包部署linux

    Jenkins如何實(shí)現(xiàn)自動(dòng)打包部署linux

    這篇文章主要介紹了Jenkins如何實(shí)現(xiàn)自動(dòng)打包部署linux,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java 面試題基礎(chǔ)知識(shí)集錦

    Java 面試題基礎(chǔ)知識(shí)集錦

    本文主要介紹Java基礎(chǔ)面試題集錦,這里整理了面試java工程師的基礎(chǔ)知識(shí)題錦,有需要的小伙伴可以參考下
    2016-09-09
  • Java取整與四舍五入

    Java取整與四舍五入

    本文詳細(xì)講解了Java取整與四舍五入,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • javamail 發(fā)送郵件的實(shí)例代碼分享

    javamail 發(fā)送郵件的實(shí)例代碼分享

    今天學(xué)習(xí)了一下JavaMail,javamail發(fā)送郵件確實(shí)是一個(gè)比較麻煩的問(wèn)題。為了以后使用方便,自己寫(xiě)了段代碼,打成jar包,以方便以后使用
    2013-08-08
  • 淺談springboot自動(dòng)裝配原理

    淺談springboot自動(dòng)裝配原理

    作為Spring Boot的精髓,自動(dòng)配置原理首當(dāng)其沖.今天就帶大家了解一下springboot自動(dòng)裝配的原理,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Spring基于注解的緩存聲明深入探究

    Spring基于注解的緩存聲明深入探究

    spring boot對(duì)緩存支持非常靈活,我們可以使用默認(rèn)的EhCache,也可以整合第三方的框架,只需配置即可,下面這篇文章主要給大家介紹了關(guān)于SpringBoot學(xué)習(xí)之基于注解緩存的相關(guān)資料,需要的朋友可以參考下
    2022-08-08

最新評(píng)論