我想从batch.xml文件中分离sql,所以我将sql语句定义为属性文件。在batch.xml中,我绑定了property-placeholder bean,然后指向属性文件。
对于简单的select语句应该不是问题。但是,如果我想将参数作为where子句条件传递,那么可以这样做吗?
SELECT * FROM Person WHERE id = ?
这是我在属性文件中的sql语句:
Canvas
id可以从jobparameter传递吗?
答案 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
代替sql
和datasource
属性。
您可以使用属性文件的值替换查询文本。
答案 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