package com.mtools.core.plugin.db; import java.beans.PropertyDescriptor; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Vector; import javax.sql.DataSource; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.jdbc.core.JdbcOperations; import org.springframework.jdbc.core.PreparedStatementCreator; import org.springframework.jdbc.core.SqlTypeValue; import org.springframework.jdbc.core.StatementCreatorUtils; import org.springframework.jdbc.object.BatchSqlUpdate; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import com.mtools.core.plugin.annotation.Temporary; import com.mtools.core.plugin.constant.CoreConstans; import com.mtools.core.plugin.helper.AIPGException; import com.mtools.core.plugin.helper.Auxs; import com.mtools.core.plugin.helper.FuncUtil; @SuppressWarnings({"unchecked","rawtypes"}) public class DBUtil { private static Map tableNameMap = new HashMap(); private static Map tableKeysMap = new HashMap(); private static Map tableAlisMap = new HashMap(); public static int updateObjCond(boolean undercore,JdbcOperations dbop,String tab,Class clzz,Object obj,String... keys) { ArrayList ls=new ArrayList(); String sql=createUpdateSql(undercore,tab,clzz, obj, ls, IG_NULL|IG_MIN, keys); return updateEx(dbop,sql,ls.toArray()); } public static int updateObjFull(JdbcOperations dbop,String tab,Class clzz,Object obj,String... keys) { return updateObjFull(false,dbop, tab, clzz, obj, keys); } public static int updateObjFull(boolean undercore,JdbcOperations dbop,String tab,Class clzz,Object obj,String... keys) { ArrayList ls=new ArrayList(); String sql=createUpdateSql(undercore,tab, clzz, obj, ls, IG_NULL|IG_MIN, keys); return updateEx(dbop,sql,ls.toArray()); } public static int updateObj(boolean undercore,JdbcOperations dbop,String tab,Class clzz,Object obj,int flags,String... keys) { ArrayList ls=new ArrayList(); String sql=createUpdateSql(undercore,tab, clzz, obj, ls, flags, keys); return updateEx(dbop,sql,ls.toArray()); } public static int updateEx(JdbcOperations dbop,String sql,Object...args) { if(logupdate) log.debug(sql+" "+FuncUtil.filteSepcStr(Arrays.toString(args))); return dbop.update(sql, args); } public static int[] updateBatch(JdbcOperations dbop,String sql,Object[]... objs) { return dbop.batchUpdate(sql, Arrays.asList(objs)); } public static KeyHolder updateX(JdbcOperations dbop,final String sql,final String[] retCols,final Object... args) { return update(dbop,sql,args,retCols); } public static KeyHolder update(JdbcOperations dbop,final String sql,final Object[] args,final String[] retCols) { KeyHolder kh=new GeneratedKeyHolder(); dbop.update(new PreparedStatementCreator() { public PreparedStatement createPreparedStatement(Connection con) throws SQLException { int i=1; PreparedStatement ps; ps=con.prepareStatement(sql,retCols); for(Object o:args) { StatementCreatorUtils.setParameterValue(ps, i++, SqlTypeValue.TYPE_UNKNOWN, o); } return ps; } }, kh); return kh; } public static List getList(JdbcOperations dbop, String sql,Class clz,Object... args) { BeanPropRowMap mp=new BeanPropRowMap(clz); mp.setPrimitivesDefaultedForNullValue(true); if(logquery) log.debug("查询列表SQL: " + sql + " 参数: " + Arrays.toString(args)); return dbop.query(sql, args,mp); } public static List getPage(boolean isOrcl,JdbcOperations dbop, String sql,Class clz,int start,int size, Object... args) { if(isOrcl){ sql = "select * from (select rownum myrownum,newtable.* from (" + sql + ") newtable where rownum <= " + (start + size) + ") where myrownum > " + start; }else{ sql += " limit "+start+","+size; } BeanPropRowMap mp=new BeanPropRowMap(clz); mp.setPrimitivesDefaultedForNullValue(true); if(logquery) log.debug("查询列表SQL: " + sql + " 参数: " + Arrays.toString(args)); return dbop.query(sql, args,mp); } public static List<Object[]> getListForArray(JdbcOperations dbop, String sql,Object... args){ if(logquery) log.debug("查询列表SQL: " + sql + " 参数: " + Arrays.toString(args)); List<Map<String,Object>> list = dbop.queryForList(sql, args); List<Object[]> data = new ArrayList<Object[]>(); for (Map<String, Object> map : list) { List<Object> record = new ArrayList<Object>(); Iterator<Map.Entry<String, Object>> it = map.entrySet().iterator(); // 封装数据 while (it.hasNext()) { Map.Entry<String, Object> entry = it.next(); // 只保留值,非key record.add(entry.getValue()); } data.add(record.toArray()); } return data; } public static List<Object[]> getListForArrayPage(boolean isOrcl,JdbcOperations dbop, String sql,int start,int size,Object... args){ if(isOrcl){ sql = "select * from (select newtable.*,rownum myrownum from (" + sql + ") newtable where rownum <= " + (start + size) + ") where myrownum > " + start; }else{ sql+=" limit "+start+","+size; } return getListForArray(dbop,sql,args); } public static List<Map<String,Object>> getListForMap(JdbcOperations dbop, String sql,Object... args){ if(logquery) log.debug("查询列表SQL: " + sql + " 参数: " + Arrays.toString(args)); return dbop.queryForList(sql, args); } public static List<Map<String,Object>> getListForMapPage(boolean isOrcl,JdbcOperations dbop, String sql,int start,int size,Object... args){ if(isOrcl){ sql = "select * from (select rownum myrownum,newtable.* from (" + sql + ") newtable where rownum <= " + (start + size) + ") where myrownum > " + start; }else{//mysql的查询 sql+=" limit "+start+","+size; } return getListForMap(dbop,sql, args); } public static Object getObj(JdbcOperations dbop, String sql,Class clz,Object... args) { BeanPropRowMap mp=new BeanPropRowMap(clz); mp.setPrimitivesDefaultedForNullValue(true); if(logquery) log.debug("查询列表SQL: " + sql + " 参数: " + Arrays.toString(args)); List ls=dbop.query(sql, args,mp); if(ls.isEmpty()) return null; return ls.iterator().next(); } public static int count(JdbcOperations dbop, String sql,Object... args) { sql = "select count(1) from ("+sql+")"; if(logquery) log.debug("查询列表SQL: " + sql + " 参数: " + Arrays.toString(args)); return (Integer)DBUtil.getSimpleObj(dbop, sql, Integer.class,args); } public static Object getSimpleObj(JdbcOperations dbop, String sql,Class clz,Object... args) { if(logquery) log.debug("查询列表SQL: " + sql + " 参数: " + Arrays.toString(args)); List ls=dbop.queryForList(sql, args,clz); if(ls.isEmpty()) return null; return ls.iterator().next(); } public static List search(boolean isOrcl,boolean underscore,JdbcOperations dbop,String tab,int start,int size,int flag,Object startObj,Object endObj,Class clz,String...ranges) { ArrayList ls=new ArrayList(); String sql = createCondSqlEx(underscore,clz, startObj,endObj, ls, flag, ranges); return getPage(isOrcl,dbop, "select * from "+tab+sql, clz, start, size, ls.toArray()); } public static long count(boolean underscore,JdbcOperations dbop,String tab,int flag,Object startObj,Object endObj,Class clz,String...ranges) { ArrayList ls=new ArrayList(); String sql = createCondSqlEx(underscore,clz, startObj,endObj, ls, flag, ranges); Long lv=(Long) getSimpleObj(dbop, "select count(*) from "+tab+sql, Long.class, ls.toArray()); return lv.longValue(); } //args: name1 value1 name2 value2..... public static Object findObj(JdbcOperations dbop,String tab,Class clz,String...args) { ArrayList ls=new ArrayList(); String sql = createCondSql(ls, 0, args); return getObj(dbop, "select * from "+tab+sql, clz, ls.toArray()); } //args: name1 value1 name2 value2..... public static Object findList(JdbcOperations dbop,String tab,Class clz,String...args) { ArrayList ls=new ArrayList(); String sql = createCondSql(ls, 0, args); return getList(dbop, "select * from "+tab+sql, clz, ls.toArray()); } public static Object findObj(boolean underscore,JdbcOperations dbop,String tab,Object obj,Class clz,String...keys) { ArrayList ls=new ArrayList(); String sql = createCondSql(underscore, obj, ls, 0, keys); return getObj(dbop, "select * from "+tab+sql, clz, ls.toArray()); } public static int deleteObj(JdbcOperations dbop,String tab,Object obj,String...keys){ ArrayList ls=new ArrayList(); String sql = createDeleteSql(false,tab,obj,ls,keys); return DBUtil.updateEx(dbop, sql, ls.toArray()); } public static int deleteObj(boolean underscore,JdbcOperations dbop,String tab,Object obj,String...keys){ ArrayList ls=new ArrayList(); String sql = createDeleteSql(underscore,tab,obj,ls,keys); return DBUtil.updateEx(dbop, sql, ls.toArray()); } public static String createDeleteSql(boolean underscore,String tab,Object o,List ls,String... keys) { StringBuilder sql=new StringBuilder(); sql.append("delete from ").append(tab); sql.append(createCondSql(underscore, o, ls, 0, keys)); return sql.toString(); } public static int delete(JdbcOperations dbop,String sql,Object...args){ return DBUtil.updateEx(dbop, sql, args); } public static int[] insertObjs(DataSource ds, String tab,Object... args) { return insertObjs(false, ds, tab, args); } public static int[] insertObjs(boolean undercore,DataSource ds, String tab,Object... args) { BatchSqlUpdate bsu; DBUtil dbu=new DBUtil(); List<Integer> vt=new Vector<Integer>(); dbu.init(args[0].getClass(), null); String sql=dbu.buildInsert(undercore,tab,vt); Integer[] ivt=new Integer[vt.size()]; bsu=new BatchSqlUpdate(ds,sql,ArrayUtils.toPrimitive(vt.toArray(ivt))); for(Object o:args) { bsu.update(dbu.buildParam(undercore,o).toArray()); } return bsu.flush(); } public static KeyHolder insertObj(JdbcOperations dbop,String tab,Object o,String...retCol) { return insertObj(false, dbop, tab, o, retCol); } public static KeyHolder insertObjEx(boolean undercore,JdbcOperations dbop,String tab,Class clz,Object o,String...retCol) { String sql; ArrayList ls=new ArrayList(); sql=DBUtil.createInsertSql(undercore,tab,clz,o, ls, 0); return DBUtil.update(dbop, sql, ls.toArray(), retCol); } public static KeyHolder insertObj(boolean undercore,JdbcOperations dbop,String tab,Object o,String...retCol) { return insertObjEx(undercore, dbop, tab, o.getClass(), o, retCol); } public static int insertObj(JdbcOperations dbop,String tab,Object o) { return insertObj(false, dbop, tab, o); } public static int insertObjEx(boolean undercore,JdbcOperations dbop,String tab,Class clz,Object o) { String sql; ArrayList ls=new ArrayList(); sql=DBUtil.createInsertSql(undercore,tab,clz,o, ls, 1); return DBUtil.updateEx(dbop, sql, ls.toArray()); } public static int insertObj(boolean undercore,JdbcOperations dbop,String tab,Object o) { return insertObjEx(undercore,dbop,tab,o.getClass(),o); } private static Log log=LogFactory.getLog(DBUtil.class); private static boolean logupdate=true; private static boolean logquery=true; /** * 初始化日志记录器 * @param logu * @param logq * @param needFilter */ public static void initlog(boolean logu,boolean logq) { logupdate=logu; logquery=logq; } public void init(Class clz,String[] k) { pdas=BeanTools.getPDs(clz); keys=k; } public Vector buildParam(Object o) { return buildParam(false, o); } //把属性生成数组 public Vector buildParam(boolean underscore,Object o) { Vector ls=new Vector(); List kval=null; if(keys!=null) { kval=new LinkedList(); } for(PropertyDescriptor pd:pdas) { String colName=pd.getName(); if(pd.getName().equals("class")) continue; if(underscore) colName=underscoreName(colName); Object val=BeanTools.readProp(o,pd.getReadMethod()); if(keys!=null) { for(String kname:keys) { if(kname.equalsIgnoreCase(colName)) { kval.add(val); break; } } } ls.add(val); } if(kval!=null) ls.addAll(kval); return ls; } public String buildInsert(String tab,List ls) { return buildInsert(false, tab, ls); } public String buildInsert(boolean underscore,String tab,List ls) { int i,num=0; StringBuilder sql=new StringBuilder(); sql.append("insert into ").append(tab).append("("); for(PropertyDescriptor pd:pdas) { String colName=pd.getName(); if(pd.getName().equals("class")) continue; if(underscore) colName=underscoreName(colName); ls.add(new Integer(StatementCreatorUtils.javaTypeToSqlParameterType(pd.getPropertyType()))); sql.append(colName).append(","); num++; } sql.setCharAt(sql.length()-1,')'); sql.append(" values ("); for(i=0;i<num;++i) sql.append("?,"); sql.setCharAt(sql.length()-1,')'); return sql.toString(); } public String buildUpdate(boolean underscore,String tab,List ls) { List kvl=null; StringBuilder where=null; StringBuilder sql=new StringBuilder(); sql.append("update ").append(tab).append(" set "); if(keys!=null) { where=new StringBuilder(); where.append("where "); kvl=new Vector(); } for(PropertyDescriptor pd:pdas) { String colName=pd.getName(); if(pd.getName().equals("class")) continue; if(underscore) colName=underscoreName(colName); if(keys!=null) { for(String kname:keys) { if(kname.equalsIgnoreCase(colName)) { kvl.add(StatementCreatorUtils.javaTypeToSqlParameterType(pd.getPropertyType())); where.append(kname).append("=? and "); } } } ls.add(StatementCreatorUtils.javaTypeToSqlParameterType(pd.getPropertyType())); sql.append(colName).append("=?,"); } sql.setCharAt(sql.length()-1,' '); if(where!=null&&where.length()>5) { where.delete(where.length()-3, where.length()); sql.append(where); } if(kvl!=null) ls.addAll(kvl); return sql.toString(); } public static String createUpdateSql(String tab,Object o,List ls,int flag,String... keys) { return createUpdateSql(tab,o.getClass(),ls,flag,keys); } protected static boolean appendCond(StringBuilder where,String colName,Object val,List lsv,String...keys) { if(keys==null) return false; if(Auxs.indexOfIg(keys, colName)==-1) return false; if(val!=null) { where.append(colName).append("=? and "); lsv.add(val); } else { where.append(colName).append("is null and "); } return true; } /** * @param underscore * @param tab * @param clzz * @param o * @param ls * @param flag * @param keys * @return */ public static String createUpdateSql(boolean underscore,String tab,Class clzz,Object o,List ls,int flag,String... keys) { List kval=null; StringBuilder where=null; StringBuilder sql=new StringBuilder(); if(clzz==null) clzz=o.getClass(); PropertyDescriptor pda[]=BeanTools.getPDs(clzz); sql.append("update ").append(tab).append(" set "); if(keys!=null) { kval=new LinkedList(); where=new StringBuilder(); where.append("where "); } for(PropertyDescriptor pd:pda) { boolean isTemp=false; //使用了@Temporary注解的方法,则不需参与数据库操作 Annotation[] annotations = pd.getReadMethod().getDeclaredAnnotations(); if(annotations!=null){ for(Annotation an:annotations){ if(an.annotationType()==Temporary.class){ isTemp=true; } } } if(!isTemp){ String methodName=pd.getReadMethod().getName(); if(methodName.startsWith("get")){ String colName=pd.getName(); if(pd.getName().equals("class")) continue; if(underscore) colName=underscoreName(colName); Object val=BeanTools.readProp(o,pd.getReadMethod()); if(appendCond(where,colName,val,kval,keys)) continue; if(checkVal(val,flag)) continue; sql.append(colName).append("=?,"); ls.add(val); } } } sql.setCharAt(sql.length()-1,' '); if(where!=null&&where.length()>5) { where.delete(where.length()-4, where.length()); sql.append(where); } if(kval!=null) ls.addAll(kval); return sql.toString(); } public static String createInsertSql(String tab,Object o,List ls,int flag) { return createInsertSql(false,tab,o.getClass(),o,ls,flag); } public static String createInsertSql(boolean undercore,String tab,Object o,List ls,int flag) { return createInsertSql(undercore,tab,o.getClass(),o,ls,flag); } public static String underscoreName(String name) { return Auxs.underscoreName(name); } public static String createInsertSql(boolean underscore,String tab,Class clz,Object o,List ls,int flag) { int i,num=0; StringBuilder sql=new StringBuilder(); sql.append("insert into ").append(tab).append("("); if(clz==null) clz=o.getClass(); PropertyDescriptor pda[]=BeanTools.getPDs(clz); for(PropertyDescriptor pd:pda) { String methodname=pd.getReadMethod().getName(); if(methodname.startsWith("get")){ String colName=pd.getName(); if(pd.getName().equals("class")) continue; if(underscore) colName=underscoreName(colName); Object val=BeanTools.readProp(o,pd.getReadMethod()); if(checkVal(val,flag)) continue; sql.append(colName).append(","); num++; ls.add(val); } } sql.setCharAt(sql.length()-1,')'); sql.append(" values ("); for(i=0;i<num;++i) sql.append("?,"); sql.setCharAt(sql.length()-1,')'); return sql.toString(); } public static String getSeq(JdbcOperations dbop,String seqname) { String sql="select "+seqname+".nextval from dual"; return (String) getSimpleObj(dbop, sql,String.class); } public static String buildID(JdbcOperations dbop,String seqname,int len) { String seq=getSeq(dbop,seqname); if(seq.length()>len) return StringUtils.right(seq, len); else return StringUtils.leftPad(seq, len,'0'); } public static String createCondSqlEx(boolean underscore,Class clz,Object startObj,Object endObj,List ls,int flag,String... ranges) { StringBuilder where=null; PropertyDescriptor pda[]=BeanTools.getPDs(clz); where=new StringBuilder(); where.append(" where "); for(PropertyDescriptor pd:pda) { boolean isRange; Object valEnd; Object valStart; String colName; colName=pd.getName(); if(pd.getName().equals("class")) continue; valStart=null; valEnd=null; if(underscore) colName=underscoreName(colName); if(startObj!=null) valStart=BeanTools.readProp(startObj,pd.getReadMethod()); isRange=Auxs.indexOfIg(ranges,colName)!=-1; if(isRange) { valEnd=BeanTools.readProp(endObj,pd.getReadMethod()); if(valStart!=null&&!checkVal(valStart, flag)) { ls.add(valStart); where.append(colName).append(">=? and "); } if(valEnd!=null&&!checkVal(valEnd, flag)) { ls.add(valStart); where.append(colName).append("<? and "); } } else { if(valStart!=null&&!checkVal(valStart, flag)) { ls.add(valStart); where.append(colName).append("=? and "); } } } if(where.length()>7) where.delete(where.length()-4, where.length()); else where.delete(0,where.length()); return where==null?"":where.toString(); } public static String createCondSql(boolean underscore,Object o,List ls,int flag,String... keys) { StringBuilder where=null; PropertyDescriptor pda[]=BeanTools.getPDs(o.getClass()); if(keys==null) return ""; where=new StringBuilder(); where.append(" where "); for(PropertyDescriptor pd:pda) { String colName=pd.getName(); if(pd.getName().equals("class")) continue; if(underscore) colName=underscoreName(colName); Object val=BeanTools.readProp(o,pd.getReadMethod()); appendCond(where, colName, val, ls, keys); } if(where!=null&&where.length()>5) { where.delete(where.length()-4, where.length()); } return where.toString(); } public static String createCondSql(List ls,int flag,String... args) { StringBuilder where=null; where=new StringBuilder(); where.append(" where "); int i; for(i=0;i<args.length/2;i++) { where.append(args[i*2]).append("=? and"); ls.add(args[i*2+1]); } if(where!=null&&where.length()>8) { where.delete(where.length()-4, where.length()); } return where.toString(); } public static boolean checkVal(Object val,int flag) { if(flag == 10){ flag = 16; } if((flag&IG_NULL)==IG_NULL&&(val==null||val.toString().equals(""))) return true; else if((flag&IG_NULLNOTBLANK)==IG_NULLNOTBLANK&&val==null) return true; else if((flag&IG_ZERO)==IG_ZERO&&val!=null&&val.toString().equals("0")) return true; else if((flag&IG_ONEn)==IG_ONEn&&val!=null&&val.toString().equals("-1")) return true; else if((flag&IG_MIN)==IG_MIN&&val!=null&&val.equals(BeanTools.getMin(val.getClass()))) return true; return false; } private PropertyDescriptor[] pdas; private String[] keys; public static int IG_NULL=1; //忽略null和空字符串 public static int IG_ZERO=2; //忽略0 public static int IG_ONEn=4; //忽略-1 public static int IG_MIN=8; //忽略该类型最小的 public static int IG_NULLNOTBLANK=16; //忽略null但不忽略空字符串 public static String getTableName(Object obj) throws AIPGException { if(obj==null) return null; return getTableNameEx(obj.getClass()); } public static String getTableNameEx(Class clz) throws AIPGException { if(DBUtil.tableNameMap.containsKey(clz)) return (String)DBUtil.tableNameMap.get(clz); else{ try{ Field tnField = clz.getDeclaredField("TABLE_NAME"); String name = tnField.get(clz).toString(); tableNameMap.put(clz, name); return name; } catch(NoSuchFieldException ex){ log.error("找不到对象的pojo类的表名属性:"+clz.getName(),ex); AIPGException.throwExcp(CoreConstans.EXCEPTON_01, "找不到对象的pojo类的表名属性:"+clz.getName()); } catch(IllegalAccessException ex){ log.error("无法获取对象的pojo类的表名属性:"+clz.getName(),ex); AIPGException.throwExcp(CoreConstans.EXCEPTON_01, "无法获取对象的pojo类的表名属性:"+clz.getName()); } } return null; } /** * 获取表别名 * @param clz * @return * @throws AIPGException */ public static String getTableAlis(Class clz) throws AIPGException { if(DBUtil.tableAlisMap.containsKey(clz)) return (String)DBUtil.tableAlisMap.get(clz); else{ try{ Field tnField = clz.getDeclaredField("TABLE_ALIAS"); String name = tnField.get(clz).toString(); tableAlisMap.put(clz, name); return name; } catch(NoSuchFieldException ex){ log.error("找不到对象的pojo类的表名属性:"+clz.getName(),ex); AIPGException.throwExcp(CoreConstans.EXCEPTON_01, "找不到对象的pojo类的表名属性:"+clz.getName()); } catch(IllegalAccessException ex){ log.error("无法获取对象的pojo类的表名属性:"+clz.getName(),ex); AIPGException.throwExcp(CoreConstans.EXCEPTON_01, "无法获取对象的pojo类的表名属性:"+clz.getName()); } } return null; } public static String getTableName(Class c){ if(c==null) return null; if(DBUtil.tableNameMap.containsKey(c)) return (String)DBUtil.tableNameMap.get(c); else{ try{ Field tnField = c.getDeclaredField("TABLE_NAME"); String name = tnField.get(null).toString(); tableNameMap.put(c, name); return name; } catch(NoSuchFieldException ex){ log.error("找不到对象的pojo类的表名属性:"+c.getClass().getName(),ex); return null; } catch(IllegalAccessException ex){ log.error("无法获取对象的pojo类的表名属性:"+c.getClass().getName(),ex); return null; } } } public static String getDataKeys(Object obj){ if(obj==null) return null; try{ Method method = obj.getClass().getDeclaredMethod("toDataKeys"); return (String)method.invoke(obj); } catch(NoSuchMethodException ex){ log.error("找不到对象的pojo类的toDataKeys方法:"+obj.getClass().getName(),ex); return null; } catch(InvocationTargetException ex){ log.error("找不到对象的pojo类的toDataKeys方法:"+obj.getClass().getName(),ex); return null; } catch(IllegalAccessException ex){ log.error("无法获取对象的pojo类的toDataKeys方法:"+obj.getClass().getName(),ex); return null; } } public static String[] getTableKeys(Object obj){ if(obj==null) return null; if(DBUtil.tableKeysMap.containsKey(obj.getClass())) return (String[])DBUtil.tableKeysMap.get(obj.getClass()); else{ try{ Field tnField = obj.getClass().getDeclaredField("TABLE_KEYS"); String[] keys = (String[])tnField.get(obj); if(keys!=null&&keys.length>0) tableKeysMap.put(obj.getClass(), keys); return keys; } catch(NoSuchFieldException ex){ log.error("找不到对象的pojo类的表名属性:"+obj.getClass().getName(),ex); return null; } catch(IllegalAccessException ex){ log.error("无法获取对象的pojo类的表名属性:"+obj.getClass().getName(),ex); return null; } } } /** * 别名.字段 * @param fieldName * @return * @throws AIPGException */ public static String getTableCln(Class clz,String fieldName) throws AIPGException{ if(clz!=null){ return DBUtil.getTableAlis(clz)+"."+fieldName; }else{ return fieldName; } } }