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<Object,Object> srcParam){
|
long startTime = System.currentTimeMillis();
|
StringBuffer sqlSelect = new StringBuffer(select);
|
List<Object> 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<Object,Object> srcParam){
|
long startTime = System.currentTimeMillis();
|
StringBuffer sqlSelect = new StringBuffer(select);
|
List<Object> 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<Object, Object> srcParam, StringBuffer sqlSelect,List<Object> 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<Object, Object> srcParam,List<Object> 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<Object, Object> srcParam,List<Object> 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<Object, Object> srcParam, List<Object> 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 max(Map<Object, Object> srcParam, List<Object> 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<Object, Object> srcParam, List<Object> 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<Object, Object> srcParam, List<Object> 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<Object, Object> srcParam, List<Object> 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;
|
}
|
}
|