如何在 spring 批次中读取 class jdbcBatchItemWriter 的 bean 中的 hashmap
How to read a hashmap in bean of class jdbcBatchItemWriter in spring batch
我正在尝试将 2 sql 语句传递给 java class,它实现了 itemWriter 以将数据写入我的 posgres 数据库。我正在尝试通过哈希图
<beans:bean id="someItemWriter" scope="step"
class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<beans:property name="dataSource" ref="someSource" />
<beans:property name="sql" ref = "sqlStatements" >
</beans:property>
<beans:property name="itemPreparedStatementSetter" ref="myPreparedStatementSetter" />
</beans:bean>
参考:
<util:map id = "sqlStatements" map-class= "java.util.HashMap" key-type= "java.lang.String" value-type="java.lang.String">
<beans:entry key = "insert" value ="${fetch.some.sql}"/>
<beans:entry key = "update" value = "${fetch.someAnother.sql}" />
</util:map>
但我收到以下错误:
Cannot convert value of type [java.util.HashMap] to required type [java.lang.String] for property 'sql': no matching editors or conversion strategy found
我做错了什么?我该如何解决?
添加:有时 Update/Sometimes 插入
好的,鉴于您的评论,您有一个条件,有时您想要更新,有时您想要插入。有两种方法可以做到这一点:1) 使用单个 JdbcBatchItemWriter
并使用 MERGE
查询。此语法将根据您的数据库而有所不同。 2) 使用 ClassifierItemWriter
如下所示:
<bean id="classifierWriter" class="org.springframework.batch.item.support.ClassifierCompositeItemWriter">
<property name="classifier">
<bean class="com.package.SimpleClassifier">
<property name="insertWriter" ref="insertWriter" />
<property name="updateWriter" ref="updateWriter" />
</bean>
</property>
</bean>
<bean id="insertWriter" ... />
<bean id="updateWriter" ... />
然后是一个 Classifier
看起来像这样的实现:
public class SimpleClassifier implements Classifier<InsertUpdateObject, ItemWriter<? extends InsertUpdateObject>> {
private ItemWriter<? extends InsertUpdateObject> insertWriter;
private ItemWriter<? extends InsertUpdateObject> updateWriter;
@Override
public ItemWriter<? extends InsertUpdateObject> classify(InsertUpdateObject item) {
if (item.getFlag() == 0) {
return insertWriter;
}
return updateWriter;
}
// setters and getters
}
运行 多个查询
首先,您不想使用 HashMap
,因为您无法确保 SQL.
的顺序
接下来,您要做的是将多个 JdbcBatchItemWriter
包裹在一个 CompositeItemWriter
中,如下所示:
<bean id="compositeWriter" class="org.springframework.batch.item.support.CompositeItemWriter" scope="step">
<property name="delegates">
<list>
<ref bean="writer1" />
<ref bean="writer2" />
</list>
</property>
</bean>
<bean id="writer1" scope="step"
class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<property name="dataSource" ref="someSource" />
<property name="sql" value="${fetch.some.sql}" />
<property name="itemPreparedStatementSetter" ref="myPreparedStatementSetter" />
</bean>
<bean id="writer2" scope="step"
class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<property name="dataSource" ref="someSource" />
<property name="sql" value="${fetch.someAnother.sql}" />
<property name="itemPreparedStatementSetter" ref="myPreparedStatementSetter" />
</bean>
这将允许您列出任意数量的语句并确保它们 运行 按照您指定的顺序。
我正在尝试将 2 sql 语句传递给 java class,它实现了 itemWriter 以将数据写入我的 posgres 数据库。我正在尝试通过哈希图
<beans:bean id="someItemWriter" scope="step"
class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<beans:property name="dataSource" ref="someSource" />
<beans:property name="sql" ref = "sqlStatements" >
</beans:property>
<beans:property name="itemPreparedStatementSetter" ref="myPreparedStatementSetter" />
</beans:bean>
参考:
<util:map id = "sqlStatements" map-class= "java.util.HashMap" key-type= "java.lang.String" value-type="java.lang.String">
<beans:entry key = "insert" value ="${fetch.some.sql}"/>
<beans:entry key = "update" value = "${fetch.someAnother.sql}" />
</util:map>
但我收到以下错误:
Cannot convert value of type [java.util.HashMap] to required type [java.lang.String] for property 'sql': no matching editors or conversion strategy found
我做错了什么?我该如何解决?
添加:有时 Update/Sometimes 插入
好的,鉴于您的评论,您有一个条件,有时您想要更新,有时您想要插入。有两种方法可以做到这一点:1) 使用单个 JdbcBatchItemWriter
并使用 MERGE
查询。此语法将根据您的数据库而有所不同。 2) 使用 ClassifierItemWriter
如下所示:
<bean id="classifierWriter" class="org.springframework.batch.item.support.ClassifierCompositeItemWriter">
<property name="classifier">
<bean class="com.package.SimpleClassifier">
<property name="insertWriter" ref="insertWriter" />
<property name="updateWriter" ref="updateWriter" />
</bean>
</property>
</bean>
<bean id="insertWriter" ... />
<bean id="updateWriter" ... />
然后是一个 Classifier
看起来像这样的实现:
public class SimpleClassifier implements Classifier<InsertUpdateObject, ItemWriter<? extends InsertUpdateObject>> {
private ItemWriter<? extends InsertUpdateObject> insertWriter;
private ItemWriter<? extends InsertUpdateObject> updateWriter;
@Override
public ItemWriter<? extends InsertUpdateObject> classify(InsertUpdateObject item) {
if (item.getFlag() == 0) {
return insertWriter;
}
return updateWriter;
}
// setters and getters
}
运行 多个查询
首先,您不想使用 HashMap
,因为您无法确保 SQL.
接下来,您要做的是将多个 JdbcBatchItemWriter
包裹在一个 CompositeItemWriter
中,如下所示:
<bean id="compositeWriter" class="org.springframework.batch.item.support.CompositeItemWriter" scope="step">
<property name="delegates">
<list>
<ref bean="writer1" />
<ref bean="writer2" />
</list>
</property>
</bean>
<bean id="writer1" scope="step"
class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<property name="dataSource" ref="someSource" />
<property name="sql" value="${fetch.some.sql}" />
<property name="itemPreparedStatementSetter" ref="myPreparedStatementSetter" />
</bean>
<bean id="writer2" scope="step"
class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<property name="dataSource" ref="someSource" />
<property name="sql" value="${fetch.someAnother.sql}" />
<property name="itemPreparedStatementSetter" ref="myPreparedStatementSetter" />
</bean>
这将允许您列出任意数量的语句并确保它们 运行 按照您指定的顺序。