Spring 批处理数据库依赖传递参数到 SQL 语句

Spring Batch Database Dependency pass parameters to SQL statement

我想将 sql 与 batch.xml 文件分开,所以我将 sql 语句定义到属性文件中。在 batch.xml 中,我绑定 属性-placeholder 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>

这是我在属性文件中的 sql 声明:

SELECT * FROM Person WHERE id = ?

id可以从jobparameter传过来吗?

要在 JdbcPagingItemReader 中设置查询的参数,您必须使用 属性 parametersValue。此 属性 采用 Map<String,Object>,其中键是命名参数或参数的索引(如果使用 ?)。

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

参见文档:JdbcPagingItemReader

更新

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

要在 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>

PreparedStatementSetter 的示例实现:

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;
    }

}

对于 JdbcCursorItemReader,您可以在这里查看答案:Using Spring Batch JdbcCursorItemReader with NamedParameters