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