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

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

  1. 使用scrapy爬取的数据保存到CSV文件中,不使用命令

    pipelines.py文件中 import codecs import csv # 保存到CSV文件中 class CsvPipeline(object): def __init__(self): ...

  2. 使用pandas中的raad_html函数爬取TOP500超级计算机表格数据并保存到csv文件和mysql数据库中

    参考链接:https://www.makcyun.top/web_scraping_withpython2.html #!/usr/bin/env python # -*- coding: utf-8 ...

  3. Mysql加载本地CSV文件

    Mysql加载本地CSV文件 1.系统环境 系统版本:Win10 64位 Mysql版本: 8.0.15 MySQL Community Server - GPL Mysql Workbench版本: ...

  4. Go Web:数据存储(2)——CSV文件

    存储到CSV文件中 1.内存存储 2.CSV文件存储 3.gob序列化存储 本文接上一篇:内存存储. 关于CSV文件的说明,见csv文件格式 当数据存储到了内存中,可以在需要的时候持久化保存到磁盘文件 ...

  5. python爬取当当网的书籍信息并保存到csv文件

    python爬取当当网的书籍信息并保存到csv文件 依赖的库: requests #用来获取页面内容 BeautifulSoup #opython3不能安装BeautifulSoup,但可以安装Bea ...

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

    用Python中的os和numpy库对文件夹及处理数据后得到的文件进行分类保存: import numpy as np import os for m in range(699,0,-35): cur ...

  7. 【Java/JDBC】利用ResultSetMetaData从数据库的某表中获取字段信息并存到csv文件

    代码下载:https://files.cnblogs.com/files/xiandedanteng/FindNotnullColumns20191102-2.rar 这篇还不够完善,请看更完善的续篇 ...

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

    今天突然去聊就来写一个小小的demo喽,嘿嘿 public partial class Form1 : Form { public Form1() { InitializeComponent(); } ...

  9. SQL C# nvarchar类型转换为int类型 多表查询的问题,查询结果到新表,TXT数据读取到控件和数据库,生成在控件中的数据如何存到TXT文件中

    在数据库时候我设计了学生的分数为nvarchar(50),是为了在从TXT文件中读取数据插入到数据库表时候方便,但是在后期由于涉及到统计问题,比如求平均值等,需要int类型才可以,方法是:Conver ...

随机推荐

  1. 单总线协议DS1820代码

    单总线协议DS1820代码 一.DS18B20初始化 (1).数据线拉到低电平"0". (2).延时480微妙(该时间的时间范围可以从480到960微妙). (3).数据线拉到高电 ...

  2. 从零开始开发一款H5小游戏(三) 攻守阵营,赋予粒子新的生命

    本系列文章对应游戏代码已开源 Sinuous game. 每个游戏都会包含场景和角色.要实现一个游戏角色,就要清楚角色在场景中的位置,以及它的运动规律,并能通过数学表达式表现出来. 场景坐标 canv ...

  3. [开源] 分享自己用的 GitHub 分组管理工具.

    CODELF 的 GitHub Star 管理工具, 简洁快速,从开发者角度考虑,用完就走,不给开发者更多的管理负担. http://unbug.github.io/codelf/ 这个工具目前在 G ...

  4. 小程序 wx.getSystemInfoSync 获取 windowHeight 问题

    windowHeight 概念 可使用窗口高度,即:屏幕高度(screenHeight) - 导航(tabbar)高度 存在问题 安卓设备下获取 windowHeight 不能准确得到对应的高度,总是 ...

  5. java中到底什么是继承?

    1.何为继承?What is Inheritance? 在上图中,对于车来讲,汽车就是子类.对于汽车来讲,奔驰就是子类.车是汽车的基类,超类,或说父类.到底什么是继承?马克-to-win,子类把父类的 ...

  6. JavaScript实现科学计算器

    运行效果: 可实现科学计算器的功能,如:PI,sin,cos,tan等 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> ...

  7. 微信jssdk分享(附代码)

    老规矩---demo图: (注释:微信分享只支持右上角三个点触发) ======> 老规矩上菜: 1. 这边我封装了  share.js function allSharefun(param) ...

  8. MySQL安装配置教程(超级详细)

    一. 下载MySQL Mysql官网下载地址:https://downloads.mysql.com/archives/installer/ 1. 选择要安装的版本,本篇文章选择的是5.7.31版本, ...

  9. Java---基本程序结构

    一个完整的Java程序: /** * 文档注释 * * @author wind8 * */ public class Hello { /** * @param args */ public stat ...

  10. 超星尔雅看课刷题小tips

    用chrom浏览器,先安装扩展程序Tampermonkey BETA 然后进入> https://greasyfork.org/zh-CN 找一款适合自己的脚本安装即可刷课.