2012-03-02 72 views
0

我試圖在spring批處理中將參數傳遞給我的查詢。我決定創建一個tasklet和使用的JdbcTemplate如下...在彈簧批處理中使用帶有命名參數的JdbcTemplate

public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) 
     throws EpsilonBatchBusinessException { 

    LOGGER.debug("Enter execute."); 

    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 

    jdbcTemplate.query(queryString, 
     new PreparedStatementSetter() { 
      public void setValues(PreparedStatement preparedStatement) throws SQLException { 
       preparedStatement.setInt(1, runNumber); 
      } 
     }, 
     rowMapper); 

    LOGGER.debug("Exit execute."); 

    return RepeatStatus.FINISHED; 
} 

所以我注入到這個bean的數據源,的queryString,RowMapper的對象,和參數(runNumber)。這微進程將內一個名爲一步創建一個列表。我通常會將行映射器傳遞給JdbcCursorItemReader spring bean,並且不會寫入tasklet,但是我的查詢字符串需要一個參數,因此我正在編寫此tasklet。我不確定這個tasklet是否會像JdbcCursorItemReader一樣執行這個技巧?您的輸入將不勝感激

回答

1

更好的選擇是使用JdbcCursorItemReader並編寫自定義PreparedStatementSetter

PreparedStatementSetter界面很簡單;幾乎所有你需要編寫的代碼都在下面。一旦編寫了setter,你需要做的就是將其配置爲一個新的bean,在配置中注入runNumber值,然後將該bean注入JdbcCursorItemReader。這使您可以使用所有常用的ItemReaderItemWriter,而不必在Tasklet中手動執行所有操作。

package com.foo; 

import java.sql.PreparedStatement; 
import java.sql.SQLException; 

import org.springframework.jdbc.core.PreparedStatementSetter; 


public class YourParamSetter implements PreparedStatementSetter { 


    private int runNumber; 

    public void setValues(PreparedStatement ps) throws SQLException { 

     ps.setInt(1, runNumber); 

    } 

    public void setRunNumber(int runNumber) { 
     this.runNumber = runNumber; 
    } 

    public int getRunNumber() { 
     return runNumber; 
    } 

} 
+0

thanks lckster;) – sonx 2012-03-06 16:02:14