簡體   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