Util
package utils;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
public class SQLUtils {
/**
* 2014-05修改 增加对查询语句的缓存 增加对jdbcTemplt查询出的Map转换成Bean的方法
*/
private static Logger log = Logger.getLogger(SQLUtils.class);
private static Map cacheMap = new HashMap();
private static Map insertSqlCache = new HashMap();
private static Map updateSqlCache = new HashMap();
private static Map deleteSqlCache = new HashMap();
private static Map selectSqlCache = new HashMap();
/**
* 根据pojo类的class来构建select * from 的SQL语句
*
* @param pojoClass
* @return
*/
public static String buildSelectSql(Class pojoClass) {
List<FieldInfo> fieldInfoList = loadPojoSqlInfo(pojoClass);
String sql = buildSelectSql(pojoClass, fieldInfoList);
if (log.isDebugEnabled()) {
log.debug("select sql is:" + sql);
}
return sql;
}
/**
* 根据pojo类的class来构建insert的SQL语句
*
* @param pojoClass
* @return
*/
public static String buildInsertSql(Class pojoClass) {
List<FieldInfo> fieldInfoList = loadPojoSqlInfo(pojoClass);
String sql = buildInsertSql(pojoClass, fieldInfoList);
if (log.isDebugEnabled()) {
log.debug("insert sql is:" + sql);
}
return sql;
}
/**
* 根据pojo类的class构建根据pk来update的SQL语句
*
* @param pojoObject
* @return
*/
public static String buildUpdateSql(Class pojoClass) {
List<FieldInfo> fieldInfoList = loadPojoSqlInfo(pojoClass);
String sql = buildUpdateSqlByPK(pojoClass, fieldInfoList);
if (log.isDebugEnabled()) {
log.debug("update sql is:" + sql);
}
return sql;
}
/**
* 根据pojo类的Class和更新的条件字段来生成upate的SQL语句
*
* @param pojoClass
* @param columns
* @return
* @throws Exception
*/
public static String buildUpdateSqlByColumns(Class pojoClass,
String[] columns) throws Exception {
if (null != columns && columns.length > 0) {
List<FieldInfo> fieldInfoList = loadPojoSqlInfo(pojoClass);
String sql = buildUpdateSqlByColumns(pojoClass, fieldInfoList,
columns);
if (log.isDebugEnabled()) {
log.debug("update sql is:" + sql);
}
return sql;
} else {
if (log.isDebugEnabled()) {
log.debug("生成update sql error! 参数columns必须有值");
}
throw new Exception("参数columns必须有值!");
}
}
/**
* 根据pojo类的Class生成根据pk来delete的SQL语句
*
* @param pojoClass
* @return
*/
public static String buildDeleteSql(Class pojoClass) {
List<FieldInfo> fieldInfoList = loadPojoSqlInfo(pojoClass);
String sql = buildDeleteSqlByPK(pojoClass, fieldInfoList);
if (log.isDebugEnabled()) {
log.debug("delete sql is:" + sql);
}
return sql;
}
/**
* 根据pojo类的Class和更新的条件字段来生成delete的SQL语句
*
* @param pojoClass
* @param columns
* @return
* @throws Exception
*/
public static String buildDeleteSqlByColumns(Class pojoClass,
String[] columns) throws Exception {
if (null != columns && columns.length > 0) {
List<FieldInfo> fieldInfoList = loadPojoSqlInfo(pojoClass);
String sql = buildDeleteSqlByColumns(pojoClass, fieldInfoList,
columns);
if (log.isDebugEnabled()) {
log.debug("delete sql is:" + sql);
}
return sql;
} else {
if (log.isDebugEnabled()) {
log.debug("生成delete sql error! 参数columns必须有值");
}
throw new Exception("参数columns必须有值!");
}
}
/**
* 将SQL查询出来的map对象转成实体对象
*
* @param map
* @param pojoClass
* @return
* @throws Exception
*/
public static Object coverMapToBean(Map map, Class pojoClass)
throws Exception {
Object result = pojoClass.newInstance();
List<FieldInfo> list = loadPojoSqlInfo(pojoClass);
for (FieldInfo fieldInfo : list) {
String dbName = fieldInfo.getDbFieldName().toUpperCase();
String fieldName = fieldInfo.getPojoFieldName();
String setMethoName = "set"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
if (map.get(dbName) != null) {
Method m = pojoClass.getMethod(setMethoName,
fieldInfo.getType());
m.invoke(result, map.get(dbName));
}
}
return result;
}
/**
* 加载读取pojo的注解信息
*
* @param pojoClass
* @return
*/
@SuppressWarnings("unchecked")
private static List<FieldInfo> loadPojoSqlInfo(Class pojoClass) {
List<FieldInfo> resultList = null;
if (null == cacheMap.get(pojoClass.getName())) {
resultList = new ArrayList<FieldInfo>();
java.lang.reflect.Field[] fields = pojoClass.getDeclaredFields();
for (java.lang.reflect.Field field : fields) {
FieldInfo fieldInfo = new FieldInfo();
fieldInfo.setPojoFieldName(field.getName());
if (field.isAnnotationPresent(Field.class)) {
String value = ((Field) field
.getAnnotation(Field.class)).value();// 得到配置的数据库字段名
if (StringUtils.isEmpty(value)) {// 没有设置数据库的字段名,则取pojo的字段名
fieldInfo.setDbFieldName(lowerStrToUnderline(field
.getName()));
} else {
fieldInfo.setDbFieldName(value);
}
} else {
fieldInfo.setDbFieldName(lowerStrToUnderline(field
.getName()));
}
if (field.isAnnotationPresent(PK.class)) {
fieldInfo.setIsPk(true);
}
if (field.isAnnotationPresent(NoInsert.class)) {
fieldInfo.setIsInsert(false);
}
if (field.isAnnotationPresent(NoUpdate.class)) {
fieldInfo.setIsUpdate(false);
}
fieldInfo.setType(field.getType());
resultList.add(fieldInfo);
}
cacheMap.put(pojoClass.getName(), resultList);
} else {
resultList = (List<FieldInfo>) cacheMap.get(pojoClass.getName());
}
return resultList;
}
/**
* 评价select语句
*
* @param pojoClass
* @param fieldInfoList
* @return
*/
private static String buildSelectSql(Class pojoClass,
List<FieldInfo> fieldInfoList) {
if (selectSqlCache.get(pojoClass.getName()) != null) {
return (String) selectSqlCache.get(pojoClass.getName());
}
return "select * from " + loadTableName(pojoClass);
}
/**
* 拼接insert的SQL
*
* @param pojoClass
* @param fieldInfoList
* @return
*/
@SuppressWarnings("unchecked")
private static String buildInsertSql(Class pojoClass,
List<FieldInfo> fieldInfoList) {
String result = null;
if (insertSqlCache.get(pojoClass.getName()) != null) {
result = (String) insertSqlCache.get(pojoClass.getName());
return result;
}
String tableName = loadTableName(pojoClass);
StringBuffer temp1 = new StringBuffer();
StringBuffer temp2 = new StringBuffer();
for (FieldInfo fieldInfo : fieldInfoList) {
if (fieldInfo.isInsert()) {
temp1.append(fieldInfo.getDbFieldName()).append(",");
temp2.append(":").append(fieldInfo.getPojoFieldName())
.append(",");
}
}
temp1.deleteCharAt(temp1.length() - 1);
temp2.deleteCharAt(temp2.length() - 1);
StringBuffer resultSql = new StringBuffer();
resultSql.append("insert into ");
resultSql.append(tableName);
resultSql.append("(");
resultSql.append(temp1);
resultSql.append(") values (");
resultSql.append(temp2);
resultSql.append(")");
result = resultSql.toString();
insertSqlCache.put(pojoClass.getName(), result);
return result;
}
/**
* 生成根据主键生成删除的SQL
*
* @param pojoClass
* @param fieldInfoList
* @