如何将ResultSet转换为List<Object[]>?代码实现咨询
把 ResultSet 转成 List<CSVRaportDescription[]> 的完整实现
看你的代码片段,应该是卡在了把收集到的对象列表转成数组这一步,而且还有几个需要注意的细节,我帮你补全并优化代码:
完整可运行的代码
List<CSVRaportDescription[]> result = new ArrayList<>(); List<CSVRaportDescription> csvRaportDescList = new ArrayList<>(); // 注意:这里直接用replace替换SQL参数有风险,后面会说优化方案 String sql = query.toString().replace("?", dayList.toString()); ResultSet resultSet = dataSource.executeQuery(sql); // 遍历结果集,收集CSVRaportDescription对象 resultSet.forEach(row -> { try { // 捕获SQL异常,因为lambda不能抛出检查型异常 csvRaportDescList.add(new CSVRaportDescription(row.getObject("value"))); } catch (SQLException e) { throw new RuntimeException("读取结果集行失败", e); } }); // 补全你没写完的数组转换代码 CSVRaportDescription[] csvRaportArray = csvRaportDescList.toArray(new CSVRaportDescription[0]); // 把数组加入最终结果列表 result.add(csvRaportArray);
几个关键优化点
- 补全数组转换:你之前的
toArray(new CSVRaportD...没写完,正确写法是toArray(new CSVRaportDescription[0])(Java 8+推荐这种方式,JVM会自动优化数组大小) - SQL参数安全问题:直接用
replace("?", dayList.toString())会导致两个问题:一是dayList.toString()会输出带[]的字符串,可能不符合SQL语法;二是存在SQL注入风险。建议用PreparedStatement来安全设置参数,示例如下:
// 假设你的原始SQL是类似"SELECT value FROM table WHERE day IN (?)" String originalSql = query.toString(); // 根据dayList的大小生成对应数量的占位符 String inClause = String.join(",", Collections.nCopies(dayList.size(), "?")); String safeSql = originalSql.replace("?", inClause); // 用PreparedStatement设置参数 try (Connection conn = dataSource.getConnection(); PreparedStatement stmt = conn.prepareStatement(safeSql)) { for (int i = 0; i < dayList.size(); i++) { stmt.setObject(i + 1, dayList.get(i)); } ResultSet resultSet = stmt.executeQuery(); // 后续遍历逻辑同上... } catch (SQLException e) { throw new RuntimeException("执行SQL查询失败", e); }
- 异常处理:
ResultSet的getObject方法会抛出SQLException,而forEach的lambda不能抛出检查型异常,所以需要捕获并包装成运行时异常,避免程序崩溃。
如果你的需求是转成 List<Object[]>(每行对应一个数组)
如果其实你想把结果集的每一行转成Object[]再收集到列表里,代码可以这么写:
List<Object[]> result = new ArrayList<>(); try (Connection conn = dataSource.getConnection(); PreparedStatement stmt = conn.prepareStatement(safeSql); ResultSet resultSet = stmt.executeQuery()) { ResultSetMetaData metaData = resultSet.getMetaData(); int columnCount = metaData.getColumnCount(); resultSet.forEach(row -> { try { Object[] rowArray = new Object[columnCount]; for (int i = 1; i <= columnCount; i++) { rowArray[i - 1] = row.getObject(i); } result.add(rowArray); } catch (SQLException e) { throw new RuntimeException("行转数组失败", e); } }); } catch (SQLException e) { throw new RuntimeException("处理结果集失败", e); }
内容的提问来源于stack exchange,提问作者Tom




