Spring JDBCTemplate查询方法的结果集元数据
是否有任何方法可以从jdbctemplate查询方法中获取resultset对象 我有一个类似的代码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;
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);
}
}