java-Spring批处理上传CSV文件并相应地插入数据库
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-Spring批处理上传CSV文件并相应地插入数据库,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4436字,纯文字阅读大概需要7分钟。
内容图文
![java-Spring批处理上传CSV文件并相应地插入数据库](/upload/InfoBanner/zyjiaocheng/883/757c08c1aed441b98a056c028b579c85.jpg)
我的项目有此要求,即用户上传一个CSV文件,该文件必须被推送到mysql数据库.我知道我们可以使用Spring批处理来处理大量记录.但是我找不到适合我的这个要求的任何教程/示例代码.我遇到的所有教程都只是将CSV文件名硬编码如下,如下所示:
https://spring.io/guides/gs/batch-processing/
我需要使用用户上传的文件并进行相应处理.在这里的任何帮助,将不胜感激.
如果不是Spring批处理,还有其他方法可以将上传的CSV数据插入mysql吗?
解决方法:
请将此作为主要参考:http://walkingtechie.blogspot.co.uk/2017/03/spring-batch-csv-file-to-mysql.html
这说明了如何使用批处理将CSV文件导入MySQL数据库.
但是,正如您所说,所有示例都假设使用了一个不需要的硬代码文件.
在下面的代码中,重要的位(与我提供的链接中的示例不同)是Controller,它获取一个包含多个部分的文件并将其保存在一个临时文件夹中.
然后将文件名作为参数传递给Job:
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";
}
}
内容总结
以上是互联网集市为您收集整理的java-Spring批处理上传CSV文件并相应地插入数据库全部内容,希望文章能够帮你解决java-Spring批处理上传CSV文件并相应地插入数据库所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。