北京快乐8官网|北京快乐8选一秘诀

MyBatis中#{}和${}的區別詳解

首先看一下下面兩個sql語句的區別:

<select id="selectByNameAndPassword" parameterType="java.util.Map" resultMap="BaseResultMap">select id, username, password, rolefrom userwhere username = #{username,jdbcType=VARCHAR}and password = #{password,jdbcType=VARCHAR}</select>

<select id="selectByNameAndPassword" parameterType="java.util.Map" resultMap="BaseResultMap">select id, username, password, rolefrom userwhere username = ${username,jdbcType=VARCHAR}and password = ${password,jdbcType=VARCHAR}</select>

mybatis中的#和$的區別:

1、#將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。

如:where username=#{username},如果傳入的值是111,那么解析成sql時的值為where username="111", 如果傳入的值是id,則解析成的sql為where username="id".

2、$將傳入的數據直接顯示生成在sql中。

如:where username=${username},如果傳入的值是111,那么解析成sql時的值為where username=111;

3、針對上面的sql,如果傳入的值是;drop table user;,

那么第一條用#{}的sql解析為:select id, username, password, role from user where username=";drop table user;"

那么第二條用${}的sql解析為:select id, username, password, role from user where username=;drop table user;

這時候已經sql注入了。

3、#方式能夠很大程度防止sql注入,$方式無法防止Sql注入。

4、$方式一般用于傳入數據庫對象,例如傳入表名和列名,還有排序時使用order by動態參數時需要使用$ ,ORDER BY ${columnName}

5、一般能用#的就別用$,若不得不使用“${xxx}”這樣的參數,要手工地做好過濾工作,來防止sql注入攻擊。

6、在MyBatis中,“${xxx}”這樣格式的參數會直接參與SQL編譯,從而不能避免注入攻擊。但涉及到動態表名和列名時,只能使用“${xxx}”這樣的參數格式。所以,這樣的參數需要我們在代碼中手工進行處理來防止注入。

【結論】在編寫MyBatis的映射語句時,盡量采用“#{xxx}”這樣的格式。若不得不使用“${xxx}”這樣的參數,要手工地做好過濾工作,來防止SQL注入攻擊。

免責聲明:本文僅代表文章作者的個人觀點,與本站無關。其原創性、真實性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容文字的真實性、完整性和原創性本站不作任何保證或承諾,請讀者僅作參考,并自行核實相關內容。

http://www.kzguv.com.cn/style/images/nopic.gif
我要收藏
贊一個
踩一下
分享到
?
分享
評論
首頁
北京快乐8官网 皇冠比分皇冠代理 世界杯阿根廷瑞士比分预测 久联优配 11选5奖金查对表 广西南宁麻将微信1群 丹麦对瑞士比分预测 浙江6+1 闲来贵州麻将4 竞彩比分怎么买比较容易中 竞彩足球专家预测推荐 一本道东京热网站 湖南yy麻将群 大众麻将游戏免费下载 三级片口交做爱 竞彩比分预测 股票配资送10000体验金