spring批量写入mysql数据库_快速使用组件-spring batch(3)读文件数据到数据库

tags: springbatch

1.引言

上一篇文章《快速了解组件-spring batch(2)之helloworld》对Spring Batch进行了入门级的开发,也对基本的组件有了一定的了解。但实际开发过程中,更多的是涉及文件及数据库的操作,以定时后台运行的方式,实现批处理操作。典型操作是从文本数据(csv/txt等文件)中读取数据,然后写入到数据库存储。如下图所示:

a3d481121e77?utm_campaign=maleskine

读文件流程

若需要开发此过程,可以按照上一篇文章所写的,自定义ItemReader和ItemWriter来实现,但是Spring Batch其实已经提供现成的文件读取和数据库写入的组件,开发人员可以直接使用,提高开发效率。本文将会对文件读取和数据库写入进行实战介绍。

2.开发环境

JDK: jdk1.8

Spring Boot: 2.1.4.RELEASE

Spring Batch:4.1.2.RELEASE

开发IDE: IDEA

构建工具Maven: 3.3.9

日志组件logback:1.2.3

lombok:1.18.6

3.Spring Batch提供的读-处理-写组件一览

在使用Spring Batch内置的读写组件时,首先我们先弄清楚有哪些组件可以用,按读、写、处理,见下面说明。Spring Batch已提供了比较全面的支持。

3.1 ItemReader

ItemReader

说明

ListItemReader

读取List类型数据,只能读一次

ItemReaderAdapter

ItemReader适配器,可以复用现有的读操作

FlatFileItemReader

读Flat类型文件

StaxEventItemReader

读XML类型文件

JdbcCursorItemReader

基于JDBC游标方式读数据库

HibernateCursorItemReader

基于Hibernate游标方式读数据库

StoredProcedureItemReader

基于存储过程读数据库

JpaPagingItemReader

基于Jpa方式分页读数据库

JdbcPagingItemReader

基于JDBC方式分页读数据库

HibernatePagingItemReader

基于Hibernate方式分页读取数据库

JmsItemReader

读取JMS队列

IteratorItemReader

迭代方式的读组件

MultiResourceItemReader

多文件读组件

MongoItemReader

基于分布式文件存储的数据库 MongoDB读组件

Neo4jItemReader

面向网络的数据库Neo4j的读组件

ResourcesItemReader

基于批量资源的读组件,每次读取返回资源对象 AmqpItemReader读取AMQP队列组件

RepositoryItemReader

基于 Spring Data的读组件

3.2 ItemWriter

ItemWriter

说明

FlatFileItemWriter

写Flat类型文件

MultiResourceItemWriter

多文件写组件

StaxEventItemWriter

写XML类型文件

AmqpItemWriter

写AMQP类型消息

ClassifierCompositeItemWriter

根据 Classifier路由不同的Item到特定的ItemWriter处理

HiberateItemWriter

基于Hibernate方式写数据库

ItemWriterAdapter

ItemWriter适配器,可以复用现有的写服务

JdbcBatchItemWriter

基于JDBC方式写数据库

JmsItemWriter

写JMS队列 JpaItemWriter基于Jpa方式写数据库

GemfireItemWriter

基于分布式数据库Gemfire的写组件

SpELMappingGemfireItemWriter

基于Spring表达式语言写分布式数据库Gemfire的写组件

MimeMessageItemWriter

发送邮件的写组件

MongoItemWriter

基于分布式文件存储的数据库MongoDB写组件

Neo4jItemWriter

面向网络的数据库Neo4j的读组件

PropertyExtractingDelegatingI

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个简单的Spring Boot + Spring Batch + Hibernate + Quartz的批量文件数据的例子: 1. 创建Spring Boot项目 首先,我们需要创建一个Spring Boot项目。可以使用Spring Initializr或者手动创建一个Maven项目。在pom.xml文件中添加相关依赖: ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> </dependencies> ``` 2. 创建Job 接下来,我们要创建一个Job。Job是一个执行具体任务的实体,可以包含一个或多个Step。 ```java @Configuration public class JobConfiguration { @Autowired private JobBuilderFactory jobBuilderFactory; @Autowired private StepBuilderFactory stepBuilderFactory; @Autowired private DataSource dataSource; @Bean public FlatFileItemReader<Person> reader() { FlatFileItemReader<Person> reader = new FlatFileItemReader<>(); reader.setResource(new ClassPathResource("persons.csv")); reader.setLineMapper(new DefaultLineMapper<Person>() {{ setLineTokenizer(new DelimitedLineTokenizer() {{ setNames(new String[]{"firstName", "lastName", "email"}); }}); setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{ setTargetType(Person.class); }}); }}); return reader; } @Bean public PersonItemProcessor processor() { return new PersonItemProcessor(); } @Bean public JpaItemWriter<Person> writer() { JpaItemWriter<Person> writer = new JpaItemWriter<>(); writer.setEntityManagerFactory(entityManagerFactory().getObject()); return writer; } @Bean public Job importUserJob(JobCompletionNotificationListener listener) { return jobBuilderFactory.get("importUserJob") .incrementer(new RunIdIncrementer()) .listener(listener) .flow(step1()) .end() .build(); } @Bean public Step step1() { return stepBuilderFactory.get("step1") .<Person, Person>chunk(10) .reader(reader()) .processor(processor()) .writer(writer()) .build(); } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource); em.setPackagesToScan("com.example.demo"); em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); em.setJpaProperties(additionalProperties()); return em; } private Properties additionalProperties() { Properties properties = new Properties(); properties.setProperty("hibernate.hbm2ddl.auto", "create-drop"); properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect"); return properties; } } ``` Job主要包含以下几个部分: - reader:文件中的数据 - processor:处理每一条数据 - writer:将数据写入数据库 - step:定义一个Step - job:定义一个Job,包含一个或多个Step 3. 创建任务调度 接下来,我们需要创建一个任务调度,使用Quartz来实现。我们可以在应用启动时,自动启动任务调度。以下是一个简单的任务调度配置: ```java @Configuration public class SchedulerConfiguration { @Autowired private JobLauncher jobLauncher; @Autowired private Job importUserJob; @Bean public JobDetail jobDetail() { return JobBuilder.newJob().ofType(SpringJobAdapter.class) .storeDurably() .withIdentity("importUserJob") .withDescription("Invoke Spring batch from quartz") .build(); } @Bean public Trigger trigger(JobDetail job) { SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(60) .repeatForever(); return TriggerBuilder.newTrigger().forJob(job) .withIdentity("importUserTrigger") .withDescription("Simple trigger") .withSchedule(scheduleBuilder) .build(); } @Bean public Scheduler scheduler(Trigger trigger, JobDetail job) throws SchedulerException { SchedulerFactory factory = new StdSchedulerFactory(); Scheduler scheduler = factory.getScheduler(); scheduler.scheduleJob(job, trigger); scheduler.setJobFactory(springBeanJobFactory()); scheduler.start(); return scheduler; } @Bean public SpringBeanJobFactory springBeanJobFactory() { return new AutowiringSpringBeanJobFactory(); } public class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware { private transient AutowireCapableBeanFactory beanFactory; @Override public void setApplicationContext(ApplicationContext context) { beanFactory = context.getAutowireCapableBeanFactory(); } @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { final Object job = super.createJobInstance(bundle); beanFactory.autowireBean(job); return job; } } } ``` 这里我们使用Spring JobAdapter来将Spring Batch的Job包装成Quartz Job。同时,我们也定义了一个Simple Trigger,每隔60秒执行一次。 4. 编写数据处理逻辑 最后,我们需要编写具体的数据处理逻辑。这里我们简单的将取到的Person数据插入到数据库中。以下是一个简单的数据处理类: ```java public class PersonItemProcessor implements ItemProcessor<Person, Person> { @Override public Person process(Person person) throws Exception { return person; } } ``` 5. 创建数据模型 在这个例子中,我们需要处理的数据是Person,我们需要创建一个Person类来描述数据模型: ```java @Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String firstName; private String lastName; private String email; // getter and setter } ``` 6. 创建文件 最后,我们需要创建一个csv文件,用于存储测试数据文件名为persons.csv,内容如下: ```csv firstName,lastName,email John,Doe,[email protected] Jane,Doe,[email protected] Bob,Smith,[email protected] Alice,Smith,[email protected] ``` 7. 运行程序 完成以上步骤后,我们可以运行程序。当程序运行时,任务调度会定时执行任务,将csv文件中的数据插入到数据库中。 总的来说,这是一个简单的Spring Boot + Spring Batch + Hibernate + Quartz的批量文件数据的例子。通过这个例子,可以熟悉Spring Batch的基本使用方法,并了解如何使用Quartz实现任务调度。 ### 回答2: Spring Boot是一种快速开发应用程序的框架,Spring BatchSpring Boot的子项目,用于处理大量数据批量处理任务。在这个用例中,我们可以使用Spring Boot、Spring Batch、Hibernate和Quartz来实现简单的批量文件写入数据。 首先,我们需要在Spring Boot项目中引入Spring Batch和Hibernate的依赖。然后,创建一个包含文件写入数据的批处理任务。 使用Spring BatchItemReader接口从文件中逐行数据。你可以使用FlatFileItemReader类并配置文件路径、行解析器等属性来实现这一步骤。 接下来,使用Hibernate的Entity类和Repository来定义和操作数据表。根据业务需求,创建一个实体类并使用JPA注解配置。然后,创建一个Repository接口,用于查询和保存数据。 在批处理任务的写入步骤中,我们可以使用Hibernate的Session来保存数据。通过调用Repository的save方法,将取到的数据写入数据库。 最后,使用Quartz来触发批处理任务。可以配置Quartz的定时任务,按照一定的时间间隔或特定时间点触发批处理任务的执行。 在整个过程中,我们需要根据实际需求进行配置和开发,确保数据的正确取和写入。可以使用Spring Boot自带的自动配置或者手动配置来实现以上功能。 综上所述,我们可以使用Spring Boot、Spring Batch、Hibernate和Quartz来实现简单的批量文件写入数据的用例。这个用例可以用来处理大量数据的批处理任务,实现数据批量处理和定时执行。 ### 回答3: Spring Boot是一个用于创建独立的、基于Spring的生产级应用程序的框架。它简化了Spring应用程序的配置和部署过程,并提供了一套强大的开发工具和约定,使开发人员能够更快地构建应用程序。 Spring Batch是一个用于批量处理的框架。它提供了一种简单而强大的方式来处理大量的数据,并允许我们以可靠的方式处理失败和重试。它还提供了许多批处理作业开发和管理的功能,如数据源、处理数据并将结果写入目标数据源。 Hibernate是一个用于对象关系映射(ORM)的框架。它简化了Java应用程序与关系数据库之间的交互,并提供了一个对象导向的方式来操作数据。它提供了一种将对象持久化到数据库中的简单方式,并为开发人员提供了一套强大的查询语言(HQL)来执行复杂的数据库查询操作。 Quartz是一个用于任务调度的框架。它允许我们按照预定的时间间隔或时间短划进行任务调度。它还提供了一种强大的任务管理和监控机制,可以处理并发任务,并支持持久化任务调度信息。 下面是一个简单的批量文件并将数据写入数据库的示例: 1. 使用Spring Boot创建一个新的Web应用程序。 2. 导入Spring Batch、Hibernate和Quartz的依赖项。 3. 创建一个包含文件取、数据处理和数据写入Spring Batch作业。 4. 在作业中使用Hibernate作为数据文件的内容。 5. 配置Quartz来调度作业的执行。 6. 在作业中实现一个写入数据库的处理器。 7. 配置Hibernate来将处理后的数据写入数据库。 8. 运行应用程序并观察任务按计划执行,并且文件中的数据被正确地写入数据库。 这个示例演示了如何使用Spring Boot、Spring Batch、Hibernate和Quartz来构建一个简单的批量处理应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值