JdbcTemplate多个结果集
我试图找到一种简单的方法来处理Stored Procedures / SQL返回多个结果集。 我一直在使用SimpleJdbcOperations#queryForList()
方法,但是这只会将第一个结果集作为List<Map>
。 我需要能够获得多个结果集,理想情况下是List<Map>
的Collection
。 我写的程序是一个中间件组件,所以我不知道SQL将是什么,或结果集的forms。
我想我必须使用JdbcOperations
类,它允许我访问更多方法,包括execute(CallableStatementCreator csc, CallableStatementCallback action)
但现在我被卡住了。
CallableStatementCallback callback = new CallableStatementCallback() { @Override public T doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { boolean results = cs.execute(request); while(results) { ResultSet result = cs.getResultSet(); results = cs.getMoreResults(); } return null; } };
我不确定如何使用该方法,或者如何处理ResultSet
以获取我的通用List<Map>
。
我设法使用此代码获取Set
,
private Set executeProcedure(final String sql) { return jdbc.execute(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection con) throws SQLException { return con.prepareCall(sql); } }, new CallableStatementCallback>() { @Override public Set doInCallableStatement(CallableStatement cs) throws SQLException { Set results = new HashSet<>(); boolean resultsAvailable = cs.execute(); while (resultsAvailable) { results.add(cs.getResultSet()); resultsAvailable = cs.getMoreResults(); } return results; } }); }
只是看看将ResultSet
转换为List
。
您可以使用resultSet.getMetaData()方法计算出数据中的列:
ResultSetMetaData meta = resultSet.getMetaData(); int colcount = meta.getColumnCount(); for (int i = 1; i <= colcount; i++) { String name = meta.getColumnLabel(i); // This is the name of the column int type = meta.getColumnType(i); // from java.sql.Types // Maybe add to a Map,List, etc... }
然后,您可以像其他评论员所提到的那样,通过ResultSet循环,提取您需要的数据:
while (resultSet.hasNext()) { resultSet.next(); // Find the columns you want to extract (via the above method maybe) and add to your row. }
我使用下面的方法以List
forms获取ResultSet的List
public List>> executeProcedure(final String sql) { return jdbcTemplate.execute(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection con) throws SQLException { return con.prepareCall(sql); } }, new CallableStatementCallback>>>() { @Override public List>> doInCallableStatement(CallableStatement cs) throws SQLException { boolean resultsAvailable = cs.execute(); List>> list = new ArrayList>>(); while (resultsAvailable) { ResultSet resultSet = cs.getResultSet(); List