Spring JDBCTemplate查询方法的结果集元数据

Spring JDBCTemplate查询方法的结果集元数据,spring,metadata,resultset,jdbctemplate,Spring,Metadata,Resultset,Jdbctemplate,是否有任何方法可以从jdbctemplate查询方法中获取resultset对象 我有一个类似的代码 List<ResultSet> rsList = template.query(finalQuery, new RowMapper<ResultSet>() { public ResultSet mapRow(ResultSet rs, int rowNum) throws SQLException { return rs;

是否有任何方法可以从jdbctemplate查询方法中获取resultset对象

我有一个类似的代码

List<ResultSet> rsList = template.query(finalQuery, new RowMapper<ResultSet>() {
        public ResultSet mapRow(ResultSet rs, int rowNum) throws SQLException {
            return rs;
        }
        }
        );
这个CustomResultSetProcessor实现ResultSetTextRactor,在extractData方法中,我调用了3个不同的方法1是从rs.getMetaData()获取ColumnTypes,第二是通过运行

SELECT NAME, COLTYPE, TBNAME FROM SYSIBM.SYSCOLUMNS WHERE TBNAME ='TABLENAME' AND TABCREATOR='TABLE CREATOR'
在第三种方法中,我构建了insert语句(准备好的)表单目标columntypes,并最终使用

new BatchPreparedStatementSetter()
    {
        @Override
        public void setValues(PreparedStatement insertStmt, int i) throws SQLException{} }

希望这对其他人有所帮助。

请注意,SpringJDBC模板的整个要点是,它在执行回调方法后自动关闭所有资源,包括
ResultSet
。因此,最好在回调方法中提取必要的数据,并允许Spring在回调后关闭
ResultSet

如果数据提取的结果不是
列表
,则可以使用
ResultSetExtractor
而不是
行映射器

SomeComplexResult r = template.query(finalQuery, 
    new ResultSetExtractor<SomeComplexResult>() {
        public SomeResult extractData(ResultSet) {
            // do complex processing of ResultSet and return its result as SomeComplexResult
        }
    });
SomeComplexResult r=template.query(finalQuery,
新的resultSetTextRactor(){
公共结果提取数据(结果集){
//对ResultSet进行复杂处理,并将其结果作为SomeComplexResult返回
}
});

类似的方法也可以:

Connection con = DataSourceUtils.getConnection(dataSource); // your datasource
Statement s = con.createStatement();

ResultSet rs = s.executeQuery(query); // your query
ResultSetMetaData rsmd = rs.getMetaData();
尽管我同意#axtavt的观点,即在Spring环境中首选ResultSetTextRactor,但它确实迫使您执行查询

下面的代码不要求您这样做,因此不需要客户端代码来提供查询参数的实际参数:

public SomeResult getMetadata(String querySql) throws SQLException {
    Assert.hasText(querySql);

    DataSource ds = jdbcTemplate.getDataSource();
    Connection con = null;
    PreparedStatement ps = null;
    try {
        con = DataSourceUtils.getConnection(ds);
        ps = con.prepareStatement(querySql);
        ResultSetMetaData md = ps.getMetaData();   //<-- the query is compiled, but not executed
        return processMetadata(md);
    } finally {
        JdbcUtils.closeStatement(ps);
        DataSourceUtils.releaseConnection(con, ds);
    }
}
public SomeResult getMetadata(字符串querySql)抛出SQLException{
Assert.hasText(querySql);
DataSource ds=jdbcTemplate.getDataSource();
连接con=null;
PreparedStatement ps=null;
试一试{
con=DataSourceUtils.getConnection(ds);
ps=合同准备声明(querySql);

ResultSetMetaData md=ps.getMetaData();//在我的例子中,finalQuery每次都是动态的,我需要执行26个这样复杂的查询。因此,我无法将所有查询结果映射到某个ComplexResult以返回它。我可以映射和转换extractData中的数据和数据类型,但一旦提取,我需要将其插入下游系统中的其他目标数据库。我上面的解决方案对我不起作用。如果我喜欢下面的方法,这是一个好主意吗?
code
try{con=jdbctempatte.getDataSource().getConnection();con.createStatement();rs=st.executeQuery(finalQuery);rsmd=rs.getMetadata();
code
我不知道我是否得到了连接表单模板,是否得到了我想要的并关闭了资源,不确定这是否是一个好主意……请help@sanumala:关键是您不需要返回任何内容-您可以在回调方法中实现需要访问
ResultSet
的逻辑。@axtavt是否有我可以返回一个
Map
。如果我想处理表中的所有条目,但我的表包含2000多万行,该怎么办?我使用spring JdbcTempate
public SomeResult getMetadata(String querySql) throws SQLException {
    Assert.hasText(querySql);

    DataSource ds = jdbcTemplate.getDataSource();
    Connection con = null;
    PreparedStatement ps = null;
    try {
        con = DataSourceUtils.getConnection(ds);
        ps = con.prepareStatement(querySql);
        ResultSetMetaData md = ps.getMetaData();   //<-- the query is compiled, but not executed
        return processMetadata(md);
    } finally {
        JdbcUtils.closeStatement(ps);
        DataSourceUtils.releaseConnection(con, ds);
    }
}