Spring-Batch处理MySQL数据后存到CSV文件

1 介绍

用Spring Batch实现了个简单的需求,从MySQL中读取用户表数据,根据生日计算年龄,将结果输出到csv文件。

1.1 准备表及数据

user test;
DROP TABLE IF EXISTS `test_user`;
CREATE TABLE  `test_user` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(45) NOT NULL default '',
  `birthday` datetime default NULL,
  `age` int default 0,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO test_user(name, birthday, age) VALUES('小明', '1993-03-09', 0);
INSERT INTO test_user(name, birthday, age) VALUES('Jack', '1973-03-09', 0);
INSERT INTO test_user(name, birthday, age) VALUES('Tom', '1963-03-09', 0);
INSERT INTO test_user(name, birthday, age) VALUES('齐天大圣', '1983-03-09', 0);
INSERT INTO test_user(name, birthday, age) VALUES('星知', '2003-03-09', 0);

2 实现

2.1 项目目录

2.2 实体类

public class TestUser {
    private Integer id;
    private String name;
    private Date birthday;
    private Integer age;
    // set/get...
}

2.3 ItemReader

TestUserConfig.java

@Bean
public JdbcCursorItemReader<TestUser> itemReader(){
    final DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://mysql-server:3306/test");
    dataSource.setUsername("r00t");
    dataSource.setPassword("r00t");

    JdbcCursorItemReader<TestUser> reader = new JdbcCursorItemReader<TestUser>();
    reader.setDataSource(dataSource);
    reader.setSql("SELECT id, name, birthday FROM test_user");
    reader.setRowMapper(new UserRowMapper());
    return reader;
}

2.4 ItemProcessor

TestUserConfig.java

@Bean
public TestUserItemProcessor itemProcessor() {
    return new TestUserItemProcessor();
}

TestUserItemProcessor.java

public class TestUserItemProcessor implements ItemProcessor<TestUser, TestUser> {
    @Override
    public TestUser process(TestUser testUser) throws Exception {
        Calendar cal1 = Calendar.getInstance();
        Calendar cal2 = Calendar.getInstance();
        cal1.setTime(testUser.getBirthday());
        testUser.setAge(cal2.get(Calendar.YEAR) - cal1.get(Calendar.YEAR));
        return testUser;
    }
}

2.5 ItemWriter

TestUserConfig.java

@Bean
public FlatFileItemWriter<TestUser> itemWriter() {
    FlatFileItemWriter<TestUser> itemWriter = new FlatFileItemWriter<>();
    String userHome = System.getProperty("user.home");
    Resource outputResource = new FileSystemResource(userHome + "/output/demo04/test_user.csv");
    itemWriter.setResource(outputResource);
    itemWriter.setLineAggregator(new DelimitedLineAggregator<TestUser>() {{
        setDelimiter(",");
        setFieldExtractor(new BeanWrapperFieldExtractor<TestUser>() {{
            setNames(new String[] { "id", "name", "age" });
        }});
    }});
    return itemWriter;
}

2.6 Job & Step

TestUserConfig.java

@Bean
public Step step1(JdbcCursorItemReader<TestUser> itemReader, TestUserItemProcessor itemProcessor, FlatFileItemWriter<TestUser> itemWriter) {
    return steps.get("step1").<TestUser, TestUser> chunk(10)
        .reader(itemReader)
        .processor(itemProcessor)
        .writer(itemWriter)
        .build();
}

@Bean
public Job job1(Step step1) {
    return jobs.get("job1")
        .incrementer(new RunIdIncrementer())
        .flow(step1)
        .end()
        .build();
}

2.7 测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestUserConfig.class})
public class TestUserTest {
    @Autowired
    private JobLauncherTestUtils jobLauncherTestUtils;

    @Test
    public void givenTaskletsJob_whenJobEnds_thenStatusCompleted() throws Exception {
        JobExecution jobExecution = jobLauncherTestUtils.launchJob();
        assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus());
    }
}

2.8 验证

在用户目录下生成 C:\Users\{your-name}\output\demo04\test_user.csv ,文件内容如下

6,小明,25
7,Jack,45
8,Tom,55
9,齐天大圣,35
10,星知,15

3 总结

通过本例可了解Java配置SringBatch,读取MySQL及写入CSV等。本例完整实现 spring-batch

原文地址:https://www.cnblogs.com/okokabcd/p/9092530.html

时间: 2024-08-30 09:14:40

Spring-Batch处理MySQL数据后存到CSV文件的相关文章

shell脚本每隔2s获取某个进程的cpu和mem数据并保存到csv文件

shell脚本每隔2s获取某个进程的cpu和mem数据并保存到csv文件 shell脚本如下echo "%CPU,%MEM" > cpu_test.csvpid=1 #Can be change by yourselfwhile true do top -bn1 -n 1 -p $pid | tail -1 | awk '{ print $9,$10 }' | sed 's/ /,/' >> cpu_test.csv sleep 2 #delay timedone 脚

笔记:PHP查询mysql数据后中文字符乱码

新建表Clubs CREATE TABLE `Clubs` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(30) CHARACTER SET utf8 NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; id name 1 程序员2 架构师3 产品经

用Python将处理数据得到的csv文件分类(按顺序)保存

用Python中的os和numpy库对文件夹及处理数据后得到的文件进行分类保存: import numpy as np import os for m in range(699,0,-35): cur_dir='F:/2019_09_01/' folder_name='partdata_0_' if not os.path.exists(cur_dir+folder_name+str(m)): os.mkdir(os.path.join(cur_dir,folder_name+str(m)))

直接把数据库中的数据保存在CSV文件中

今天突然去聊就来写一个小小的demo喽,嘿嘿 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.Filter = "CSV文件|*.CSV

python——关于简单爬取博客园班级成员发的博文的题目、发布人、阅读、评论,再存到csv文件中

因为老师要以班里每个人发的博客质量作为最后总成绩的评定的一部分,就要把班上所有同学发的博客都统计起来,可以用来评定的因素有:阅读.评论.推荐等,但因为今天只是做一个简单的爬取,推荐这个元素在班级博客中需要点开每一篇博文才能看到获取,就不爬取了,只爬取阅读和推荐,加上每篇博文的发布人和标题. 我先会放上代码,再逐条解释其含义及作用. 代码如下(其中爬取的网页是以我自己的班级为例): 1 from bs4 import BeautifulSoup 2 import pandas as pd 3 im

mysql SQLyog导入导出csv文件

1.选择数据库表 --> 右击属性 --> 备份/导出 --> 导出表数据作为 --> 选择cvs --> 选择下面的“更改” --> 字段 --> 变量长度 --> 字段被终止 -->输入逗号,(这是重点,否则导出的csv文件内容都在一列中,而不是分字段分列)下面两个选项框取消. 2.导出csv文件后,使用UE编辑器打开,另存为,选择编码为utf-8格式,保存. 3.打开csv文件,这样中文为正确的显示,如果不转码保存的话,为中文乱码. 4.选择数据

es实战之数据导出成csv文件

从es将数据导出分两步: 查询大量数据 将数据生成文件并下载 本篇主要是将第二步,第一步在<es实战之查询大量数据>中已讲述. csv vs excel excel2003不能超过65536, excel2007及以上版本支持1048576条数据.excel支持的数据量有限,并且生生成文件的速度比较慢. csv具有支持写入量大,文件较小的优点. 故选择csv作为导出文件类型. 导出文件的几种方式: 将数据从es中查询出来,在这个大前提下,对比导出文件的速度. 由前端处理 直接将数据返回给前端,

Python提取netCDF数据并转换为csv文件

netCDF全称是network Common Data Format(网络通用数据格式),是由美国大学大气研究协会(University Corporation for Atmospheric Research,UCAR)的Unidata项目科学家针对科学数据的特点开发的,是一种面向数组型并适于网络共享的数据的描述和编码标准.目前,NetCDF广泛应用于大气科学.水文.海洋学.环境模拟.地球物理等诸多领域. 我们使用python对数据进行分析处理,首先我们需要下载安装netCDF4包,可使用p

关于爬取数据保存到json文件,中文是unicode解决方式

流程: 爬取的数据处理为列表,包含字典.里面包含中文, 经过json.dumps,保存到json文件中, 发现里面的中文显示未\ue768这样子 查阅资料发现,json.dumps 有一个参数.ensure_ascii =true,  它会将不是ascii字符的转义为json 字符串. 如果是false ,不是ascii字符的会包含在里面,即如果是中文就会保存中文. 但是我认为json这样写是有道理的. 用requests模块, requests.post(url,json=handled_da