+-
Spring JDBCTemplate查询方法的结果集元数据
有什么办法可以从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查询方法的结果集元数据 - 乐贴网