kristenlee1218 2017-03-17 03:10 采纳率: 61.3%
浏览 3907
已采纳

遍历泛型List,应该返回什么类型

泛型不支持 用《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;
}
  • 写回答

1条回答 默认 最新

  • threenewbee 2017-03-17 03:21
    关注

    不特定类型,要么做成接口,返回接口类型,要么返回object,主程序反射。也可以保留resultset之类的表形式的数据

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥20 Python安装cvxpy库出问题
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题