springbatch导出mysql数据到外部文件
前言
在之前的一篇中,我们简单介绍了如何通过自定义itemReader和itemWriter读取外部数据然后导入到mysql中,下面我们简单介绍一下如何将mysql的数据通过springbatch批量导出
举个实际的场景,我们需要将数据库的某个表的数据导出到excel中,如果数据量特别大的时候使用java单线程去做这个事情,会比较耗时而且容易因为IO问题中途断掉,如果使用springbatch批量读取,就可以大大节省数据读取的时间,当然这只是个很简单的应用场景,下面通过代码简单演示一下
1、定义job类
@Configuration
public class FlatFileDemoJobConfiguration {@Autowiredprivate JobBuilderFactory jobBuilderFactory;@Autowiredprivate StepBuilderFactory stepBuilderFactory;@Autowired@Qualifier("flatFileDemoJdbcPagingReader")private ItemReader<Customer> flatFileDemoJdbcPagingReader;@Autowired@Qualifier("flatFileDemoFlatFileWriter")private ItemWriter<Customer> flatFileDemoFlatFileWriter;@Beanpublic Step flatFileOutputDemoStep() {return stepBuilderFactory.get("flatFileOutputDemoStep").<Customer,Customer>chunk(10).reader(flatFileDemoJdbcPagingReader).writer(flatFileDemoFlatFileWriter).build();}@Beanpublic Job flatFileOutputDemoJob() {return jobBuilderFactory.get("flatFileOutputDemoJob").start(flatFileOutputDemoStep()).build();}
}
2、自定义ItemReader
由于是从数据库读取数据,所以选用JdbcPagingItemReader这个读取器,带有分页的功能
/*** 自定义数据读取器*/
@Configuration
public class FlatFileDemoJobReaderConfiguration {@Autowiredpublic DataSource dataSource;@Beanpublic JdbcPagingItemReader<Customer> flatFileDemoJdbcPagingReader() {JdbcPagingItemReader<Customer> reader = new JdbcPagingItemReader<>();reader.setDataSource(this.dataSource);//设置每次分页读取的条数reader.setFetchSize(10);reader.setRowMapper((rs,rowNum)->{Customer customer = new Customer();customer.setId(rs.getString("id"));customer.setFirstName(rs.getString("firstName"));customer.setLastName(rs.getString("lastName"));customer.setBirthdate(rs.getString("birthdate"));return customer;});//定义查询的数据来源MySqlPagingQueryProvider queryProvider = new MySqlPagingQueryProvider();queryProvider.setSelectClause("id, firstName, lastName, birthdate");queryProvider.setFromClause("from customer");//读取出来的数据进行排序Map<String, Order> sortKeys = new HashMap<>(1);sortKeys.put("id", Order.ASCENDING);queryProvider.setSortKeys(sortKeys);reader.setQueryProvider(queryProvider);return reader;}
}
3、自定义ItemReader
@Configuration
public class FlatFileDemoJobWriterConfiguration {@Beanpublic FlatFileItemWriter<Customer> flatFileDemoFlatFileWriter() throws Exception {FlatFileItemWriter<Customer> itemWriter = new FlatFileItemWriter<>();String path ;File file = new File("E:\\java代码\\springBatch\\out.json");path = file.getAbsolutePath();System.out.println(">> file is created in: " + path);itemWriter.setResource(new FileSystemResource(path));itemWriter.setLineAggregator(new MyCustomerLineAggregator());itemWriter.afterPropertiesSet();return itemWriter;}}
注意这里有一个MyCustomerLineAggregator,即自定义输出的数据格式的转换器,其实可以理解为,你从数据库读取出来的数据,最后输出到文件中展现的格式是怎样的呢?可以有json类型的,也可以是上面的csv类型的,甚至可以是xml的类型,都可以自己指定,MyCustomerLineAggregator代码如下:
public class MyCustomerLineAggregator implements LineAggregator<Customer> {//JSONprivate ObjectMapper mapper = new ObjectMapper();@Overridepublic String aggregate(Customer customer) {try {return mapper.writeValueAsString(customer);} catch (JsonProcessingException e) {throw new RuntimeException("Unable to serialize.",e);}}
}
最终我们希望得到的是一个out.json的json格式的文件,下面启动程序,可以看到生成了一个json文件
打开文件看看,可以看到以json的格式展现的
既然说到这里,我们顺便提供一个简单的解析xml格式的文件的demo,下面直接上代码:
@Configuration
@EnableBatchProcessing
public class XmlFileReaderDemo {@Autowiredprivate JobBuilderFactory jobBuilderFactory;@Autowiredprivate StepBuilderFactory stepBuilderFactory;@Autowired@Qualifier("xmlFileDemoWriter")private ItemWriter<? super Customer> xmlFileWriter;@Beanpublic Job itemXmlFileReader(){return jobBuilderFactory.get("itemXmlFileReader").start(itemXmlFileStep()).build();}@Beanpublic Step itemXmlFileStep() {return stepBuilderFactory.get("itemXmlFileStep").<Customer,Customer>chunk(10).reader(fileXmlDemoReader()).writer(xmlFileWriter).build();}@Bean@StepScopepublic StaxEventItemReader<Customer> fileXmlDemoReader() {StaxEventItemReader<Customer> reader = new StaxEventItemReader();reader.setResource(new ClassPathResource("customer.xml"));reader.setFragmentRootElementName("customer");XStreamMarshaller marshaller = new XStreamMarshaller();Map<String,Class> params = new HashMap<>();params.put("customer",Customer.class);marshaller.setAliases(params);reader.setUnmarshaller(marshaller);return reader;}}
下面是读取的类,即自定义的itemWriter,这里只是做演示,就不再进行数据入库的操作了,直接将读取的数据打印在控制台上
@Component("xmlFileDemoWriter")
public class XmlFileDemoWriter implements ItemWriter<Customer> {@Overridepublic void write(List<? extends Customer> list) throws Exception {for(Customer item : list){System.out.println(item.getFirstName());}}
}
resources目录下,提供一个用于读取的xml文件customer.xml
图中截取了部分的内容,整个结构都是如此
下面启动程序看一下是否能够成功解析出来,最终看到解析到了数据,并打印出了firstName输出到控制台
本篇的讲解到此结束,内容比较浅显,有兴趣的同学可深入研究,最后感谢观看!
springbatch导出mysql数据到外部文件相关推荐
- php mysql生成excel文件,PHP导出MySQL数据到Excel文件简单示例
这篇文章主要为大家详细介绍了PHP导出MySQL数据到Excel文件简单示例,具有一定的参考价值,可以用来参考一下. 对phpPHP导出MySQL数据到Excel文件简单示例感兴趣的小伙伴,下面一起跟 ...
- php mysql 输出csv_php使用指定编码导出mysql数据到csv文件的方法
本文实例讲述了php使用指定编码导出mysql数据到csv文件的方法.分享给大家供大家参考.具体实现方法如下: <?php /* * PHP code to export MySQL data ...
- php按列导出excel2010,excel2010官方下载 免费完整版 PHP导出MySQL数据到Excel文件fputcsv...
这里的方法是利用fputcsv写CSV文件的方法,直接向浏览器输出Excel文件. 复制代码 代码如下: // 输出Excel文件头,可把user.csv换成你要的文件名 header('Conten ...
- linux下导入、导出mysql数据库命令 下载文件到本地
一.下载到本地 yum install lrzsz sz filename 下载 rz filename 上传 linux下导入.导出mysql数据库命令 一.导出数据库用mysqldump命令( ...
- PHPExcel使用-使用PHPExcel导出文件-导出MySQL数据
现在数据库里面有一组数据,我们将它按照不同的难度进行分sheet. 首先我们需要写一个mysql的配置文件- db.config.php(utf-8编码) : <?php $dbconfig= ...
- docker导出mysql_Docker 导出 mysql 数据
前言 前几天无意中在社区看到一个帖子(记一次清空数据仓库的过程),讲的是自己无意中删库的经历.如文中所讲,大多时候删库这件事我们只是耳闻,并没有遇到过,可要是万一呢,到时候恐怕是追悔莫及,而且 mys ...
- POI3.8解决导出大数据量excel文件时内存溢出的问题
POI3.8解决导出大数据量excel文件时内存溢出的问题 参考文章: (1)POI3.8解决导出大数据量excel文件时内存溢出的问题 (2)https://www.cnblogs.com/feng ...
- 如何完美解决Sqoop导入导出MySQL数据错位问题
我发现小伙伴们在使用Sqoop把数据从MySQL导入到Hive的过程中经常会遇到数据错位的问题,虽然最后都是通过添加参数的方法来解决这个问题,但是我认为这并不是一个完美的解决方案,所以花了一点时间研究 ...
- 使用navicat 导出mysql数据表文档
使用navicat 导出mysql数据表文档 mysql语句 执行结果 使用word导出过程 使用导出txt解决问题 wps 制作三线表 mysql语句 SELECTCOLUMN_NAME 字段名,- ...
最新文章
- [Ruby01]Class, Module, Object,Kernel的关系
- Linux 文件和目录的属性及权限
- 阿里云ECS使用cloudfs4oss挂载OSS
- php oracle按时间查询,Oracle日期查询:季度、月份、星期等时间信息
- VS2008中使用JSONCPP方法小结
- python __repr__
- TCP、UDP及IP协议总结
- 谷歌不修用户泪流:已遭利用且影响所有安卓版本的严重 0day 漏洞 StrandHogg 详情遭曝光...
- OpenLayers geojson 进行展示矢量标签展示
- 【NovelAI】在QQ群中部署AI画图机器人
- UWB定位记录二(DWM1000模组介绍)
- UE4打开屏幕键盘/软键盘/虚拟键盘 无法输入中文
- 2021概率论与数理统计辅导讲义-余丙森
- MIPS架构与指令简介
- 用天文方法计算二十四节气
- Python Web框架 Django项目搭建与测试详解
- python爬取网站的图片
- 6-1 判断一个点是否在一个圆的内部 (20 分)
- Winform从入门到精通(8)——RichTextBox(史上最全)
- Java项目:SSM设备台账管理系统