Spring Batch 例子: 从数据库导出分隔符文件

来源:互联网 发布:l28t手环软件 编辑:程序博客网 时间:2024/06/06 04:15

– Start
假设我们有如下表。

CREATE TABLE PEOPLE(    ID    NUMBER(8,0),     NAME  VARCHAR2(30));

我们需要把表中的数据导出到如下的分隔符文件中,有标题行和结尾行。

id|name1|zhangsan2|lisi3|wangwuTotal line|3

让我们来看看代码吧。

<?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns="http://www.springframework.org/schema/beans"    xmlns:batch="http://www.springframework.org/schema/batch"    xsi:schemaLocation="http://www.springframework.org/schema/batch         http://www.springframework.org/schema/batch/spring-batch.xsd        http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans.xsd">    <!-- 定义  dataSource -->    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />        <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />        <property name="username" value="hr" />        <property name="password" value="123456" />    </bean>    <!-- 定义 jdbc 事务管理器 -->    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <property name="dataSource" ref="dataSource"/>    </bean>    <!-- 定义 jobRepository, 用来持久化 job -->    <batch:job-repository id="jobRepository" data-source="dataSource" transaction-manager="transactionManager"/>    <!-- 定义 jobLauncher, 来用运行 job -->    <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">        <property name="jobRepository" ref="jobRepository" />    </bean>    <!-- 定义 job -->    <batch:job id="extractFileJob" job-repository="jobRepository">        <batch:step id="extractFileStep">            <batch:tasklet>                <batch:chunk reader="extractFileReader" processor="extractFileProcessor" writer="extractFileWriter" commit-interval="10"/>            </batch:tasklet>        </batch:step>    </batch:job>    <!-- 定义 reader -->    <bean id="extractFileReader" class="org.springframework.batch.item.database.JdbcCursorItemReader" scope="step">        <property name="dataSource" ref="dataSource"/>        <property name="sql" value="select * from people"/>        <property name="rowMapper">            <bean class="shangbo.springbatch.example4.PeopleRowMapper"/>        </property>    </bean>    <!-- 定义 processor -->    <bean id="extractFileProcessor" class="org.springframework.batch.item.support.PassThroughItemProcessor" scope="step"/>    <!-- 定义 writer -->    <bean id="extractFileWriter" class="shangbo.springbatch.example4.MyFileItemWriter" scope="step">        <property name="header" value="id|name"/>        <property name="delegate" ref="targetFileWriter"/>    </bean>    <bean id="targetFileWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">        <!-- 文件编码方式 -->        <property name="encoding" value="UTF-8" />        <property name="resource" value="file:///D:/0_Shangbo/Dev/Workspace/people_#{jobParameters['business_date']}.txt" />        <property name="headerCallback" ref="extractFileWriter"/>        <property name="footerCallback" ref="extractFileWriter"/>        <property name="lineAggregator">            <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">                <property name="delimiter" value="|"/>                <property name="fieldExtractor">                    <bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">                        <property name="names" value="id,name"/>                    </bean>                </property>            </bean>        </property>    </bean></beans>
package shangbo.springbatch.example4;public class People implements java.io.Serializable{    private static final long serialVersionUID = 8904705906008476310L;    private Integer id;    private String name;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}
package shangbo.springbatch.example4;import java.sql.ResultSet;import java.sql.SQLException;import org.springframework.jdbc.core.RowMapper;public class PeopleRowMapper implements RowMapper<People> {    @Override    public People mapRow(ResultSet rs, int rowNum) throws SQLException {        People p = new People();        p.setId(rs.getInt(1));        p.setName(rs.getString(2));        return p;    }}
package shangbo.springbatch.example4;import java.io.IOException;import java.io.Writer;import java.util.List;import org.springframework.batch.item.ExecutionContext;import org.springframework.batch.item.ItemStreamException;import org.springframework.batch.item.ItemStreamWriter;import org.springframework.batch.item.file.FlatFileFooterCallback;import org.springframework.batch.item.file.FlatFileHeaderCallback;public class MyFileItemWriter implements FlatFileFooterCallback, FlatFileHeaderCallback, ItemStreamWriter<People> {    private ItemStreamWriter<People> delegate;    private String header;    private int totalLine = 0;    // Override from FlatFileHeaderCallback    @Override    public void writeHeader(Writer writer) throws IOException {        writer.write(header);    }    // Override from FlatFileFooterCallback    @Override    public void writeFooter(Writer writer) throws IOException {        writer.write("Total line|" + totalLine);    }    // Override from ItemStreamWriter    @Override    public void write(List<? extends People> items) throws Exception {        totalLine += items.size();        delegate.write(items);    }    @Override    public void open(ExecutionContext executionContext) throws ItemStreamException {        delegate.open(executionContext);    }    @Override    public void update(ExecutionContext executionContext) throws ItemStreamException {        delegate.update(executionContext);    }    @Override    public void close() throws ItemStreamException {        delegate.close();    }    // Setter    public void setDelegate(ItemStreamWriter<People> delegate) {        this.delegate = delegate;    }    public void setHeader(String header) {        this.header = header;    }}
package shangbo.springbatch.example4;import java.util.HashMap;import java.util.Map;import org.springframework.batch.core.Job;import org.springframework.batch.core.JobParameter;import org.springframework.batch.core.JobParameters;import org.springframework.batch.core.JobParametersInvalidException;import org.springframework.batch.core.launch.JobLauncher;import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;import org.springframework.batch.core.repository.JobRestartException;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {    public static void main(String[] args) throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException {        ApplicationContext context = new ClassPathXmlApplicationContext("shangbo/springbatch/example4/ExtractFileJob.xml");        // job 和 job 参数        Map<String,JobParameter> parameters = new HashMap<>();        parameters.put("business_date", new JobParameter("20170719"));        JobParameters jobParameters = new JobParameters(parameters);        Job job = context.getBean(Job.class);        // 运行 job        JobLauncher jobLauncher = context.getBean(JobLauncher.class);        jobLauncher.run(job, jobParameters);    }}

更多参见:Spring Batch 精萃
– 声 明:转载请注明出处
– Last Updated on 2017-07-19
– Written by ShangBo on 2017-07-19
– End