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
Spring-Batch处理MySQL数据后存到CSV文件的更多相关文章
- 使用scrapy爬取的数据保存到CSV文件中,不使用命令
pipelines.py文件中 import codecs import csv # 保存到CSV文件中 class CsvPipeline(object): def __init__(self): ...
- 使用pandas中的raad_html函数爬取TOP500超级计算机表格数据并保存到csv文件和mysql数据库中
参考链接:https://www.makcyun.top/web_scraping_withpython2.html #!/usr/bin/env python # -*- coding: utf-8 ...
- Mysql加载本地CSV文件
Mysql加载本地CSV文件 1.系统环境 系统版本:Win10 64位 Mysql版本: 8.0.15 MySQL Community Server - GPL Mysql Workbench版本: ...
- Go Web:数据存储(2)——CSV文件
存储到CSV文件中 1.内存存储 2.CSV文件存储 3.gob序列化存储 本文接上一篇:内存存储. 关于CSV文件的说明,见csv文件格式 当数据存储到了内存中,可以在需要的时候持久化保存到磁盘文件 ...
- python爬取当当网的书籍信息并保存到csv文件
python爬取当当网的书籍信息并保存到csv文件 依赖的库: requests #用来获取页面内容 BeautifulSoup #opython3不能安装BeautifulSoup,但可以安装Bea ...
- 用Python将处理数据得到的csv文件分类(按顺序)保存
用Python中的os和numpy库对文件夹及处理数据后得到的文件进行分类保存: import numpy as np import os for m in range(699,0,-35): cur ...
- 【Java/JDBC】利用ResultSetMetaData从数据库的某表中获取字段信息并存到csv文件
代码下载:https://files.cnblogs.com/files/xiandedanteng/FindNotnullColumns20191102-2.rar 这篇还不够完善,请看更完善的续篇 ...
- 直接把数据库中的数据保存在CSV文件中
今天突然去聊就来写一个小小的demo喽,嘿嘿 public partial class Form1 : Form { public Form1() { InitializeComponent(); } ...
- SQL C# nvarchar类型转换为int类型 多表查询的问题,查询结果到新表,TXT数据读取到控件和数据库,生成在控件中的数据如何存到TXT文件中
在数据库时候我设计了学生的分数为nvarchar(50),是为了在从TXT文件中读取数据插入到数据库表时候方便,但是在后期由于涉及到统计问题,比如求平均值等,需要int类型才可以,方法是:Conver ...
随机推荐
- 单总线协议DS1820代码
单总线协议DS1820代码 一.DS18B20初始化 (1).数据线拉到低电平"0". (2).延时480微妙(该时间的时间范围可以从480到960微妙). (3).数据线拉到高电 ...
- 从零开始开发一款H5小游戏(三) 攻守阵营,赋予粒子新的生命
本系列文章对应游戏代码已开源 Sinuous game. 每个游戏都会包含场景和角色.要实现一个游戏角色,就要清楚角色在场景中的位置,以及它的运动规律,并能通过数学表达式表现出来. 场景坐标 canv ...
- [开源] 分享自己用的 GitHub 分组管理工具.
CODELF 的 GitHub Star 管理工具, 简洁快速,从开发者角度考虑,用完就走,不给开发者更多的管理负担. http://unbug.github.io/codelf/ 这个工具目前在 G ...
- 小程序 wx.getSystemInfoSync 获取 windowHeight 问题
windowHeight 概念 可使用窗口高度,即:屏幕高度(screenHeight) - 导航(tabbar)高度 存在问题 安卓设备下获取 windowHeight 不能准确得到对应的高度,总是 ...
- java中到底什么是继承?
1.何为继承?What is Inheritance? 在上图中,对于车来讲,汽车就是子类.对于汽车来讲,奔驰就是子类.车是汽车的基类,超类,或说父类.到底什么是继承?马克-to-win,子类把父类的 ...
- JavaScript实现科学计算器
运行效果: 可实现科学计算器的功能,如:PI,sin,cos,tan等 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> ...
- 微信jssdk分享(附代码)
老规矩---demo图: (注释:微信分享只支持右上角三个点触发) ======> 老规矩上菜: 1. 这边我封装了 share.js function allSharefun(param) ...
- MySQL安装配置教程(超级详细)
一. 下载MySQL Mysql官网下载地址:https://downloads.mysql.com/archives/installer/ 1. 选择要安装的版本,本篇文章选择的是5.7.31版本, ...
- Java---基本程序结构
一个完整的Java程序: /** * 文档注释 * * @author wind8 * */ public class Hello { /** * @param args */ public stat ...
- 超星尔雅看课刷题小tips
用chrom浏览器,先安装扩展程序Tampermonkey BETA 然后进入> https://greasyfork.org/zh-CN 找一款适合自己的脚本安装即可刷课.