泛型不支持 用《T》代替了
方法一
public static 《T》 List《T》 query(String sql, Class《T》 clazz)
{
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
Object tempStr = null;
List《T》 list = new ArrayList《T》();
try {
conn = DBConnectUtils.getConnection();
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while (rs.next()) {
// newInstance实际上是把new这个方式分解为两步,即,首先调用class的加载方法加载某个类,然后实例化。
// 我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了我们降耦的手段。
// newInstance: 弱类型。低效率。只能调用无参构造。
// new: 强类型。相对高效。能调用任何public构造。
T obj = clazz.newInstance();
if (obj instanceof String) {
// ResultSet的下标从1开始
obj = (T) rs.getString(1);
} else {
// Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限
// getDeclaredFields()返回Class中所有的字段,包括私有字段
// getFields 只返回公共字段,即有public修饰的字段
// field,域是一种属性,可以是一个类变量,一个对象变量,一个对象方法变量或者是一个函数的参数。
Field[] fields = obj.getClass().getDeclaredFields();
// 遍历域
for (Field field : fields) {
try {
// 反射获取对象成员的字段值
tempStr = rs.getObject(field.getName());
} catch (SQLException e) {
tempStr = "";
}
// 置是否允许访问,而不是修改原来的访问权限修饰词
field.setAccessible(true);
// 把对象的属性数据封装到对象中
BeanUtils.setProperty(obj, field.getName(), tempStr);
}
}
list.add(obj);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBCloseUtils.closeCSR(conn, pstmt, rs);
}
return list;
}
方法二
public static 《T》 List《T》 query(String sql, Class《T》 clazz,
Object[] parameters) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
ResultSetMetaData metaData = null;
List《T》 list = new ArrayList《T》();
int index = 1;
try {
pstmt = conn.prepareStatement(sql);
if (parameters != null && parameters.length != 0) {
for (int i = 0; i < parameters.length; i++) {
// pstmt.setObject(第几个参数, 替换成什么);
pstmt.setObject(index, parameters[i]);
}
}
rs = pstmt.executeQuery(sql);
// 封装resultset
metaData = rs.getMetaData();
// 取出列的信息
int columnLength = metaData.getColumnCount();
// 获取列数
while (rs.next()) {
// 通过反射机制创建一个对象
T result = clazz.newInstance();
for (int i = 0; i < columnLength; i++) {
String metaDataKey = metaData.getColumnName(i + 1);
Object resultsetValue = rs.getObject(metaDataKey);
if (resultsetValue == null) {
resultsetValue = "";
}
Field field = clazz.getDeclaredField(metaDataKey);
field.setAccessible(true);
field.set(result, resultsetValue);
}
list.add(result);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBCloseUtils.closeCSR(conn, pstmt, rs);
}
return list;
}