如何修改Java的getResultInMapList方法以传入SQL查询结果作为参数?
解决方案
方案一:不修改原方法,先执行SQL获取参数再传入(推荐,兼容旧代码)
先新增一个工具方法,专门执行参数SQL并提取需要的参数值,再调用原方法:
- 新增工具方法提取参数
// 执行指定SQL,返回结果第一列的所有值作为参数数组 private static Object[] getParamsFromQuery(String url, String driver, String user, String pwd, String sql) throws SQLException, IOException { try { createConn(url, driver, user, pwd); // 使用ColumnListHandler获取查询结果的第一列数据 List<Object> paramsList = run.query(conn, sql, new ColumnListHandler()); return paramsList.toArray(); } catch (SQLException se) { se.printStackTrace(); return new Object[0]; } finally { closeConn(); } }
注:如果需要提取其他列或特定格式的参数,可替换ColumnListHandler为MapListHandler后自行解析结果
- 调用原方法时先获取参数
// 先执行sqlQuery2拿到参数数组 Object[] queryParams = getParamsFromQuery(urlString, driverr, usernameString, password, sqlQuery2); // 传入原方法执行主查询 List<Map<String, Object>> resultSet = getResultInMapList(urlString, driverr, usernameString, password, sqlQuery, queryParams);
方案二:重载方法,支持直接传入参数SQL
新增一个重载方法,内部自动执行参数SQL并调用原方法,让调用更简洁:
// 新增重载方法,接受参数SQL作为输入 public static List<Map<String, Object>> getResultInMapList(String urlString, String driverr, String usernameString, String password, String sqlQuery, String paramSql) throws SQLException, IOException { // 先执行参数SQL获取参数数组 Object[] params = getParamsFromQuery(urlString, driverr, usernameString, password, paramSql); // 调用原有的可变参数方法 return getResultInMapList(urlString, driverr, usernameString, password, sqlQuery, params); } // 保留原有的可变参数方法,兼容旧调用 public static List<Map<String, Object>> getResultInMapList(String urlString, String driverr, String usernameString, String password, String sqlQuery, Object... params) throws SQLException, IOException { try { createConn(urlString, driverr, usernameString, password); // 修正判断逻辑:不传参数时params是空数组而非null if (params == null || params.length == 0) { return run.query(conn, sqlQuery, new MapListHandler()); } else { return run.query(conn, sqlQuery, new MapListHandler(), params); } } catch (SQLException se) { se.printStackTrace(); return null; } finally { closeConn(); } } // 工具方法同上 private static Object[] getParamsFromQuery(String url, String driver, String user, String pwd, String sql) throws SQLException, IOException { try { createConn(url, driver, user, pwd); List<Object> paramsList = run.query(conn, sql, new ColumnListHandler()); return paramsList.toArray(); } catch (SQLException se) { se.printStackTrace(); return new Object[0]; } finally { closeConn(); } }
此时你就可以用期望的方式调用:
List<Map<String, Object>> resultSet = getResultInMapList(urlString, driverr, usernameString, password, sqlQuery, sqlQuery2);
注意事项
- 原方法中
params == null的判断存在逻辑漏洞:当不传可变参数时,params是空数组而非null,建议修正为params == null || params.length == 0 - 如果参数SQL返回多行多列数据,需根据主查询的参数要求,明确提取对应字段的值(比如只取
name列) - 频繁创建数据库连接会影响性能,后续可考虑引入连接池优化
内容的提问来源于stack exchange,提问作者JustToKnow
相关产品推荐
相关产品推荐

