使用spring“ jdbcTemplate.batchUpdate”

时间:2018-07-08 10:59:06

标签: java spring spring-batch batch-processing

最近几天以来,我一直在更新旧版代码。

说明: 有一个表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()'中实现相同目标。

任何建议将不胜感激。如果需要进一步改进说明。请让我知道。

1 个答案:

答案 0 :(得分:0)

我认为创建动态SQL查询违反Spring Batch的本质。那是因为PreparedStatement本质(请在此处更多:What does it mean when I say Prepared statement is pre-compiled?)。长话短说-PreparedStatement是在DB端编译的,它们确实非常快。如果您修改SQL查询,则无法重复使用。在不了解实际数据库模式的情况下很难给出建议,但是通常您应该为CUSTOMER表创建一个POJO(我希望您没有BLOBS),并且应该读写所有字段。它将比“优化”动态查询更快。