java正則替換sql中的參數(shù)實(shí)例代碼
前言
在處理sql參數(shù)的時(shí)候,替換圓括號(hào)里面只處理了一種情況。而沒(méi)有從整體上進(jìn)行處理?。?!
這是一個(gè)思考問(wèn)題上嚴(yán)重的偏向。 考慮問(wèn)題時(shí)候,要先從整體開(kāi)始考慮,逐步分解,再細(xì)分到局部!
要求:
替換sql里面的參數(shù):
SELECT a.table_id, a.table_title, a.table_name, a.table_serial, b.STAFF_NAME , b.REGION_NAME, b.operatingsystem, b.renduoxuan FROM table_basic a, table_177 b WHERE a.table_id = b.table_id AND a.table_serial in ($formSerial) and a.create_date >= $createStartDate AND a.create_date <= $createEndDate or a.state like '%$state%' AND b.tickettitle in ($tickettitle) GROUP BY a.table_id ORDER BY state_date DESC
參數(shù):
Map<String, Object> sqlParam = new HashMap<>(); sqlParam.put("state", "A,F"); sqlParam.put("tableSerial", "COM, tt");
對(duì)于參數(shù)里面有的值進(jìn)行替換,沒(méi)有的值,替換為空。
分析:
sql 里面支持大小寫(xiě),替換的時(shí)候,要處理大小寫(xiě)。
常見(jiàn)的sql條件里面有: where、in、or、like
如果where 后面的條件都為空 設(shè)置為 1 = 1
\s | 匹配任何空白字符,包括空格、制表符、換頁(yè)符等等。等價(jià)于 [ \f\n\r\t\v]。 |
前面條件的正則:
\\s+(where|WHERE|and|AND|or|OR)(\\s+[a-zA-Z0-9_.]+)(\\s*(IN|in|=|>=|>|<|<=|like|LIKE)+)
String condition = "\\s+(where|WHERE|and|AND|or|OR)(\\s+[a-zA-Z0-9_.]+)(\\s*(IN|in|=|>=|>|<|<=|like|LIKE)+)";
后面條件的正則:
帶like: \s*\(*'%\$([a-zA-Z_.]*)%'\)*
其它: \s*\(*\$([a-zA-Z_.]*)\)*
兩個(gè)不好合并在一起處理,就分開(kāi)來(lái)。
代碼:
public static String replaceConditionStr(String content, Map<String, Object> param) { String likeCondition = "\\s*\\(*\'%\\$([a-zA-Z_.]*)%\'\\)*"; content = replaceOtherConditionStr(content, param, likeCondition); String otherCondition = "\\s*\\(*\\$([a-zA-Z_.]*)\\)*"; return replaceOtherConditionStr(content, param, otherCondition); } public static String replaceOtherConditionStr(String content, Map<String, Object> param, String paramConfition) { String condition = "\\s+(where|WHERE|and|AND|or|OR)(\\s+[a-zA-Z0-9_.]+)(\\s*(IN|in|=|>=|>|<|<=|like|LIKE)+)"; String pattern = condition + paramConfition; Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(content); while (m.find()) { String group = m.group(); String operator = m.group(4); String key = m.group(5); if (key.contains(".")) { key = StringUtils.substringAfter(key, "."); } String value = MapUtils.getString(param, key); if (StringUtils.isBlank(value)) { if (group.contains("WHERE") || group.contains("where")) { content = content.replace(group, " where 1 = 1 "); } content = content.replace(group, ""); } else { if ("like".equals(operator) || "LIKE".equals(operator)) { if (!group.contains("%")) { value = ("\'%").concat(value).concat("%\'"); } } else { if ("in".equals(operator) || "IN".equals(operator)) { List<String> valueArr = Arrays.asList(value.split(",")); value = ListUtils.emptyIfNull(valueArr).stream().map(s -> "\'" + s.trim() + "\'") .collect(Collectors.joining(",")); } else { value = ("\'").concat(value).concat("\'"); } } content = content.replace("$" + key, value); } } return content; }
測(cè)試:
public static void main(String[] args) { testSqlEmpty(); testSqlReplace(); } public static void testSqlEmpty() { String sqlContent = "SELECT a.table_id, a.table_title, a.table_name, a.table_serial, b.STAFF_NAME , b.REGION_NAME, " + " b.operatingsystem, b.renduoxuan FROM table_basic a, table_177 b WHERE " + " a.table_serial in ($formSerial) and a.create_date >= $createStartDate " + "AND a.create_date <= $createEndDate or a.state like '%$state%' " + "AND b.tickettitle in ($tickettitle) GROUP BY a.table_id ORDER BY state_date DESC"; Map<String, Object> sqlParam = new HashMap<>(); System.out.println("empty param: "+replaceConditionStr(sqlContent, sqlParam)); } public static void testSqlReplace() { String sqlContent = "SELECT a.table_id, a.table_title, a.table_name, a.table_serial, b.STAFF_NAME , b.REGION_NAME, " + " b.operatingsystem, b.renduoxuan FROM table_basic a, table_177 b WHERE a.table_id = b.table_id " + "AND a.table_serial in ($formSerial) and a.create_date >= $createStartDate " + "AND a.create_date <= $createEndDate or a.state like '%$state%' " + "AND b.tickettitle in ($tickettitle) GROUP BY a.table_id ORDER BY state_date DESC"; Map<String, Object> sqlParam = new HashMap<>(); sqlParam.put("state", "A,F"); sqlParam.put("tableSerial", "COM, tt"); System.out.println("have param: "+replaceConditionStr(sqlContent, sqlParam)); }
empty param: SELECT a.table_id, a.table_title, a.table_name, a.table_serial, b.STAFF_NAME , b.REGION_NAME, b.operatingsystem, b.renduoxuan FROM table_basic a, table_177 b where 1 = 1 GROUP BY a.table_id ORDER BY state_date DESC have param: SELECT a.table_id, a.table_title, a.table_name, a.table_serial, b.STAFF_NAME , b.REGION_NAME, b.operatingsystem, b.renduoxuan FROM table_basic a, table_177 b WHERE a.table_id = b.table_id or a.state like '%A,F%' GROUP BY a.table_id ORDER BY state_date DESC
總結(jié):
處理問(wèn)題的時(shí)候,先從整體考慮,全面把握,再細(xì)化到局部。如果完全沒(méi)頭緒,再?gòu)木植块_(kāi)始尋找突破。
到此這篇關(guān)于java正則替換sql中參數(shù)的文章就介紹到這了,更多相關(guān)java正則替換sql參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中static修飾的靜態(tài)變量、方法及代碼塊的特性與使用
這篇文章主要介紹了Java中static修飾的靜態(tài)變量、方法及代碼塊的特性與使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04MyBatis中使用#{}和${}占位符傳遞參數(shù)的各種報(bào)錯(cuò)信息處理方案
這篇文章主要介紹了MyBatis中使用#{}和${}占位符傳遞參數(shù)的各種報(bào)錯(cuò)信息處理方案,分別介紹了兩種占位符的區(qū)別,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01java中對(duì)象和JSON格式的轉(zhuǎn)換方法代碼
JSON格式可以輕松地以面向?qū)ο蟮姆绞睫D(zhuǎn)換為Java對(duì)象,下面這篇文章主要給大家介紹了關(guān)于java中對(duì)象和JSON格式的轉(zhuǎn)換方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12如何實(shí)用Java實(shí)現(xiàn)合并、拆分PDF文檔
這篇文章主要介紹了如何實(shí)用Java實(shí)現(xiàn)合并、拆分PDF文檔,處理PDF文檔時(shí),這樣的好處是對(duì)文檔的存儲(chǔ)、管理很方便。下面將通過(guò)Java程序代碼介紹具體的PDF合并、拆分的方法,需要的朋友可以參考下2019-07-07Spring Boot實(shí)現(xiàn)Undertow服務(wù)器同時(shí)支持HTTP2、HTTPS的方法
這篇文章考慮如何讓Spring Boot應(yīng)用程序同時(shí)支持HTTP和HTTPS兩種協(xié)議。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12Mybatis實(shí)體類(lèi)對(duì)象入?yún)⒉樵?xún)的筆記
這篇文章主要介紹了Mybatis實(shí)體類(lèi)對(duì)象入?yún)⒉樵?xún)的筆記,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06深入理解Java中的并發(fā)工具類(lèi)CountDownLatch
CountDownLatch?作為?Java?中的一個(gè)同步工具類(lèi),用于在多線(xiàn)程間實(shí)現(xiàn)協(xié)調(diào)和控制,本文主要來(lái)和大家講解一下JUC?工具類(lèi)?CountDownLatch的使用,需要的可以參考一下2023-07-07Spring+Quartz配置定時(shí)任務(wù)實(shí)現(xiàn)代碼
這篇文章主要介紹了Spring+Quartz配置定時(shí)任務(wù)實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04