mybatis直接執(zhí)行完整sql及踩坑解決
mybatis直接執(zhí)行完整sql及踩坑
開(kāi)發(fā)中有時(shí)遇到將表名或者完整sql作為參數(shù)去執(zhí)行,與一般情況下的增刪改查傳參數(shù)或者對(duì)象不同,mybatis也是可以直接執(zhí)行sql語(yǔ)句的,這個(gè)時(shí)候如何sql的返回值不太好處理,大致分為DQL和DML兩種情況。
select語(yǔ)句采用
List<LinkedHashMap<String , Object>>接收,這樣可以保證查詢結(jié)果的字段有序輸出,查詢結(jié)果如果是空會(huì)返回'[]'
List<LinkedHashMap<String , Object>> executeQuerySql(@Param("sql") String sql);count、insert、update等語(yǔ)句用int接收即可
int executeCountSql(@Param("sql") String sql);在xml中的標(biāo)簽統(tǒng)一用select即可
如下:
<select id="executeQuerySql" resultType="java.util.LinkedHashMap" parameterType="String">
${sql}
</select>
<select id="executeCountSql" resultType="java.lang.Integer" parameterType="String">
${sql}
</select>這時(shí)要注意預(yù)防sql注入
#{}拼接參數(shù)可以很大程度上的防止sql注入,${}卻不行,做法可以使用PrepareStateMent預(yù)編譯進(jìn)行防范,或者簡(jiǎn)單粗暴的對(duì)sql進(jìn)行識(shí)別過(guò)濾一下
例如:
public static boolean sqlValidate(String sql) {
String badStr = "'|and|exec|execute|insert|select|delete|update|count|drop|*|%|chr|mid|master|truncate|" +
"char|declare|sitename|net user|xp_cmdshell|;|or|-|+|,|like'|and|exec|execute|insert|create|drop|" +
"table|from|grant|use|group_concat|column_name|" +
"information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|*|" +
"chr|mid|master|truncate|char|declare|or|;|-|--|+|,|like|//|/|%|#";//過(guò)濾掉的sql關(guān)鍵字,可以手動(dòng)添加
String[] badSplit = badStr.split("\\|");
for (String s : badSplit) {
if (sql.contains(s)) {
return true;
}
}
return false;
}
}踩坑環(huán)節(jié)
1、resources目錄下的文件夾
一定要一步一步創(chuàng)建或者包中間用/符號(hào)分隔,否則就會(huì)造成看上去沒(méi)毛病,但是報(bào)錯(cuò):
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

圖中user是用mybatis/user創(chuàng)建的,user1是用mybatis.user1創(chuàng)建的,根本看不出來(lái),一不小心就得找bug一小時(shí)。。。
2、數(shù)據(jù)庫(kù)字段一定不要用關(guān)鍵字
否則在xml中就算用上各種轉(zhuǎn)義符累半天不說(shuō),還不一定好使。。。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot2.0解決Long型數(shù)據(jù)轉(zhuǎn)換成json格式時(shí)丟失精度問(wèn)題
這篇文章主要介紹了SpringBoot2.0解決Long型數(shù)據(jù)轉(zhuǎn)換成json格式時(shí)丟失精度問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
SpringBoot整合Mybatis實(shí)現(xiàn)多數(shù)據(jù)源配置與跨數(shù)據(jù)源事務(wù)實(shí)例
開(kāi)發(fā)中經(jīng)常有這樣的需要: 讀寫(xiě)分離。微服務(wù)環(huán)境下可以實(shí)現(xiàn)一個(gè)服務(wù)讀取一個(gè)數(shù)據(jù)庫(kù),另一個(gè)服務(wù)寫(xiě)庫(kù)。但是在實(shí)際應(yīng)用中有時(shí)也需要在一個(gè)服務(wù)中讀寫(xiě)不同的數(shù)據(jù)庫(kù)??梢栽谝粋€(gè)SpringBoot單體項(xiàng)目中配置多個(gè)數(shù)據(jù)源解決讀寫(xiě)庫(kù)分離2022-11-11
springboot+angular4前后端分離 跨域問(wèn)題解決詳解
這篇文章主要介紹了springboot+angular4前后端分離 跨域問(wèn)題解決詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Java?Bluetooth?藍(lán)牙通訊?BlueCove?掃描附近的藍(lán)牙設(shè)備(測(cè)試代碼)
BlueCove是一個(gè)開(kāi)源的藍(lán)牙協(xié)議棧實(shí)現(xiàn),旨在為Java開(kāi)發(fā)者提供一個(gè)全面的、易于使用的API,從而在應(yīng)用程序中實(shí)現(xiàn)藍(lán)牙功能,該項(xiàng)目支持多種操作系統(tǒng),這篇文章主要介紹了Java?Bluetooth?藍(lán)牙通訊?BlueCove?掃描附近的藍(lán)牙設(shè)備,需要的朋友可以參考下2025-01-01
json如何解析混合數(shù)組對(duì)象到實(shí)體類的list集合里去
這篇文章主要介紹了json解析混合數(shù)組對(duì)象到實(shí)體類的list集合里去的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

