Spring batch Spring批处理数据库依赖项将参数传递给SQL语句

Spring batch Spring批处理数据库依赖项将参数传递给SQL语句,spring-batch,Spring Batch,我希望将sql与batch.xml文件分开,因此我将sql语句定义为属性文件。在batch.xml中,我绑定属性占位符bean,然后指向属性文件 对于简单的select语句不应该是问题。但是,如果我想将参数作为where子句条件传递,那么可以这样做吗 <context:property-placeholder location="classpath:batch-sql.properties/> <bean id="secondReader" class="or

我希望将sql与batch.xml文件分开,因此我将sql语句定义为属性文件。在batch.xml中,我绑定属性占位符bean,然后指向属性文件

对于简单的select语句不应该是问题。但是,如果我想将参数作为where子句条件传递,那么可以这样做吗

<context:property-placeholder
    location="classpath:batch-sql.properties/>

<bean id="secondReader"
    class="org.springframework.batch.item.database.JdbcCursorItemReader"
    scope="step">
    <property name="dataSource" ref="dataSource" />
    <property name="sql" value="${sql1}" />
    <property name="rowMapper">
        <bean class="com.test.batchjob.process.TestPersonMapper" />
    </property>
</bean>

id能否从jobparameter传递?

要在
JdbcPagingItemReader
中设置查询的参数,必须使用属性
参数值
。此属性采用
映射
,其中键是命名参数或参数索引(如果使用


见文件:

更新

您必须使用
QueryProvider
而不是
sql
datasource
属性。
您可以用属性文件的值替换查询的文本。

要在
JdbcCursorItemReader
中设置查询的参数,必须使用属性
preparedStatementSetter
。此属性接受一个
PreparedStatementSetter
,您必须自己实现它才能设置命名参数或基于索引的参数

<bean id="secondReader"
class="org.springframework.batch.item.database.JdbcCursorItemReader"
scope="step">
<property name="sql" value="${sql1}" />
<property name="itemPreparedStatementSetter">
    <bean class="xx.xx.xx.YourPreparedStatementSetter">
        <property name="id" value="#{jobParameters['id']}" />
    </bean>
</property>
<property name="rowMapper">
    <bean class="com.test.batchjob.process.TestPersonMapper" />
</property>

对于
JdbcCursorItemReader
,您可以在这里查看答案:

I出现以下错误“bean类[org.springframework.batch.item.database.JdbcPagingItemReader]的无效属性'sql]:bean属性'sql'不可写或具有无效的setter方法。setter的参数类型是否与getter的返回类型匹配?”将JdbcCursorItemReader更改为时JdbcPagingItemReader@EinnHann对,
JdbcPagingItemReader
没有
sql
属性。您必须使用
QueryProvider
。请参阅更新的答案。因为我的sql必须从属性文件中检索。那么,这是否意味着我需要在属性文件中分别声明select from和where?@Einnhan是的,我想你必须这样做。但可能存在另一种解决方案。另外,我看到您使用了一个工作方式稍有不同的
JdbcCursorItemReader
更新了您的问题。那么我会为这个案例发布另一个答案。这应该是一个评论,而不是答案。如果这是一个重复的问题,那么就这样做和/或留下评论,一旦你足够。如果问题不是重复的,则根据具体问题定制答案。
<bean id="secondReader"
    class="org.springframework.batch.item.database.JdbcPagingItemReader"
    scope="step">
    <property name="queryProvider">
          <bean class="org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="selectClause" value="select *" />
            <property name="fromClause" value="from persons" />
            <property name="whereClause" value="where id = ?" />
        </bean>
    </property>
    <property name="parametersValue">
        <map>
            <entry key="1" value="#{jobParameters['id']}" />
        </map>
    </property>
    <property name="rowMapper">
        <bean class="com.test.batchjob.process.TestPersonMapper" />
    </property>
</bean>
<bean id="secondReader"
class="org.springframework.batch.item.database.JdbcCursorItemReader"
scope="step">
<property name="sql" value="${sql1}" />
<property name="itemPreparedStatementSetter">
    <bean class="xx.xx.xx.YourPreparedStatementSetter">
        <property name="id" value="#{jobParameters['id']}" />
    </bean>
</property>
<property name="rowMapper">
    <bean class="com.test.batchjob.process.TestPersonMapper" />
</property>
public class YourPreparedStatementSetter implements PreparedStatementSetter {

    private String id;

    @Override
    public void setValues(PreparedStatement ps) throws SQLException {
        ps.setString(1, this.id);
    }

    public setId(String id) {
        this.id = id;
    }

}