package com.product.org.admin.util; import java.util.LinkedList; import java.util.List; import java.util.Map; public class Parser { /** * SQL条件写法: a.bb>=bc,and b.cc<=b,and b.cc=b,and b.cc<>b, or ee like be,and yy=? * @param select * @param where * @param srcParam * @return SqlParam * @throws */ public static SqlParam sqlAndParamParser(String select,String where,String lastWhere,Map srcParam){ long startTime = System.currentTimeMillis(); StringBuffer sqlSelect = new StringBuffer(select); List paramList = new LinkedList<>(); sqlAndParamParser(where, srcParam, sqlSelect, paramList); String sql = deleteAndOr(sqlSelect); System.out.println("useTime="+(System.currentTimeMillis()-startTime)+"ms"); return new SqlParam(sql+(lastWhere!=null?lastWhere:""),paramList.toArray()); } /** * SQL条件写法: a.bb>=bc,and b.cc<=b,and b.cc=b,and b.cc<>b, or ee like be,and yy=? * @param select * @param where * @param srcParam * @return SqlParam * @throws */ public static SqlParam sqlAndParamParser(String select,String where,Map srcParam){ long startTime = System.currentTimeMillis(); StringBuffer sqlSelect = new StringBuffer(select); List paramList = new LinkedList<>(); sqlAndParamParser(where, srcParam, sqlSelect, paramList); String sql = deleteAndOr(sqlSelect); System.out.println("useTime="+(System.currentTimeMillis()-startTime)+"ms"); return new SqlParam(sql,paramList.toArray()); } private static void sqlAndParamParser(String where,Map srcParam, StringBuffer sqlSelect,List paramList) { String[] whereList = where.split(","); for (String str : whereList) { if(str.contains("=")){ equals(srcParam, paramList, sqlSelect, str); }else if(str.contains("<=")){ minAndEquals(srcParam, paramList, sqlSelect, str); }else if(str.contains("<>")||str.contains("!=")){ notEquals(srcParam, paramList, sqlSelect, str); }else if(str.contains(">=")){ maxAndEquals(srcParam, paramList, sqlSelect, str); }else if(str.contains(">")){ max(srcParam, paramList, sqlSelect, str); }else if(str.contains("<")){ min(srcParam, paramList, sqlSelect, str); }else if(str.contains("like")){ like(srcParam, paramList, sqlSelect, str); } } } private static String deleteAndOr(StringBuffer sqlSelect) { String sql = sqlSelect.toString(); if(sql.startsWith("or"))sql = sql.replace("or", ""); if(sql.startsWith("and"))sql = sql.replace("and", ""); return sql; } private static void equals(Map srcParam,List paramList, StringBuffer sqlSelect, String str) { String[] eps = str.split("="); String key = findParamKey(eps); if(!isEmpty(srcParam.get(key))){ sqlSelect.append(eps[0]+"= ? "); paramList.add(srcParam.get(key)); } } private static String findParamKey(String[] eps) { if(eps[1].contains("?")){ String aa = eps[0].replace("and","").replace("or", ""); String[] ss = aa.split("\\."); return ss.length>1?ss[1].trim():ss[0].trim(); }else{ return eps[1].trim(); } } private static void like(Map srcParam,List paramList, StringBuffer sqlSelect, String str) { String[] eps = str.split("like"); String key = findParamKey(eps); if(!isEmpty(srcParam.get(key))){ sqlSelect.append(eps[0]+"like ? "); paramList.add("%"+srcParam.get(key)+"%"); } } private static void min(Map srcParam, List paramList, StringBuffer sqlSelect, String str) { String[] eps = str.split("<"); String key = findParamKey(eps); if(!isEmpty(srcParam.get(key))){ sqlSelect.append(eps[0]+" srcParam, List paramList, StringBuffer sqlSelect, String str) { String[] eps = str.split(">"); String key = findParamKey(eps); if(!isEmpty(srcParam.get(key))){ sqlSelect.append(eps[0]+">? "); paramList.add(srcParam.get(key)); } } private static void notEquals(Map srcParam, List paramList, StringBuffer sqlSelect, String str) { String[] eps = str.split("<>"); String key = findParamKey(eps); if(!isEmpty(srcParam.get(key))){ sqlSelect.append(eps[0]+"<>? "); paramList.add(srcParam.get(key)); } } private static void minAndEquals(Map srcParam, List paramList, StringBuffer sqlSelect, String str) { String[] eps = str.split("<="); String key = findParamKey(eps); if(!isEmpty(srcParam.get(key))){ sqlSelect.append(eps[0]+"<=? "); paramList.add(srcParam.get(key)); } } private static void maxAndEquals(Map srcParam, List paramList, StringBuffer sqlSelect, String str) { String[] eps = str.split(">="); String key = findParamKey(eps); if(!isEmpty(srcParam.get(key))){ sqlSelect.append(eps[0]+">=? "); paramList.add(srcParam.get(key)); } } @SuppressWarnings("rawtypes") public static boolean isEmpty(Object obj){ if(obj==null){ return true; } if(obj instanceof String){ return "".equals(obj.toString()); } if(obj instanceof List){ return ((List)obj).isEmpty(); } if(obj instanceof Map){ return ((Map)obj).isEmpty(); } return false; } }