MyBatis?Xml映射文件之字符串替換方式
MyBatis Xml映射文件字符串替換
字符串替換
默認(rèn)情況下,使用 #{} 格式的語法會導(dǎo)致 MyBatis 創(chuàng)建 PreparedStatement 參數(shù)占位符并安全地設(shè)置參數(shù)(就像使用 ? 一樣)。 這樣做更安全,更迅速,通常也是首選做法,不過有時你就是想直接在 SQL 語句中插入一個不轉(zhuǎn)義的字符串。
比如,像 ORDER BY,你可以這樣來使用:
ORDER BY ${columnName}
這里 MyBatis 不會修改或轉(zhuǎn)義字符串。
當(dāng) SQL 語句中的元數(shù)據(jù)(如表名或列名)是動態(tài)生成的時候,字符串替換將會非常有用。
舉個例子
如果你想通過任何一列從表中 select 數(shù)據(jù)時,不需要像下面這樣寫:
@Select("select * from user where id = #{id}")
User findById(@Param("id") long id);
@Select("select * from user where name = #{name}")
User findByName(@Param("name") String name);
@Select("select * from user where email = #{email}")
User findByEmail(@Param("email") String email);
// and more "findByXxx" method
可以只寫這樣一個方法:
@Select("select * from user where ${column} = #{value}")
User findByColumn(@Param("column") String column, @Param("value") String value);
其中 ${column} 會被直接替換,而 #{value} 會被使用 ? 預(yù)處理。 因此你就可以像下面這樣來達到上述功能:
User userOfId1 = userMapper.findByColumn("id", 1L);
User userOfNameKid = userMapper.findByColumn("name", "kid");
User userOfEmail = userMapper.findByColumn("email", noone@nowhere.com);
這個想法也同樣適用于用來替換表名的情況。
提示:用這種方式接受用戶的輸入,并將其用于語句中的參數(shù)是不安全的,會導(dǎo)致潛在的 SQL 注入攻擊,因此要么不允許用戶輸入這些字段,要么自行轉(zhuǎn)義并檢驗。
Mybatis中字符串替換問題
默認(rèn)情況下,使用#{}格式的語法會導(dǎo)致MyBatis創(chuàng)建預(yù)處理語句屬性并以它為背景設(shè)置安全的值(比如?)。這樣做很安全,很迅速也是首選做法!
有時只想直接在SQL語句中插入一個不改變的字符串.比如,像ORDER BY,你可以這樣來使用:ORDER BY ${column}
這里MyBatis不會修改或轉(zhuǎn)義字符串。
重要:接受從用戶輸出的內(nèi)容并提供給語句中不變的字符串,這樣做是不安全的。這會導(dǎo)致潛在的SQL注入攻擊,因此你不應(yīng)該允許用戶輸入這些字段,或者通常自行轉(zhuǎn)義并檢查!
錯誤方式:
ORDER BY fupdated ${sort, jdbcType=VARCHAR}, fcreated ${sort, jdbcType=VARCHAR}
正確方式:
ORDER BY fupdated ${sort}, fcreated ${sort}
前提條件:請對sort進行必要驗證,防止sql攻擊問題!
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringMVC Mybatis配置多個數(shù)據(jù)源并切換代碼詳解
這篇文章主要介紹了SpringMVC Mybatis配置多個數(shù)據(jù)源并切換代碼詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11
java學(xué)生信息管理系統(tǒng)設(shè)計與實現(xiàn)
這篇文章主要為大家詳細介紹了java學(xué)生信息管理系統(tǒng)設(shè)計與實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01
SpringBoot整合EasyExcel進行大數(shù)據(jù)處理的方法詳解
EasyExcel是一個基于Java的簡單、省內(nèi)存的讀寫Excel的開源項目。在盡可能節(jié)約內(nèi)存的情況下支持讀寫百M的Excel。本文將在SpringBoot中整合EasyExcel進行大數(shù)據(jù)處理,感興趣的可以了解一下2022-05-05
Spring?Boot應(yīng)用中如何動態(tài)指定數(shù)據(jù)庫實現(xiàn)不同用戶不同數(shù)據(jù)庫的問題
讓我們創(chuàng)建一個 Spring Boot 項目首先設(shè)置一個具有必要依賴項的新 Spring Boot項目,在項目配置中包括 Spring Web、Spring Data JPA 和關(guān)于數(shù)據(jù)庫的依賴項,接下來介紹Spring?Boot應(yīng)用中如何動態(tài)指定數(shù)據(jù)庫,實現(xiàn)不同用戶不同數(shù)據(jù)庫的場景?,需要的朋友可以參考下2024-04-04
Mockito mock Kotlin Object類方法報錯解決方法
這篇文章主要介紹了Mockito mock Kotlin Object類方法報錯解決方法,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-09-09
Java中Mybatis,SpringMVC,Spring的介紹及聯(lián)系
這篇文章主要為大家詳細介紹了Java中Mybatis,SpringMVC,Spring的介紹及聯(lián)系,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10
Java?Elastic-Job分布式定時任務(wù)使用方法介紹
xxl-job?通過一個中心式的調(diào)度平臺,調(diào)度多個執(zhí)行器執(zhí)行任務(wù),調(diào)度中心通過?DB?鎖保證集群分布式調(diào)度的一致性,這樣擴展執(zhí)行器會增大?DB?的壓力,然而大部分公司的任務(wù)數(shù),執(zhí)行器并不多;xxl-job?提供了非常好用的監(jiān)控頁面甚至還有任務(wù)失敗的郵件告警功能2023-01-01

