Spring batch Spring批处理数据库依赖项将参数传递给SQL语句
我希望将sql与batch.xml文件分开,因此我将sql语句定义为属性文件。在batch.xml中,我绑定属性占位符bean,然后指向属性文件 对于简单的select语句不应该是问题。但是,如果我想将参数作为where子句条件传递,那么可以这样做吗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
<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;
}
}