2016-07-24 2 views
0

Я развиваю Spring Batch - XML to DB example. В этом примере я хочу загрузить данные XML в БД. В текущей реализации, если я запускаю основную программу, тогда данные XML становятся загруженными в БД успешно, снова я запускаю главную программу, и снова данные загружаются в БД (с предыдущими запусками - для второго запуска, это все дубликаты). Что делать, если я не хочу сохранять старые данные, то есть всякий раз, когда я запускаю основной код, я должен получать свежие данные (независимо от того, что присутствует в БД) в таблицу. Какую конфигурацию мне нужно изменить в БД?Spring Batch - XML ​​для DB - как всегда свежие данные (независимо от того, присутствует ли в файле XML) для нескольких запусков?

весна-периодического 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> 

ответ

0

Добавить новый тасклет в качестве первого шага, чтобы удалить данные из таблицы непосредственно перед импортом.
Вы можете achive его с помощью 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;  
    } 
} 

Это скелет Takslet; просто добавьте аксессоров и установите метод execute().

1

Для выполнения ваших требований вам нужно только изменить запрос.

Вы должны сделать своим учеником имя первичного ключа в своей таблице и , а затем изменить запрос в файле конфигурации.

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

Поставка значение в позиционные параметры в ExamResultItemPreparedStatementSetter.

Надеюсь, это поможет вам ...