通过反射读取数据库

1.查询数据库
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;
	}

}

猜你喜欢

转载自lin358.iteye.com/blog/2382283