繁体   English   中英

使用spring“ jdbcTemplate.batchUpdate”进行动态插入查询的批处理

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM