+-

有什么办法可以从jdbctemplate查询方法中获取结果集对象吗?
我有一个代码
List<ResultSet> rsList = template.query(finalQuery, new RowMapper<ResultSet>() {
public ResultSet mapRow(ResultSet rs, int rowNum) throws SQLException {
return rs;
}
}
);
我想执行存储在finalQuery String中的sql语句并获取结果集.该查询是6到7个表的复杂连接,我从每个表中选择4-5列,并希望获取这些列的元数据,以将数据类型和数据转换为下游系统.
如果它是一个简单的查询,我只能获取一个表格,我可以使用RowMapper#mapRow,在maprow方法中我可以调用ResultsetExtractor.extractData来获取结果列表;但在这种情况下,我的查询中有复杂的连接,我正在尝试获取结果集对象和结果集元数据…
上面的代码不好,因为对于每个结果它将返回相同的结果集对象,我不想将它们存储在列表中…
如果我的查询中的每个结果都调用了maprow,那么JDBCTemplate会关闭rs和连接,即使我的列表引用了RS对象吗?
有没有像jdbcTemplate.queryForResultSet(sql)这样的简单方法?
现在我已经实现了自己的ResultSet Extractor来处理数据并将数据插入下游系统
sourceJdbcTemplate.query(finalQuery, new CustomResultSetProcessor(targetTable, targetJdbcTemplate));
这个CustomResultSetProcessor实现了ResultSetExtractor,在extractData方法中我调用了3个不同的方法,1是通过运行获取ColumnTypes形式的rs.getMetaData(),第二个是运行目标元数据的getColumnTypes
SELECT NAME, COLTYPE, TBNAME FROM SYSIBM.SYSCOLUMNS WHERE TBNAME ='TABLENAME' AND TABCREATOR='TABLE CREATOR'
在第三种方法中,我正在构建目标columntypes的insert语句(准备好),最后使用
new BatchPreparedStatementSetter()
{
@Override
public void setValues(PreparedStatement insertStmt, int i) throws SQLException{} }
希望这对其他人有帮助……
最佳答案
请注意,Spring JDBC Template的重点在于它在执行回调方法后会自动关闭所有资源,包括ResultSet.因此,最好在回调方法中提取必要的数据,并允许Spring在它之后关闭ResultSet.
如果数据提取的结果不是List,则可以使用ResultSetExtractor而不是RowMapper:
SomeComplexResult r = template.query(finalQuery,
new ResultSetExtractor<SomeComplexResult>() {
public SomeResult extractData(ResultSet) {
// do complex processing of ResultSet and return its result as SomeComplexResult
}
});
点击查看更多相关文章
转载注明原文:Spring JDBCTemplate查询方法的结果集元数据 - 乐贴网