前言

在之前的一篇中,我们简单介绍了如何通过自定义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数据到外部文件相关推荐

  1. php mysql生成excel文件,PHP导出MySQL数据到Excel文件简单示例

    这篇文章主要为大家详细介绍了PHP导出MySQL数据到Excel文件简单示例,具有一定的参考价值,可以用来参考一下. 对phpPHP导出MySQL数据到Excel文件简单示例感兴趣的小伙伴,下面一起跟 ...

  2. php mysql 输出csv_php使用指定编码导出mysql数据到csv文件的方法

    本文实例讲述了php使用指定编码导出mysql数据到csv文件的方法.分享给大家供大家参考.具体实现方法如下: <?php /* * PHP code to export MySQL data ...

  3. php按列导出excel2010,excel2010官方下载 免费完整版 PHP导出MySQL数据到Excel文件fputcsv...

    这里的方法是利用fputcsv写CSV文件的方法,直接向浏览器输出Excel文件. 复制代码 代码如下: // 输出Excel文件头,可把user.csv换成你要的文件名 header('Conten ...

  4. linux下导入、导出mysql数据库命令 下载文件到本地

    一.下载到本地 yum install lrzsz sz filename  下载 rz filename  上传 linux下导入.导出mysql数据库命令 一.导出数据库用mysqldump命令( ...

  5. PHPExcel使用-使用PHPExcel导出文件-导出MySQL数据

    现在数据库里面有一组数据,我们将它按照不同的难度进行分sheet. 首先我们需要写一个mysql的配置文件- db.config.php(utf-8编码) : <?php $dbconfig= ...

  6. docker导出mysql_Docker 导出 mysql 数据

    前言 前几天无意中在社区看到一个帖子(记一次清空数据仓库的过程),讲的是自己无意中删库的经历.如文中所讲,大多时候删库这件事我们只是耳闻,并没有遇到过,可要是万一呢,到时候恐怕是追悔莫及,而且 mys ...

  7. POI3.8解决导出大数据量excel文件时内存溢出的问题

    POI3.8解决导出大数据量excel文件时内存溢出的问题 参考文章: (1)POI3.8解决导出大数据量excel文件时内存溢出的问题 (2)https://www.cnblogs.com/feng ...

  8. 如何完美解决Sqoop导入导出MySQL数据错位问题

    我发现小伙伴们在使用Sqoop把数据从MySQL导入到Hive的过程中经常会遇到数据错位的问题,虽然最后都是通过添加参数的方法来解决这个问题,但是我认为这并不是一个完美的解决方案,所以花了一点时间研究 ...

  9. 使用navicat 导出mysql数据表文档

    使用navicat 导出mysql数据表文档 mysql语句 执行结果 使用word导出过程 使用导出txt解决问题 wps 制作三线表 mysql语句 SELECTCOLUMN_NAME 字段名,- ...

最新文章

  1. [Ruby01]Class, Module, Object,Kernel的关系
  2. Linux 文件和目录的属性及权限
  3. 阿里云ECS使用cloudfs4oss挂载OSS
  4. php oracle按时间查询,Oracle日期查询:季度、月份、星期等时间信息
  5. VS2008中使用JSONCPP方法小结
  6. python __repr__
  7. TCP、UDP及IP协议总结
  8. 谷歌不修用户泪流:已遭利用且影响所有安卓版本的严重 0day 漏洞 StrandHogg 详情遭曝光...
  9. OpenLayers geojson 进行展示矢量标签展示
  10. 【NovelAI】在QQ群中部署AI画图机器人
  11. UWB定位记录二(DWM1000模组介绍)
  12. UE4打开屏幕键盘/软键盘/虚拟键盘 无法输入中文
  13. 2021概率论与数理统计辅导讲义-余丙森
  14. MIPS架构与指令简介
  15. 用天文方法计算二十四节气
  16. Python Web框架 Django项目搭建与测试详解
  17. python爬取网站的图片
  18. 6-1 判断一个点是否在一个圆的内部 (20 分)
  19. Winform从入门到精通(8)——RichTextBox(史上最全)
  20. Java项目:SSM设备台账管理系统

热门文章

  1. openstack 在线repo
  2. 菜鸟的成长记录--linux 通配符和特殊字符集合的使用
  3. 企业生产环境利用ATIES对服务器进行远程备份
  4. 【编程好习惯】复用代码以提高可维护性
  5. Asp.Net MVC使用HtmlHelper渲染,并传递FormCollection参数的陷阱
  6. 移动端h5监听浏览器返回操作(目前在react项目中用到)
  7. Hadoop学习之路(十三)MapReduce的初识
  8. ALC--软件定义架构的PLC
  9. 老男孩教育学员参观机房实践活动
  10. Python模块之uuid