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 ...
随机推荐
- ubuntu 20.04 安装 ros1 和ros2
ubuntu 选择Hong Kong 源 1. ROS1安装 添加 sources.list(设置你的电脑可以从 packages.ros.org 接收软件.) sudo sh -c '. /etc ...
- Python函数-导入模块的顺序及原理
引入 当python导入模块,执行import语句时,到底进行了什么操作?按照python的文档,她执行了如下的操作: 第一步,创建一个新的module对象(它可能包含多个module) 第二步,把这 ...
- 【C++】智能指针详解
转自:https://blog.csdn.net/flowing_wind/article/details/81301001 参考资料:<C++ Primer中文版 第五版>我们知道除了静 ...
- 纯干货数学推导_傅里叶级数与傅里叶变换_Part4_傅里叶级数的复数形式
- 纯css模拟电子钟
先看效果 演示地址: https://yueminhu.github.io/di...点击左边拉环切换夜间模式. 用到了伪元素生成数字的小三角`currentColor和color: inherit` ...
- HTML5 & CSS3 内容收集(1)
1. HTML发展历史介绍 2. 浏览器支持 2.1 新增标签支持 在html5 中新增了很多的标签,其中包括8个新增语义结构标签.header, section, footer, aside, na ...
- vue+koa2即时聊天,实时推送比特币价格,爬取电影网站
技术栈 vue+vuex+vue-router+socket.io+koa2+mongodb+pm2自动化部署+图灵机器人+[npm script打包,cdn同步,服务器上传一个命令全搞定] 功能清单 ...
- java中线程有什么用?
线程有什么用? 通过引入线程技术,在浏览器中你可以浏览网页的同时,播放动画和声音效果,同时在后台打印一个页面.例如老板可以同时处理工程师,秘书和清洁人员的事,这 就是多线程处理机制.Within th ...
- idea 配置mapper.xml代码提示
从代码跳转mapper文件的插件: 在mapper文件中添加dtd约束: 1.下载dtd约束文件 http://mybatis.org/dtd/mybatis-3-config.dtd http: ...
- Spring Boot-场景启动器
分析上文快速入门 1.查看pom文件导入的依赖(starter的父项目) <parent> <artifactId>spring-boot-starter-parent< ...