Spring Batch:将运行时参数传递给ItemReader中的查询

时间:2011-12-05 06:51:43

标签: sql spring-batch

我有一个弹簧批处理程序,它从一个数据库读取并写入文件。

它有项目阅读器如下:

<beans:bean id="myItemReader" class="org.springframework.batch.item.database.JdbcCursorItemReader">
    <beans:property name="dataSource" ref="jobRepository-dataSource" />
    <beans:property name="sql" value="${dbTofileDataReadSQL}"/>
    <beans:property name="rowMapper">
        <beans:bean class="com.mypackage.MyRowMapper" />
    </beans:property>
</beans:bean>

sql类似于:

select one, two, three, four from myTable where business_date='12/12/11'

此行将进入我的属性文件:

dbTofileDataReadSQL = select one, two, three, four from myTable where business_date='12/12/11'

如何在项目阅读器中在运行时传递此业务日期,以便将其添加到项目阅读器中。

感谢您阅读!!

2 个答案:

答案 0 :(得分:3)

您可以使用late-binding with step scope或简单的PropertyPlaceholderConfigurer

<bean id="placeholderProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="path to your properties file, either classpath: ... or c:/... " />
</bean>

如果您需要在属性文件中添加多行条目,请按照

进行操作
# sql, multiline property with \
sql=\
SELECT \
ID, \
NAME \
FROM TEST \
ORDER BY ID

或者从Spring 3开始,您可以使用SpEL:

<util:properties id="myProperties" location="..." />
...
<beans:bean ...
   <beans:property name="sql" value="#{myProperties.sql}"/>
</beans:bean>

答案 1 :(得分:0)

在您的财产中拥有占位符


dbTofileDataReadSQL = select one, two, three, four from myTable where business_date={0}

并查看this answer,了解如何使用MessageFormat

在运行时解决此问题

更新

使用Spring,如果您将该属性文件添加到资源包中, 您可以使用ApplicationContext#getMessage

检索已解析的值

String getMessage(String code,
                  Object[] args,
                  Locale locale)
                  throws NoSuchMessageException