public <T> List<T> Select(String sql, Class<T> mode){ List<T> reList = new ArrayList<T>(); T reT = null; ResultSet rs = null; ResultSetMetaData rsd; try { rs = this.conn.createStatement().executeQuery(sql); int columnCount = 0; while(rs.next()){ Map<String, Object> map = new HashMap<String, Object>(); rsd = rs.getMetaData(); columnCount = rsd.getColumnCount(); for (int i = 1; i <= columnCount; i++) { map.put(rsd.getColumnName(i), rs.getObject(i)); } reT = mode.newInstance(); for(Map.Entry<String, Object> ent:map.entrySet()){ ReflectionUtils.setFieldValue(reT, ent.getKey(), ent.getValue()); } reList.add(reT); } } catch (Exception e) { e.printStackTrace(); } finally{ if(rs!=null){ try { rs.close(); } catch (SQLException e) { } } } return reList; }
2.通过反射取值(核心代码)
/** * 直接设置对象属性值, 忽略 private/protected 修饰符, 也不经过 setter * * @param object * @param fieldName * @param value */ public static void setFieldValue(Object object, String fieldName, Object value) { Field field = getDeclaredField(object, fieldName); if (field != null) { makeAccessible(field); try { field.set(object, value); } catch (Exception e) { } } } /** * 使 filed 变为可访问 * * @param field */ public static void makeAccessible(Field field) { if (!Modifier.isPublic(field.getModifiers())) { field.setAccessible(true); } } /** * 循环向上转型, 获取对象的 DeclaredField * * @param object * @param filedName * @return */ public static Field getDeclaredField(Object object, String filedName) { for (Class<?> superClass = object.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) { try { return superClass.getDeclaredField(filedName); } catch (NoSuchFieldException e) { // Field 不在当前类定义, 继续向上转型 } } return null; }
3.调用示例
List<Mode> modeList = (List<Mode>) oracleAPI.Select(sql, Mode.class);
4.模型
package Modes; public class Mode { private String NAME; private BigDecimal ID; //数字要用这个 int无法赋值 oracle number字段 public void setNAME(String NAME) { NAME= NAME; } public String getNAME() { return NAME; } public void setID(BigDecimal ID) { ID= ID; } public String getID() { return ID; } }