package com.trendy.fw.common.db;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.trendy.fw.common.util.DateKit;
public class SqlKit {
private static SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat(DateKit.DEFAULT_DATE_TIME_FORMAT);
/**
* 拼接SQL語法的字段字符串值
*
* @param value
* -- 數據
* @return -- SQL片段字符串
*/
private static String fieldValue(String value) {
if (null == value) {
return "''";
}
String v = value.trim();
int vs = v.length();
StringBuilder sb = new StringBuilder();
char c = 0;
sb.append('\'');
for (int i = 0; i < vs; i++) {
c = v.charAt(i);
// 防止sql注入處理,替換'爲'',替換\爲\\
if ('\'' == c) {
sb.append('\'');
sb.append('\'');
} else if ('\\' == c) {
sb.append('\\');
sb.append('\\');
} else {
sb.append(c);
}
}
sb.append('\'');
return sb.toString();
}
/**
* 拼接SQL語法的字段字符串值,默認日期格式爲:yyyy-MM-dd HH:mm:ss
*
* @param value
* -- 數據
* @return -- SQL片段字符串
*/
private static String fieldValue(Date value) {
return "'" + SIMPLE_DATE_FORMAT.format(value) + "'";
}
/**
* 拼接SQL語法的字段字符串值
*
* @param value
* -- 數據
* @return -- SQL片段字符串
*/
private static String fieldValue(Timestamp value) {
return "'" + value + "'";
}
/**
* 拼接SQL語法的字段字符串值
*
* @param value
* -- 數據
* @return -- SQL片段字符串,如果value爲null,返回字符串:''
*/
public static String fieldValue(Object value) {
if (null == value) {
return "''";
} else if (value instanceof String) {
return fieldValue((String) value);
} else if (value instanceof Date) {
return fieldValue((Date) value);
} else if (value instanceof Timestamp) {
return fieldValue((Timestamp) value);
} else if (value instanceof Integer || value instanceof Long || value instanceof Short
|| value instanceof Float || value instanceof Double) {
// 基本數字類型
return fieldValuePrimitive(value);
} else if (value instanceof List) {
return fieldValueArray(((List) value).toArray());
} else if (value instanceof Set) {
return fieldValueArray(((Set) value).toArray());
} else if (value.getClass().isArray()) {
// 數組類型,(基本數據類型沒法進行autoboxing,需要進行額外處理)
Class ct = value.getClass().getComponentType();
if (ct == String.class) {
return fieldValueArray(String[].class.cast(value));
} else if (ct == int.class) {
return fieldValueArray(boxedPrimitiveArray((int[]) value));
} else if (ct == long.class) {
return fieldValueArray(boxedPrimitiveArray((long[]) value));
} else if (ct == short.class) {
return fieldValueArray(boxedPrimitiveArray((short[]) value));
} else if (ct == float.class) {
return fieldValueArray(boxedPrimitiveArray((float[]) value));
} else if (ct == double.class) {
return fieldValueArray(boxedPrimitiveArray((double[]) value));
}
// 默認,轉成Object對象數組
return fieldValueArray((Object[]) value);
} else {
return "'" + value.toString() + "'";
}
}
/**
* 拼接SQL語法的字段字符串值,適用於基本數據類型
*
* @param value
* @return
*/
private static <T> String fieldValuePrimitive(T value) {
return value.toString();
}
/**
* 拼接SQL語法的字段字符串值,適用於數組類型
*
* @param value
* @return
*/
private static <T> String fieldValueArray(T[] value) {
if (null == value) {
return "''";
}
StringBuilder sql = new StringBuilder();
for (int i = 0; i < value.length; i++) {
sql.append(fieldValue(value[i]));
if (i < value.length - 1) {
sql.append(",");
}
}
return sql.toString();
}
/**
* 將int數組轉換成Integer數組
*
* @param array
* @return
*/
private static Integer[] boxedPrimitiveArray(int[] array) {
Integer[] result = new Integer[array.length];
for (int i = 0; i < array.length; i++)
result[i] = array[i];
return result;
}
/**
* 將short數組轉換成Short數組
*
* @param array
* @return
*/
private static Short[] boxedPrimitiveArray(short[] array) {
Short[] result = new Short[array.length];
for (int i = 0; i < array.length; i++)
result[i] = array[i];
return result;
}
/**
* 將long數組轉換成Long數組
*
* @param array
* @return
*/
private static Long[] boxedPrimitiveArray(long[] array) {
Long[] result = new Long[array.length];
for (int i = 0; i < array.length; i++)
result[i] = array[i];
return result;
}
/**
* 將float數組轉換成Float數組
*
* @param array
* @return
*/
private static Float[] boxedPrimitiveArray(float[] array) {
Float[] result = new Float[array.length];
for (int i = 0; i < array.length; i++)
result[i] = array[i];
return result;
}
/**
* 將double數組轉換成Double數組
*
* @param array
* @return
*/
private static Double[] boxedPrimitiveArray(double[] array) {
Double[] result = new Double[array.length];
for (int i = 0; i < array.length; i++)
result[i] = array[i];
return result;
}
public static String parseCountSql(String sql) {
// Pattern pattern = Pattern.compile("(?<=select).*?(?=from)",Pattern.CASE_INSENSITIVE);
// sql = sql.replace(matcher.group(0), " count(1) ");
Pattern pattern = Pattern.compile("select .*? from", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(sql);
if (matcher.find()) {
Pattern groupPattern = Pattern.compile("(?=sum|avg|count|distinct|max|min|union)", Pattern.CASE_INSENSITIVE);
Matcher groupMatcher = groupPattern.matcher(sql);
if (groupMatcher.find()) {
//group by 分組的 sql,保留嵌套方法
sql = "select count(1) from (" + sql + ") t";
}else{
//普通sql,替換原有字段
sql = sql.replace(matcher.group(0), "select count(1) from ");
}
}
return sql;
}
// public static String parseCountSql(String sql) {
// sql = sql.toLowerCase();
//
// int iFromIndex = sql.indexOf("from");
// sql = sql.replace(sql.substring(0,iFromIndex), "select count(1) ");
// System.out.println(sql);
//
// return sql;
// }
public static String parseCondList2String(List<String> condList, boolean isNeedWhere) {
StringBuilder sb = new StringBuilder();
if (condList.size() > 0) {
if (isNeedWhere) {
sb.append(" where ");
}
for (int i = 0; i < condList.size(); i++) {
String cond = condList.get(i);
if (i > 0) {
sb.append(" and ");
}
sb.append(cond);
}
}
return sb.toString();
}
public static String parseInQuery(int count) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < count; i++) {
if (i > 0) {
sb.append(", ");
}
sb.append("?");
}
return sb.toString();
}
}
SqlKit工具類
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.