for (int i = 0; i < count; i++) {
Object value = rs.getObject(i + 1);// 获取对应列所对应的字段值
// System.out.println("对应列所对应的字段值"+value);
String colname = metaData.getColumnName(i + 1).toLowerCase();// 获取对应列名;
// System.out.println("列名:"+colname);
// oracle 不管你建表时字段是大写还是小写,它一律帮你转换成大写
// 建议所有java类的属性都小写
// ①没有对应字段;②属性为私有时获取Field用的方法不是getDeclaredField。否则会报错
Field field = clz.getDeclaredField(colname);// 通过列名获取到字段对象,就是我们所说的属性;
field.setAccessible(true);
// 此处调用了Field类的set方法,就是给封装类对象所对应的字段赋值操作,
// 这样数据表对应的封装类的对象类就有值了,相当于查询到了理想的结果。
// 判断字段的数据类型
// Oracle 中 number类型 通过ResultSet 的 getObject() 返回的是 BigDecimal 类型
if (value instanceof BigDecimal) {
// System.out.println("bigdecimal");
int num = ((BigDecimal) value).intValue();
field.set(obj, num);
} else {
field.set(obj, value);// 将指定对象变量上此 Field 对象表示的字段设置为指定的新值
}
}
// 因为考虑到查询的结果不止一条,用集合进行操作
// 然后返回该结果集对象
list.add(obj);
}
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
// 关闭资源
closeAll(conn, pstmt, rs);
}
return list;
}
/**
* 查询的通用方法 将表中的一行数据保存到一个map对象中,key为列(字段)的下标,value为该列(字段)的值 返回保存map的泛型集合
*
* @param sql 要做执行的 sql语句
* @param params SQL语句需要的参数
* @return
*/
public static List<Map> QueryByResultSet(String sql, Object[] params) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 1.获取conn
conn = getConn();
// 2.获取Statement
pstmt = conn.prepareStatement(sql);
if (params != null) {
setParams(pstmt, params);
}
// 4.执行查询,得到ResultSet
rs = pstmt.executeQuery(sql);
// 5.处理ResultSet