最近几天以来,我一直在更新旧版代码。
说明: 有一个表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()'
中实现相同目标。
任何建议将不胜感激。如果需要进一步改进说明。请让我知道。
答案 0 :(得分:0)
我认为创建动态SQL查询违反Spring Batch的本质。那是因为PreparedStatement本质(请在此处更多:What does it mean when I say Prepared statement is pre-compiled?)。长话短说-PreparedStatement是在DB端编译的,它们确实非常快。如果您修改SQL查询,则无法重复使用。在不了解实际数据库模式的情况下很难给出建议,但是通常您应该为CUSTOMER表创建一个POJO(我希望您没有BLOBS),并且应该读写所有字段。它将比“优化”动态查询更快。