[英]batch processing with dynamic insert query using spring “jdbcTemplate.batchUpdate”
好吧,自最近几天以来,我一直在更新旧版代码。
说明 :有一个表CUSTOMER,其列为blah1,blah2,blah3,blah4,blah .....
根据我们的体系结构,我需要动态创建一个insert语句,该语句可以将数据插入到具有任意列数的任何表中。
当前,我们有以下代码。
public void save(Table table, Connection conn) throws Exception {
PreparedStatement pstmt = null;
try {
List<Row> rows = table.getRows();
String sql = "";
if(!rows.isEmpty() && rows != null)
{
for(Row row: rows) //READ EACH ROW
{
String columnName = ""; String columnValue = "";
List<String> params = new ArrayList<String>();
List<Column> columns = row.getColumns();
if(!columns.isEmpty() && columns != null)
{
for(Column column: columns) //GET EACH COLUMN DATA
{
columnName += ", "+column.getName();
columnValue += ", ?";
String value = column.getValue();
params.add(value); //ADD VALUE TO PARAMS
}
//INSERT QUERY
sql = "INSERT INTO "+table.getTableName()+" ("+columnName+") VALUES ("+columnValue+")";
if(pstmt == null) pstmt = conn.prepareStatement(sql);
//POPULATE PREPARED STATEMENT
for (int i =0; i<params.size(); i++) {
pstmt.setString(i+1, (String)params.get(i));
}
pstmt.addBatch();
}
}
pstmt.executeBatch();//BATCH COMMIT
conn.commit();
}
} catch (Exception e) {
if (conn != null) {
conn.rollback();
}
throw e;
}
}
现在,而不是使用典型的pstmt.executeBatch()
。 我想按如下方式使用spring批更新:
public void save(Table table, Connection conn) throws Exception{
String sql = createSaveQuery(table);//CREATES the INSERT Query
getJdbcTemplate().batchUpdate(sql.toString(), new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int j) throws SQLException {
//PROBLEM AREA: How to map this for each insert statement?
for(int i =0; i < params.size(); i++){
ps.setString(i+1, (String)params.get(i));
}
}
@Override
public int getBatchSize() {
return 0;
}
});
}
但是我不知道如何为每个插入查询设置参数。 如在中,我们可以设置pstmt.setString(i, params.get(i));
每行。 如何在'new BatchPreparedStatementSetter()'
实现相同功能。
任何建议将不胜感激。 如果需要进一步改进说明。 请告诉我。
我想创建动态SQL查询违反Spring Batch的本质。 那是因为PreparedStatement性质(在此处阅读更多: 当我说Prepared语句是预编译的时,这意味着什么? )。 长话短说-PreparedStatement是在DB端编译的,它们确实非常快。 如果您修改SQL查询,则无法重复使用。 在不了解实际数据库模式的情况下很难给出建议,但是通常您应该为CUSTOMER表创建一个POJO(我希望您没有BLOBS),并且应该读写所有字段。 它比“优化”动态查询更快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.