Spring Batch Database Dependency将参数传递给SQL语句

时间:2015-10-23 07:24:43

标签: spring-batch

我想从batch.xml文件中分离sql,所以我将sql语句定义为属性文件。在batch.xml中,我绑定了property-placeholder bean,然后指向属性文件。

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

SELECT * FROM Person WHERE id = ?

这是我在属性文件中的sql语句:

Canvas

id可以从jobparameter传递吗?

3 个答案:

答案 0 :(得分:0)

要在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属性。 您可以使用属性文件的值替换查询文本。

答案 1 :(得分:0)

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

}

答案 2 :(得分:0)

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