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

MyBatis中使用$和#所遇到的問題及解決辦法

 更新時間:2016年08月03日 10:37:56   作者:RunforLove  
這篇文章主要介紹了MyBatis中使用$和#所遇到的問題及解決辦法的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下

在上篇文章給大家介紹了Mybatis中#{}和${}傳參的區(qū)別及#和$的區(qū)別小結(jié),如果大家有需要可以參考下。

$和#簡單說明:

#相當于對數(shù)據(jù) 加上 雙引號,$相當于直接顯示數(shù)據(jù)。

一、總結(jié)

  mybatis中使用sqlMap進行sql查詢時,經(jīng)常需要動態(tài)傳遞參數(shù)。動態(tài)SQL是mybatis的強大特性之一,也是它優(yōu)于其他ORM框架的一個重要原因。mybatis在對sql語句進行預編譯之前,會對sql進行動態(tài)解析,解析為一個BoundSql對象,也是在此處對動態(tài)SQL進行處理的。在動態(tài) SQL 解析階段,#{ }和${ }會有不同的表現(xiàn),#{ }解析為一個JDBC預編譯語句(prepared statement)的參數(shù)標記符。

  一個 #{ } 被解析為一個參數(shù)占位符 ? 。${ } 僅僅為一個純碎的 string 替換,在動態(tài) SQL 解析階段將會進行變量替換。

二、Bug描述

前端傳入?yún)?shù):

skip:0
take:10
ruleName:A,B,C

業(yè)務層處理:

package SQL;
/**
* 將前端多選參數(shù)轉(zhuǎn)義為SQL語句內(nèi)容
*/
public class SQLUtil {
private final static String REPLACECHAR_COMMA = ",";
private final static String REPLACECHAR_SEMICOLON = ";";
public static void main(String[] args) {
String s1 = "A,B,C";
String s2 = "A B C";
System.out.println("逗號分隔:" + formatInStr(s1));
System.out.println("空格分隔:" + formatInStr(s2));
}
private static String formatInStr(String queryStr) {
return queryInStr(sliptQueryStr(queryStr));
}
private static String[] sliptQueryStr(String queryStr) {
if (null == queryStr || "".equals(queryStr.trim())) return null;
queryStr = queryStr.replaceAll(SQLUtil.REPLACECHAR_COMMA, " ").replaceAll(REPLACECHAR_SEMICOLON, " ");
return queryStr.split("\\s+");
}
private static String queryInStr(String[] queryStrs) {
if (null == queryStrs || 0 == queryStrs.length) return null;
StringBuffer buf = new StringBuffer();
for (int i = 0; i < queryStrs.length; i++) {
if (i != 0) buf.append(",");
buf.append("'").append(queryStrs[i]).append("'");
}
return buf.toString();
}
}

Mapper層處理:

//錯誤的處理
<if test="ruleName != null and ruleName != ''">
AND a.rule_name IN (#{ruleName})
</if>
//正確的處理
<if test="ruleName != null and ruleName != ''">
AND a.rule_name IN (${ruleName})
</if> 

日志描述:

[DEBUG] [2016-08-02 17:42:42.226] [qtp1457334982-157] java.sql.Connection - ==> Preparing: SELECT a.id, a.is_valid, a.rule_lable, a.rule_name, a.type, b.sp_id, b.sp_name,       a.rule_content, c.user_name, a.gmt_modified, a.ordering FROM idc_logistics_assign_rules a LEFT JOIN app_user c on c.work_no=a.modifier and c.is_deleted='n',       idc_sp_info b WHERE a.is_deleted = 'n' AND b.is_deleted = 'n' AND a.sp_id = b.sp_id AND a.rule_name IN (?) ORDER BY ordering asc limit ?, ? 
[DEBUG] [2016-08-02 17:42:42.226] [qtp1457334982-157] java.sql.PreparedStatement - ==> Parameters: 'A','B'(String), 0(Integer), 10(Integer)

結(jié)果分析:mapper層對sql有預編譯處理,對于#有占位符?,但是對于$會直接替換。

PS:MyBatis排序時使用order by 動態(tài)參數(shù)時需要注意,用$而不是#

字符串替換

 默認情況下,使用#{}格式的語法會導致MyBatis創(chuàng)建預處理語句屬性并以它為背景設置安全的值(比如?)。這樣做很安全,很迅速也是首選做法,有時你只是想直接在SQL語句中插入一個不改變的字符串。比如,像ORDER BY,你可以這樣來使用:

復制代碼 代碼如下:

 ORDER BY ${columnName}

 這里MyBatis不會修改或轉(zhuǎn)義字符串。

重要:接受從用戶輸出的內(nèi)容并提供給語句中不變的字符串,這樣做是不安全的。這會導致潛在的SQL注入攻擊,因此你不應該允許用戶輸入這些字段,或者通常自行轉(zhuǎn)義并檢查。

相關文章

  • IDEA maven項目中刷新依賴的兩種方法小結(jié)

    IDEA maven項目中刷新依賴的兩種方法小結(jié)

    這篇文章主要介紹了IDEA maven項目中刷新依賴的兩種方法小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java判斷主機是否能ping通代碼實例

    Java判斷主機是否能ping通代碼實例

    這篇文章主要介紹了Java判斷主機是否能ping通代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • MybatisPlus使用排序查詢時將null值放到最后

    MybatisPlus使用排序查詢時將null值放到最后

    按照更新時間排序,但是更新時間可能為null,因此將null的數(shù)據(jù)放到最后,本文主要介紹了MybatisPlus使用排序查詢時將null值放到最后,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • Java如何設置PDF文檔背景色詳解

    Java如何設置PDF文檔背景色詳解

    這篇文章主要介紹了Java如何設置PDF文檔背景色詳解,一般生成的PDF文檔默認的文檔底色為白色,我們可以通過一定方法來更改文檔的背景色,以達到文檔美化以及保護雙眼的作用。 以下內(nèi)容提供了Java編程來設置PDF背景色的方法,需要的朋友可以參考下
    2019-07-07
  • 淺析Java中接口和抽象類的七大區(qū)別

    淺析Java中接口和抽象類的七大區(qū)別

    Java 是一門面向?qū)ο蟮木幊陶Z言,面向?qū)ο蟮木幊陶Z言有四大特征:抽象、封裝、繼承和多態(tài)。本文介紹的接口和抽象類就是面向?qū)ο缶幊讨小俺橄蟆钡木唧w實現(xiàn)。本文也將為大家詳細講一下二者的區(qū)別,需要的可以參考一下
    2021-12-12
  • Jmeter解析返回參數(shù)以及解析并操作json方式

    Jmeter解析返回參數(shù)以及解析并操作json方式

    本文總結(jié)了Java或JMeter的BeanShell腳本中處理JSON字符串的常用操作,包括解析JSON數(shù)組、JSON對象和嵌套的JSON字符串,并提供了示例代碼和打印結(jié)果
    2025-02-02
  • 本地JDK多版本快速切換方案

    本地JDK多版本快速切換方案

    本文將詳細介紹如何在同一臺機器上安裝和配置多個版本的 JDK(JDK 8、JDK 17 和 JDK 21),并且使用綠色版(即無需安裝程序,直接解壓即可使用),通過這種方式,您可以在不同的項目中靈活選擇所需的 JDK 版本,需要的朋友可以參考下
    2025-03-03
  • Jmeter邏輯控制器事務控制器使用方法解析

    Jmeter邏輯控制器事務控制器使用方法解析

    這篇文章主要介紹了Jmeter邏輯控制器事務控制器使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Java SpringBoot安全框架整合Spring Security詳解

    Java SpringBoot安全框架整合Spring Security詳解

    這篇文章主要介紹了Spring Boot整合Spring Security的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-09-09
  • Spring Security方法鑒權的實現(xiàn)

    Spring Security方法鑒權的實現(xiàn)

    在Spring Security中,主要有兩種鑒權方式,一個是基于web請求的鑒權,一個是基于方法的鑒權,本文就來介紹一下Spring Security方法鑒權的實現(xiàn),感興趣的可以了解一下
    2023-12-12

最新評論

临湘市| 云南省| 保山市| 体育| 仲巴县| 浦北县| 凤阳县| 马龙县| 白沙| 浮梁县| 华坪县| 修文县| 绍兴市| 栾川县| 漳州市| 四会市| 乐业县| 内黄县| 克什克腾旗| 从化市| 定襄县| 兴仁县| 平安县| 收藏| 曲麻莱县| 永宁县| 嘉峪关市| 隆化县| 叶城县| 青铜峡市| 钟山县| 鄂尔多斯市| 罗江县| 尉犁县| 巩义市| 崇州市| 友谊县| 建瓯市| 嘉禾县| 弥渡县| 绥江县|