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
而不是 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>
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
我想将 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
而不是 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>
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