【问题标题】:Loading data into a CSV file from Oracle Database using Spring Batch, boot and Spring Jpa使用 Spring Batch、boot 和 Spring Jpa 从 Oracle 数据库将数据加载到 CSV 文件中
【发布时间】:2017-02-05 05:41:15
【问题描述】:

您好,我是第一次使用 Spring Batch。我的用例是我必须使用 Spring Boot 和 Spring Data 将数据从 oracle db 加载到 csv 文件。 我在 ItemReader 中配置 oracle db 时遇到困难。谁能帮帮我。

这是我的代码

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Autowired
    public PersonAcctRepository personAcctRepository;



    @Bean
    public ItemWriter<CustomerInsr> writer(){

        FlatFileItemWriter<CustomerInsr> writer = new FlatFileItemWriter<CustomerInsr>();

        String exportFileHeader = "FIRST_NAM, MIDDLE_NAM, LAST_NAM";
        StringHeaderWriter headerWriter =  new StringHeaderWriter(exportFileHeader);
        writer.setHeaderCallback(headerWriter);
        writer.setResource(new ClassPathResource("sample-data.csv"));

        LineAggregator<CustomerInsr> lineAgg = createCustomerInsrAgg();
        writer.setLineAggregator(lineAgg);



        return writer;

    }

    @Bean
    public LineAggregator<CustomerInsr> createCustomerInsrAgg(){

        DelimitedLineAggregator<CaresCustomerInsr> deliAgg = new DelimitedLineAggregator<CustomerInsr>();
        deliAgg.setDelimiter(",");

        FieldExtractor<CustomerInsr> fieldExtractor = createCustomerInsrExtractor();
        deliAgg.setFieldExtractor(fieldExtractor);
        return deliAgg;

    }

    @Bean
    public FieldExtractor<CustomerInsr> createCustomerInsrExtractor(){

        BeanWrapperFieldExtractor<CustomerInsr> fieldExtractor = new BeanWrapperFieldExtractor<CustomerInsr>();
        fieldExtractor.setNames(new String []{"firstName", "middleName", "lastName"});
        return fieldExtractor;  
    }

    @Bean
    public ItemReader<CustomerInsr> reader(){

        RepositoryItemReader<CustomerInsr> reader  = new RepositoryItemReader<CustomerInsr> ();
        reader.setRepository(personAcctRepository);
        reader.setMethodName("findAll");
        return reader;  
    }


    @Bean
    public Job job(){

        return jobBuilderFactory.get("job")
               .incrementer(new RunIdIncrementer())
               .flow(step())
               .end()
               .build();

    }


    @Bean
    public Step  step(){

        return stepBuilderFactory.get("step")
               .<CustomerInsr, CustomerInsr> chunk(10)
               .reader(reader())
               .writer(writer())
               .build();
    }

}

【问题讨论】:

  • 你能详细说明一下,有什么遗漏/错误。堆栈跟踪?
  • 我正在尝试从 oracle db 中读取数据,我正在使用 Spring 数据存储库(JPA 存储库,使用 findAll() 方法)。我在 application.properties 文件中提供数据库属性。我应该如何在 ItemReader 中配置方法(findAll())和数据源

标签: spring-boot spring-data-jpa spring-batch


【解决方案1】:

您的用例是我经常遇到的。如此频繁,以至于我编写了一个小型应用程序(spring boot、spring batch)来为您的用例提供一个自以为是的实现。

您可以克隆 the repo 并手动添加您的 oracle 驱动程序。添加正确的驱动程序后,您可以将应用程序重新打包到一个新的 jar 中(如果您使用 maven,请使用打包构建阶段)。

在 application.yml 中提供您的数据库凭据和卸载数据的设置(这是一个外部配置文件,类似于 database.properties)。

我冒昧地为您提供了一个示例,该示例使用 CustomerInsr 作为表,并将 firstName、middleName 和 lastName 作为您希望卸载的列:

spring:
  datasource:
    url: jdbc:oracle:thin:@yoururl:yourport:yoursid
    username: 
    password:         

output-dir: your/directory/target/
commit-interval: 10
page-size: 10
delimiter: ","
quote: "\""
quote-escape: "\\"
table-definitions:
  - file-name: CustomerInsr.csv    
    select-query: "SELECT firstName, middleName, lastName"
    from-query: "FROM CustomerInsr"
    sort-column: firstName

从命令行运行 jar,例如:

java -jar jdbc-unload-1.0.0.jar --spring.config.location=c:\yourlocation\application.yml  

如果您有任何问题,请随时问我。

【讨论】:

    猜你喜欢
    • 2018-12-25
    • 2021-10-02
    • 1970-01-01
    • 2015-05-31
    • 2021-03-05
    • 2020-12-06
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多