복붙노트

[SPRING] CSV 파일을 업로드하고 이에 따라 데이터베이스에 삽입하는 스프링 배치

SPRING

CSV 파일을 업로드하고 이에 따라 데이터베이스에 삽입하는 스프링 배치

내 프로젝트에는 사용자가 mysql 데이터베이스에 푸시해야하는 CSV 파일을 업로드하는이 요구 사항이 있습니다. Spring 배치를 사용하여 많은 수의 레코드를 처리 할 수 ​​있다는 것을 알고 있습니다. 그러나 나는이 요구 사항에 대한 튜토리얼 / 샘플 코드를 찾을 수 없다. 모든 튜토리얼은 다음과 같이 CSV 파일 이름을 하드 코드했습니다.

https://spring.io/guides/gs/batch-processing/

사용자가 업로드 한 파일을 사용하여 적절하게 처리해야합니다. 어떤 도움을 주시면 감사하겠습니다 ..

Spring 배치가 아닌 경우 업로드 된 CSV 데이터를 mysql에 삽입하는 다른 방법이 있습니까?

해결법

  1. ==============================

    1.이것을 주 참조로 삼으십시오 : http://walkingtechie.blogspot.co.uk/2017/03/spring-batch-csv-file-to-mysql.html 여기서는 Batch를 사용하여 CSV 파일을 MySQL 데이터베이스로 가져 오는 방법을 설명합니다.

    이것을 주 참조로 삼으십시오 : http://walkingtechie.blogspot.co.uk/2017/03/spring-batch-csv-file-to-mysql.html 여기서는 Batch를 사용하여 CSV 파일을 MySQL 데이터베이스로 가져 오는 방법을 설명합니다.

    그러나, 당신이 말했듯이, 모든 예제는 당신이 원하는 것이 아닌 하드 코드 파일을 가정합니다.

    아래 코드에서 중요한 비트 (필자가 제공 한 링크의 예제와 다름)는 다중 파트 파일을 가져 와서 임시 폴더에 저장하는 컨트롤러입니다. 그런 다음 파일 이름이 Job as 매개 변수로 전달됩니다.

    JobExecution jobExecution = jobLauncher.run(importUserJob, new JobParametersBuilder()
                    .addString("fullPathFileName", fileToImport.getAbsolutePath())
                    .toJobParameters());
    

    마지막으로 importReader는 fullPathFileName 매개 변수를 사용하여 사용자가 업로드 한 파일을로드합니다.

          @Bean
          public FlatFileItemReader<Person> importReader(@Value("#{jobParameters[fullPathFileName]}") String pathToFile) {
            FlatFileItemReader<Person> reader = new FlatFileItemReader<>();
            reader.setResource(new FileSystemResource(pathToFile));
    

    여기에 전체 코드 (테스트되지는 않았지만 대부분의 구성 요소가 있음)를 사용하여 아이디어를 얻을 수 있습니다.

    @Configuration
    @EnableBatchProcessing
    public class BatchConfig{
    
        @Bean
        public ResourcelessTransactionManager batchTransactionManager(){
            ResourcelessTransactionManager transactionManager = new ResourcelessTransactionManager();
            return transactionManager;
        }
    
        @Bean
        protected JobRepository jobRepository(ResourcelessTransactionManager batchTransactionManager) throws Exception{
            MapJobRepositoryFactoryBean jobRepository = new MapJobRepositoryFactoryBean();
            jobRepository.setTransactionManager(batchTransactionManager);
            return (JobRepository)jobRepository.getObject();
        }
    
        @Bean
        public JobLauncher jobLauncher(JobRepository jobRepository) throws Exception {
            SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
            jobLauncher.setJobRepository(jobRepository);
            return jobLauncher;
        }
    
    }
    
    @Configuration
    public class ImportJobConfig {
    
        @Bean
        public FlatFileItemReader<Person> importReader(@Value("#{jobParameters[fullPathFileName]}") String pathToFile) {
            FlatFileItemReader<Person> reader = new FlatFileItemReader<>();
            reader.setResource(new FileSystemResource(pathToFile));
            reader.setLineMapper(new DefaultLineMapper<Person>() {{
                setLineTokenizer(new DelimitedLineTokenizer() {{
                    setNames(new String[]{"firstName", "lastName"});
                }});
                setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
                    setTargetType(Person.class);
                }});
            }});
            return reader;
        }
    
        @Bean
        public PersonItemProcessor processor() {
            return new PersonItemProcessor();
        }
    
        @Bean
        public JdbcBatchItemWriter<Person> writer() {
            JdbcBatchItemWriter<Person> writer = new JdbcBatchItemWriter<>();
            writer.setItemSqlParameterSourceProvider(
                    new BeanPropertyItemSqlParameterSourceProvider<Person>());
            writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)");
            writer.setDataSource(dataSource);
            return writer;
        }
        // end::readerwriterprocessor[]
    
        // tag::jobstep[]
        @Bean
        public Job importUserJob(JobCompletionNotificationListener listener) {
            return jobBuilderFactory.get("importUserJob").incrementer(new RunIdIncrementer())
                    .listener(listener).flow(step1()).end().build();
        }
    
        @Bean
        public Step step1(@Qualifier("importReader") ItemReader<Person> importReader) {
            return stepBuilderFactory.get("step1").<Person, Person>chunk(10).reader(importReader)
                    .processor(processor()).writer(writer()).build();
        }
    
    }
    
    @RestController
    public class MyImportController {
    
        @Autowired private JobLauncher jobLauncher;
        @Autowired private Job importUserJob;
    
        @RequestMapping(value="/import/file", method=RequestMethod.POST)
        public String create(@RequestParam("file") MultipartFile multipartFile) throws IOException{
    
            //Save multipartFile file in a temporary physical folder
            String path = new ClassPathResource("tmpuploads/").getURL().getPath();//it's assumed you have a folder called tmpuploads in the resources folder
            File fileToImport = new File(path + multipartFile.getOriginalFilename());
            OutputStream outputStream = new FileOutputStream(fileToImport);
            IOUtils.copy(multipartFile.getInputStream(), outputStream);
            outputStream.flush();
            outputStream.close();       
    
            //Launch the Batch Job
            JobExecution jobExecution = jobLauncher.run(importUserJob, new JobParametersBuilder()
                    .addString("fullPathFileName", fileToImport.getAbsolutePath())
                    .toJobParameters());        
    
            return "OK";
        }
    
    }
    
  2. ==============================

    2.Spring MVC (RestController)와 Spring Batch를 섞어서 만들었다. Spring MVC는 csv 파일을 다중 요청으로 업로드하는 것을 도왔습니다. 그런 다음 비동기 적으로이 업로드 된 CSV를 Spring 작업에 전달하여 Spring 배치를 호출했습니다. 일단 Spring 작업이 csv 파일을 받으면 DB 작업 읽기, 처리 및 쓰기로 봄 배치 처리를 수행합니다.

    Spring MVC (RestController)와 Spring Batch를 섞어서 만들었다. Spring MVC는 csv 파일을 다중 요청으로 업로드하는 것을 도왔습니다. 그런 다음 비동기 적으로이 업로드 된 CSV를 Spring 작업에 전달하여 Spring 배치를 호출했습니다. 일단 Spring 작업이 csv 파일을 받으면 DB 작업 읽기, 처리 및 쓰기로 봄 배치 처리를 수행합니다.

  3. from https://stackoverflow.com/questions/47442909/spring-batch-to-upload-a-csv-file-and-insert-into-database-accordingly by cc-by-sa and MIT license