如何使用spring批处理从数据库中的多个表中读取数据

如何使用spring批处理从数据库中的多个表中读取数据,spring,spring-batch,Spring,Spring Batch,我尝试使用SpringBatch从一个表中读取数据并写入另一个表,但现在我的要求是从多个表中读取数据并写入一个文件,所以我们可以通过定义多个作业来实现这一点,但我希望使用单作业即单读取器、单写入器和单处理器来实现 请为我提供一些此场景的参考。spring批处理提供的类不可能实现,但您可以通过我们的方式实现。 在块处理添加一个步骤之前,制作一个自定义tasklet,在这里您将分配不同的sql和不同的输出文件,并使它们在循环中运行,只要有sql要执行。 这听起来可能很难,但我也在同样的情况下工作过,

我尝试使用SpringBatch从一个表中读取数据并写入另一个表,但现在我的要求是从多个表中读取数据并写入一个文件,所以我们可以通过定义多个作业来实现这一点,但我希望使用单作业即单读取器、单写入器和单处理器来实现


请为我提供一些此场景的参考。

spring批处理提供的类不可能实现,但您可以通过我们的方式实现。
块处理添加一个步骤之前,制作一个自定义tasklet,在这里您将分配不同的sql和不同的输出文件,并使它们在循环中运行,只要有sql要执行。
这听起来可能很难,但我也在同样的情况下工作过,下面是一些如何做到这一点的想法-

   <flow id="databaseReadWriteJob">
            <step id="step1_setReaderWriter">
                <tasklet ref="setReaderWriter" />
                <next on="FAILED" to="" />
                <next on="*" to="dataExtractionStep" />
            </step>
            <step id="dataExtractionStep">
                <tasklet>
                    <chunk reader="dbReader" writer="flatFileWriter" commit-interval="${commit-interval}" />
</tasklet>
                <next on="FAILED" to="" />
                <next on="*" to="step3_removeProcessedSql" />
            </step>
            <step id="step3_removeProcessedSql">
                <tasklet ref="removeProcessedSql" />
                <next on="NOOP" to="step1_setReaderWriter" />
                <next on="*" to="step4_validateNumOfSuccessfulSteps" />
            </step>
    </flow>

这是setReaderWriter的bean

<beans:bean id="setReaderWriter" class="SetReaderWriter">
        <beans:property name="reader" ref="dbReader" />
        <beans:property name="flatFileWriter" ref="flatFileWriter" />
        <beans:property name="fileSqlMap" ref="jobSqlFileMap" />
        <beans:property name="fileNameBuilder" ref="localFileNameBuilder" />
        <beans:property name="sourceFolder" value="${dataDir}" />
        <beans:property name="dateDiff" value="${dateDiff}" />

您需要在Reader或Writer中动态添加的任何内容。上面的sqlMap是sql作为键的映射,输出文件作为键的值。
我希望这能有所帮助。
spring批处理提供的类不可能实现,但您可以通过我们的方式实现。
块处理添加一个步骤之前,制作一个自定义tasklet,在这里您将分配不同的sql和不同的输出文件,并使它们在循环中运行,只要有sql要执行。
这听起来可能很难,但我也在同样的情况下工作过,下面是一些如何做到这一点的想法-

   <flow id="databaseReadWriteJob">
            <step id="step1_setReaderWriter">
                <tasklet ref="setReaderWriter" />
                <next on="FAILED" to="" />
                <next on="*" to="dataExtractionStep" />
            </step>
            <step id="dataExtractionStep">
                <tasklet>
                    <chunk reader="dbReader" writer="flatFileWriter" commit-interval="${commit-interval}" />
</tasklet>
                <next on="FAILED" to="" />
                <next on="*" to="step3_removeProcessedSql" />
            </step>
            <step id="step3_removeProcessedSql">
                <tasklet ref="removeProcessedSql" />
                <next on="NOOP" to="step1_setReaderWriter" />
                <next on="*" to="step4_validateNumOfSuccessfulSteps" />
            </step>
    </flow>

这是setReaderWriter的bean

<beans:bean id="setReaderWriter" class="SetReaderWriter">
        <beans:property name="reader" ref="dbReader" />
        <beans:property name="flatFileWriter" ref="flatFileWriter" />
        <beans:property name="fileSqlMap" ref="jobSqlFileMap" />
        <beans:property name="fileNameBuilder" ref="localFileNameBuilder" />
        <beans:property name="sourceFolder" value="${dataDir}" />
        <beans:property name="dateDiff" value="${dateDiff}" />

您需要在Reader或Writer中动态添加的任何内容。上面的sqlMap是sql作为键的映射,输出文件作为键的值。
我希望这能有所帮助。

您可以使用Spring Batch的“CompositeWriter”,请参见此处ok,但我们应该使用什么来让读卡器从多个表中读取您使用的是什么读卡器?我使用了一个绑定了sql的MyBatis读卡器,它可以从多个表中读取数据。如果这些表在同一个数据库中,为什么不能构造一个返回所有所需数据的sql查询呢?您可以使用Spring Batch的“CompositeWriter”,请参见这里ok,但是我们应该使用什么来让读卡器从多个表中读取数据您使用的是什么读卡器?我使用了一个绑定了sql的MyBatis读卡器,它可以从多个表中读取数据。如果这些表在同一个数据库中,为什么不能构造一个返回所有所需数据的sql查询呢?您可以使用Spring Batch的“CompositeWriter”,请参见这里ok,但是我们应该使用什么来让读卡器从多个表中读取数据您使用的是什么读卡器?我使用了一个绑定了sql的MyBatis阅读器,它可以从多个表中读取数据,为什么你不能构造一个返回所有所需数据的SQL查询?请你详细解释我无法理解。请你详细解释我无法理解。请你详细解释我无法理解。请你详细解释我无法理解。