Springbatch数据处理常用的4种demo

 

首先你需要知道Spring Batch是什么? Spring Batch是一个基于Spring的企业级批处理框架,所谓企业批处理就是指在企业级应用中,不需要人工干预,定期读取数据,进行相应的业务处理之后,再进行归档的这类操作。从上面的描述中可以看出,批处理的整个流程可以明显的分为3个阶段: 1、读数据 2、业务处理 3、归档结果数据 另外,从定义中可以发现批处理的一个重要特色就是无需人工干预、定期执行,因此一个批处理框架,需要关注事务的粒度,日志监控,执行方式,资源管理,读数据,处理数据,写数据的解耦等方面。 SpringBatch为我们提供了什么呢? 1、统一的读写接口 2、丰富的任务处理方式、 3、灵活的事务管理及并发处理 4、日志、监控、任务重启与跳过等特性 注意,Spring Batch未提供关于批处理任务调度的功能,因此如何周期性的调用批处理任务需要自己想办法解决,比如使用Springboot定时任务等(如果需要了解请看我前段时间发的Springboot学习笔记,上面有3中定时任务实现方式)

 

此demo有4种:读文件--处理--写入文件;读文件--处理-写入数据库;读数据库-处理-写入数据库;读数据库--处理--写入文件;大部分是配置文件, demo下载在下面,不需要注册就能直接下载。下面贴出来核心配置和容易出错的地方。demo包括建表语句,和输入文件,记得先修改数据库信息,建好表。

点击下载:Springbatch数据处理常用的4种demo

 

方式:读文件--处理--写文件

<!-- 读取文件配置 --> <bean id="productReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step"> <!--这里输入文件是使用动态传入的方式,注释掉的是写死的方式,二者选择其一即可--> <!-- <property name="resource" value="file:./sample.csv" /> --> <property name="resource" value="file:#{jobParameters['inputFile']}"/> <!--跳过的行数 --> <property name="linesToSkip" value="1"/> <!--如何把一行数据映射成为一个模型 --> <property name="lineMapper"> <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper"> <!-- The lineTokenizer divides individual lines up into units of work --> <property name="lineTokenizer"> <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> <!--为读取一行数据分配名称,如有多个,则此处多个值 --> <property name="names" value="id,name,description,quantity"/> </bean> </property> <!-- 根据上面的字段如何映射成为模型,注意java 类中的read("XXX")属性 --> <property name="fieldSetMapper"> <bean class="com.wll.demo.FTF.ProductFieldSetMapper"/> </property> </bean> </property> </bean><bean id="FTF_productWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step"> <!--输出文件路径和名称,当前没有这个文件,所以是红色--> <property name="resource" value="file:src/outputFile.txt"/> <property name="lineAggregator"> <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator"> <!--delimiter标示输出的字段以什么分割--> <property name="delimiter" value=","></property> <!--fieldExtractor 将Pojo对象组装成由Pojo对象的字段组成的一个字符串。同样FlatFileItemWriter写一条记录也有以下四步完成: 1,Processor传递过来一个对象给lineAggregator;2,lineAggregator将其这个对象转化成一个数组; 3,再由lineAggregator的属性fieldExtractor将数组转化成按照delimiter分割一个字符串;4,将这个字符串输出。--> <property name="fieldExtractor"> <bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor"> <property name="names" value="id,name,description,quantity"/> </bean> </property> </bean> </property> </bean>
方式:读文件--处理--写数据库

公共配置文件里面有数据源和JdbcTemplate配置,所以在写到数据库的时候直接自动装载了个JdbcTemplate把数据插进去了。读文件和上面一样。

方式:读数据库--处理--写入数据库

注意需要配置2个数据源,如果是Springboo可以配置多数据源。其他项目可以多配置一套JdbcTemplate即可,下面贴出读数据库配置:

<!--基于游标方式从数据库读取数据--> <bean id="jdbcItemReader" class="org.springframework.batch.item.database.JdbcCursorItemReader" scope="step"> <!--此处dataSource是链接到 源 数据库--> <property name="dataSource" ref="dataSource"/> <!--需要执行的sql,可以动态传入,写死是: select id,name,description,quantity from product where id &lt; ?--> <property name="sql" value="#{jobParameters['sql']}"/> <property name="rowMapper"> <bean class="org.springframework.jdbc.core.BeanPropertyRowMapper"> <!--根据字段查询到的列,映射成为那个实体类--> <property name="mappedClass" value="com.wll.demo.DTD.Product"/> </bean> </property> <!--sql中参数配置器 如果sql中没有需要传入的参数,则不需要引入preparedStatementSetter <property name="preparedStatementSetter" ref="paramStatementSetter"/>--> </bean> <bean id="paramStatementSetter" class="org.springframework.batch.core.resource.ListPreparedStatementSetter" scope="step"> <property name="parameters"> <!--sql中参数列表--> <list> <value>#{jobParameters['id']}</value> </list> </property> </bean>
方式:读数据库-处理-写入文件:

配置和上面差不多,具体看demo,我怕又有人说配置太长。