小编san*_*ala的帖子

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

有什么方法可以从一种jdbctemplate查询方法获取结果集对象?

我有一个类似的代码

List<ResultSet> rsList = template.query(finalQuery, new RowMapper<ResultSet>() {
        public ResultSet mapRow(ResultSet rs, int rowNum) throws SQLException {
            return rs;
        }
        }
        );
Run Code Online (Sandbox Code Playgroud)

我想执行存储在finalQuery String中的sql语句并获取结果集。该查询是对6到7个表的复杂连接,我从每个表中选择4-5列,并希望获取这些列的元数据以将数据类型和数据转换为下游系统。

如果这是一个简单的查询,并且我仅获取一张表,则可以使用RowMapper#mapRow,并且在该maprow方法中可以调用ResultsetExtractor.extractData来获取结果列表;但是在这种情况下,我的查询中有复杂的联接,并且我试图从结果集元数据中获取结果集对象...

上面的代码不是很好,因为对于每个结果,它将返回相同的结果集对象,并且我不想将它们存储在列表中。

再说一遍,如果我查询的每个结果都调用maprow,即使我的列表引用了RS对象,JDBCTemplate也会关闭rs和连接吗?

有没有像jdbcTemplate.queryForResultSet(sql)这样的简单方法?

现在,我已经实现了自己的ResultSet Extractor来处理数据并将其插入下游系统

sourceJdbcTemplate.query(finalQuery, new CustomResultSetProcessor(targetTable, targetJdbcTemplate));
Run Code Online (Sandbox Code Playgroud)

此CustomResultSetProcessor实现ResultSetExtractor,在extractData方法中,我调用了3种不同的方法:1是通过运行rs.getMetaData()获取ColumnTypes,第二是通过运行目标元数据的getColumnTypes

SELECT NAME, COLTYPE, TBNAME FROM SYSIBM.SYSCOLUMNS WHERE TBNAME ='TABLENAME' AND TABCREATOR='TABLE CREATOR'
Run Code Online (Sandbox Code Playgroud)

在第三种方法中,我正在构建(准备好的)从目标列类型形成的insert语句,最后使用

new BatchPreparedStatementSetter()
    {
        @Override
        public void setValues(PreparedStatement insertStmt, int i) throws SQLException{} }
Run Code Online (Sandbox Code Playgroud)

希望这对其他人有帮助...

spring metadata resultset jdbctemplate

5
推荐指数
2
解决办法
2万
查看次数

Spring JDBCTemplate与Plain JDBC用于插入大量记录

我们必须在多个表中插入2百万条记录,现在我们正在写入CSV文件并使用db2 import加载到数据库中.

我们想把这个逻辑改成某种JDBC.在研究多种选择时,我对Spring JDBC模板和普通JDBC感到困惑.

让我们说我想在100个表中插入100万条记录,每个表都有10万个,所有这些都是简单的JDBC语句(不准备语句,因为我不知道我在运行时处理哪个表).

无论我们选择何种系统,都需要处理多达1500万条记录以满足峰值请求.

哪个框架会更好?

spring jdbc jdbctemplate

2
推荐指数
1
解决办法
5286
查看次数

标签 统计

jdbctemplate ×2

spring ×2

jdbc ×1

metadata ×1

resultset ×1