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

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

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

前言

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

一:下面我們寫個關于“#”的個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打?。?/p>

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打印:

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("暫無數(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注入了。

總結下,一般說來,二者的區(qū)別可總結為以下6點:

(1)#將傳入的數(shù)據(jù)都當成一個字符串,會對自動傳入的數(shù)據(jù)加一個雙引號。如:order by #user_id#,如果傳入的值是111,那么解析成sql時的值為order by "111",如果傳入的值是id,則解析成的sql為order by "id"。

(2)$將傳入的數(shù)據(jù)直接顯示生成在sql中。如:order by $user_id$,如果傳入的值是111,那么解析成sql時的值為order by user_id, 如果傳入的值是id,則解析成的sql為order by id。

(3)#方式在很大程度上能夠防止sql注入。

(4)$方式無法防止sql注入。

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

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

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

總結

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

相關文章

  • jmeter下載及安裝配置教程(win10平臺為例)

    jmeter下載及安裝配置教程(win10平臺為例)

    Apache?JMeter是Apache組織開發(fā)的基于Java的壓力測試工具,Apache?jmeter?可以用于對靜態(tài)的和動態(tài)的資源(文件,Servlet,Perl腳本,java?對象,數(shù)據(jù)庫和查詢,F(xiàn)TP服務器等等)的性能進行測試,本文給大家介紹jmeter下載及安裝配置過程,感興趣的朋友一起看看吧
    2021-12-12
  • spring?boot之使用spring?data?jpa的自定義sql方式

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

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

    Java中數(shù)組轉List的三種方法與對比分析

    這篇文章主要給大家介紹了關于Java中數(shù)組轉List的三種方法與對比分析的相關資料,分別介紹了最常見方式、數(shù)組轉為List后,支持增刪改查的方式以及通過集合工具類Collections.addAll()方法,需要的朋友可以參考下
    2018-07-07
  • Spring框架中部署log4j.xml的詳細步驟

    Spring框架中部署log4j.xml的詳細步驟

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

    Jenkins如何實現(xiàn)自動打包部署linux

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

    Java 面試題基礎知識集錦

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

    Java取整與四舍五入

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

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

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

    淺談springboot自動裝配原理

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

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

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

最新評論