2016-07-24 11 views
0

Ich entwickle Spring Batch - XML to DB example. In diesem Beispiel möchte ich XML-Daten in die DB laden. Nach der aktuellen Implementierung, wenn ich das Hauptprogramm ausführen, dann werden XML-Daten erfolgreich in die Datenbank geladen, wieder laufe ich das Hauptprogramm wieder Daten werden in DB geladen (mit vorherigen Läufen Ausgabe - für den zweiten Lauf, es ist alles Duplikate). Was ist, wenn ich keine alten Daten beibehalten möchte, d. H., Wenn ich den Hauptcode ausführe, sollte ich frische Daten (welche auch immer in DB vorhanden sind) in die Tabelle bekommen. Welche Konfiguration muss ich in der DB ändern?Spring Batch - XML ​​zu DB - wie immer frische Daten (was immer in XML-Datei vorhanden ist) für mehrere Läufe?

federchargen context.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:batch="http://www.springframework.org/schema/batch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/batch 
     http://www.springframework.org/schema/batch/spring-batch.xsd 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd"> 
    <import resource="classpath:context-datasource.xml"/> 
    <!-- ============= ItemReader which reads data from XML file ============= --> 
    <bean id="xmlItemReader" class="org.springframework.batch.item.xml.StaxEventItemReader"> 
     <property name="resource" value="classpath:examResult.xml" /> 
     <property name="fragmentRootElementName" value="ExamResult" /> 
     <property name="unmarshaller"> 
      <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
       <property name="classesToBeBound"> 
        <list> 
         <value>com.websystique.springbatch.model.ExamResult</value> 
        </list> 
       </property> 
      </bean> 
     </property> 
    </bean> 
    <!-- ================ ItemWriter which writes data to database ================= --> 
    <bean id="databaseItemWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="sql"> 
      <value> 
       <![CDATA[   
        insert into EXAM_RESULT(STUDENT_NAME, DOB, PERCENTAGE) values (?, ?, ?) 
       ]]> 
      </value> 
     </property> 
     <!-- We need a custom setter to handle the conversion between Jodatime LocalDate and MySQL DATE --> 
     <property name="ItemPreparedStatementSetter"> 
      <bean class="com.websystique.springbatch.ExamResultItemPreparedStatementSetter" /> 
     </property> 
    </bean> 
    <!-- Optional ItemProcessor to perform business logic/filtering on the input records --> 
    <bean id="itemProcessor" class="com.websystique.springbatch.processor.ExamResultItemProcessor" /> 
    <!-- Optional JobExecutionListener to perform business logic before and after the job --> 
    <bean id="jobListener" class="com.websystique.springbatch.utils.ExamResultJobListener" /> 
    <!-- ==================== Actual Job ========================= --> 
    <batch:job id="examResultJob"> 
     <batch:step id="step1"> 
      <batch:tasklet transaction-manager="transactionManager"> 
       <batch:chunk reader="xmlItemReader" writer="databaseItemWriter" processor="itemProcessor" commit-interval="10" /> 
      </batch:tasklet> 
     </batch:step> 
     <batch:listeners> 
      <batch:listener ref="jobListener" /> 
     </batch:listeners> 
    </batch:job> 
</beans> 

Antwort

0

neues Tasklet hinzufügen Als erster Schritt Daten aus der Tabelle vor dem Import nur zu löschen.
Sie können es Tasklet

public class SQLStmtTasklet implements Tasklet{ 
    private DataSource dataSource; 
    private String sql; 

    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { 
    // Execute your sql statement 
    return RepeatStatus.FINISHED;  
    } 
} 

Dies ist ein Skelett eines Takslet mit achive; Fügen Sie einfach Accessoren hinzu und füllen Sie die Methode execute().

1

Um Ihre Anforderung zu erfüllen, müssen Sie nur die Abfrage ändern.

Sie sollten Ihren Schülernamen einen Primärschlüssel in Ihrer Tabelle und dann die Abfrage in der Konfigurationsdatei ändern.

"insert into EXAM_RESULT(STUDENT_NAME, DOB, PERCENTAGE) 
values (?, ?, ?) on DUPLICATE KEY UPDATE DOB = ? ,PERCENTAGE=?" 

Versorgung, um die Werte zu Positionsparameter in ExamResultItemPreparedStatementSetter.

Hoffe, das wird Ihnen helfen ...