gpt4 book ai didi

spring - 如何执行关于Spring批处理JdbcItemWriter的多个SQL

转载 作者:行者123 更新时间:2023-12-04 04:42:48 25 4
gpt4 key购买 nike

我必须使用 Spring 批处理将数据写入多个表。比如我有两个表:用户表和信息表。

我不想使用存储过程,但是 JdbcItemwriter不允许执行多个 SQL。我想在 JdbcItemWriter 中执行多个 SQL .

我正在寻找有关执行此操作的最佳方式的指针和一般建议。

最佳答案

我通常需要为每个元素进行多次插入。例如,从文件(如结构化 XML)读取时。
为此,我通常会实现一个特定的 ItemWriter属性是特定的类 JdbcItemWriter我的每张 table 的类(class)。下面是一个例子:

package my.package.writer;

import my.package.model.tbl.MyMainObject;
import my.package.model.tbl.MySubObject1;
import my.package.model.tbl.MySubObject2;
import org.springframework.batch.item.ItemWriter;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

public class MainMultipleWriter implements ItemWriter<PkjwdPolizze>
{

private CounterBean counterBean;
private ItemWriter<MyMainObject> writerMyMainObject;
private ItemWriter<MySubObject1> writerSubObject1;
private ItemWriter<MySubObject2> writerSubObject2;

@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public void write(List<? extends MyMainObject> items) throws Exception
{
// Main Table WRITER
writerMyMainObject.write(items);

// Secondary Table WRITERS
for (MyMainObject item : items)
{
writerSubObject1.write(item.getLstMySubObject1());
writerSubObject2.write(item.getLstMySubObject2());
}
}
}

在此之后,您将作业配置为使用您的 MultiWriter类而不是简单的 JdbcItemWriter .这是该配置的示例:
<!-- job -->
<batch:job id="myJob" job-repository="jobRepository" restartable="false">
<batch:step id="myStep" >
<batch:tasklet transaction-manager="transactionManager">
<batch:chunk commit-interval="2500" reader="myReader"
processor="myProcessor" writer="myMultiWriterBean" />
</batch:tasklet>
</batch:step>
</batch:job>

<!-- Writers -->
<bean id="myMainObjectWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<property name="itemPreparedStatementSetter">
<bean class="my.package.setters.MyMainObjectStatementSetter"></bean>
</property>
<property name="sql" value="--insert_statement--" />
<property name="dataSource" ref="dataSource" />
</bean>

<bean id="mySubObject1Writer" class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<property name="itemPreparedStatementSetter">
<bean class="my.package.setters.MySubObject1StatementSetter"></bean>
</property>
<property name="sql" value="--insert_statement--" />
<property name="dataSource" ref="dataSource" />
</bean>

<bean id="mySubObject2Writer" class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<property name="itemPreparedStatementSetter">
<bean class="my.package.setters.MySubObject2StatementSetter"></bean>
</property>
<property name="sql" value="--insert_statement--" />
<property name="dataSource" ref="dataSource" />
</bean>

<bean id="myMultiWriterBean" class="my.package.writer.MainMultipleWriter">
<property name="writerMyMainObject" ref="mySubObject1Writer" />
<property name="writerSubObject1" ref="mySubObject2Writer" />
<property name="writerSubObject2" ref="mySubObject2Writer" />
</bean>

我认为这是一个更清晰的实现,因为您尊重块结构并且不必担心回滚、事务和数据完整性。

关于spring - 如何执行关于Spring批处理JdbcItemWriter的多个SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18641436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com