java正則替換sql中的參數實例代碼
前言
在處理sql參數的時候,替換圓括號里面只處理了一種情況。而沒有從整體上進行處理?。?!
這是一個思考問題上嚴重的偏向。 考慮問題時候,要先從整體開始考慮,逐步分解,再細分到局部!
要求:
替換sql里面的參數:
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");
對于參數里面有的值進行替換,沒有的值,替換為空。
分析:
sql 里面支持大小寫,替換的時候,要處理大小寫。
常見的sql條件里面有: where、in、or、like
如果where 后面的條件都為空 設置為 1 = 1
\s | 匹配任何空白字符,包括空格、制表符、換頁符等等。等價于 [ \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_.]*)\)*
兩個不好合并在一起處理,就分開來。
代碼:
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; }
測試:
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
總結:
處理問題的時候,先從整體考慮,全面把握,再細化到局部。如果完全沒頭緒,再從局部開始尋找突破。
到此這篇關于java正則替換sql中參數的文章就介紹到這了,更多相關java正則替換sql參數內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中static修飾的靜態(tài)變量、方法及代碼塊的特性與使用
這篇文章主要介紹了Java中static修飾的靜態(tài)變量、方法及代碼塊的特性與使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-04-04MyBatis中使用#{}和${}占位符傳遞參數的各種報錯信息處理方案
這篇文章主要介紹了MyBatis中使用#{}和${}占位符傳遞參數的各種報錯信息處理方案,分別介紹了兩種占位符的區(qū)別,本文給大家介紹的非常詳細,需要的朋友可以參考下2024-01-01Spring Boot實現Undertow服務器同時支持HTTP2、HTTPS的方法
這篇文章考慮如何讓Spring Boot應用程序同時支持HTTP和HTTPS兩種協(xié)議。小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12深入理解Java中的并發(fā)工具類CountDownLatch
CountDownLatch?作為?Java?中的一個同步工具類,用于在多線程間實現協(xié)調和控制,本文主要來和大家講解一下JUC?工具類?CountDownLatch的使用,需要的可以參考一下2023-07-07