springbatch读取外部数据到mysql

前言

在上一篇springboot整合springbatch中,我们简单介绍了springbatch的基本概念和一个基础使用demo。我们知道springbatch的强大之处在于其批处理数据时的高效、快速以及可自定义执行步骤的处理大批量数据,下面通过一个简单的案例来说说如何使用springbatch读取外部的文件,比如xml、json或其他能被解析的格式的数据导入到mysql中

执行步骤

  1. 定义job类
  2. 配置job中的执行步骤(step)
  3. step中再配置具体的itemReader和itemWriter
  4. itemReader读取数据并解析数据,读取数据的来源可以是磁盘上的日志文件,或者mysql数据或者redis数据,再通过itemWriter将读取到的数据写到指定的存储容器中

在这里插入图片描述

从上图可以看到,读取和写入的数据源是多样的,这样就给实际使用的时候带来了很大的选择上的便利性,下面以一个外部的csv文件为例,模拟一下上述的过程,即通过itemReader读取文件的数据,然后写到mysql的某个表中去

1、job类

注意@EnableBatchProcessing一定不要忘记,如果容易忘,建议放在启动类上面

@Configuration
@EnableBatchProcessing
public class JdbcDemoWriterConfig {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Autowired
    @Qualifier("jdbcBatchItemWriter")
    private ItemWriter<Customer> itemWriter;

    @Autowired
    @Qualifier("dbOutPutFileReader")
    private ItemReader<Customer> itemReader;

    /**
     * job执行入口
     * @return
     */
    @Bean
    public Job dbOutputJob(){
        return jobBuilderFactory.get("dbOutputJob")
                .start(dbOutputStep())
                .build();
    }

    /**
     * 自定义job的执行步骤
     * @return
     */
    @Bean
    public Step dbOutputStep(){
        return stepBuilderFactory.get("dbOutputStep")
                .<Customer,Customer>chunk(10)   //设置每次操作的数据个数
                .reader(itemReader)
                .writer(itemWriter)
                .build();
    }

}

2、自定义的itemReader

通过上一篇的概念讲解,我们知道,itemReader可以理解成数据读取器,通过代码我们知道,ItemReader只是定义了一个接口,里面有很多实现类,正是这些丰富的实现类,才让程序处理的时候非常自由和灵活,可以根据不同的场景选择不同的读取器,
在这里插入图片描述

比如我们这里要读取一个后缀为 ".csv"的文件,就可以使用FlatFileItemReader这种读取器,代码如下:

/**
 * 自定义读取
 */

@Configuration
public class DbOutputReader {

    @Bean
    public FlatFileItemReader<Customer> dbOutPutFileReader() {
        FlatFileItemReader<Customer> reader = new FlatFileItemReader<>();
        reader.setResource(new ClassPathResource("customerInit.csv"));
        //设置是否跳行读取
        reader.setLinesToSkip(1);
        //设置外部文件的字段名
        DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
        tokenizer.setNames(new String[]{"id", "firstName", "lastName", "birthdate"});
        DefaultLineMapper<Customer> lineMapper = new DefaultLineMapper();
        lineMapper.setLineTokenizer(tokenizer);
        //这个有点类似jdbc,将读取到的结果集放在一个resultSet中,只需要解析resultSet的字段值就可以拿到具体的值
        lineMapper.setFieldSetMapper((fieldSet) -> {
            Customer customer = new Customer();
            customer.setId(fieldSet.readString("id"));
            customer.setFirstName(fieldSet.readString("firstName"));
            customer.setLastName(fieldSet.readString("lastName"));
            customer.setBirthdate(fieldSet.readString("birthdate"));
            return customer;
        });
        //检查属性设置是否完成
        lineMapper.afterPropertiesSet();
        reader.setLineMapper(lineMapper);
        return reader;
    }

}

本段代码的逻辑就是自定义了一个csv的文件读取器,将从csv文件中读取到的值,经过解析封装到一个对象的集合中并返回,其实这个FlatFileItemReader还帮助我们做了一个工作,那就是它怎么就知道文件的格式并解析成我们想要的呢?这个就是读取器内部完成的工作,有兴趣的伙伴可以研究下源码

3、自定义的itemWriter

上述通过reader读取到了csv文件的数据并封装到了对象的集合中了以后,下面就要通过itemWriter将数据写到mysql的表中,同样我们发现itemWriter也是一个接口,里面有众多的实现类,我们这里使用JdbcBatchItemWriter
在这里插入图片描述
这样自定义的itemWriter代码如下

/**
 * 自定义writer
 */
@Configuration
public class DbOutputWriter {

    @Autowired
    private DataSource dataSource;

    @Bean
    public JdbcBatchItemWriter<Customer> jdbcBatchItemWriter(){
        JdbcBatchItemWriter<Customer> jdbcBatchItemWriter = new JdbcBatchItemWriter();
        //注入是数据源
        jdbcBatchItemWriter.setDataSource(dataSource);
        String sqlStr = "insert into customer(id,firstName,lastName,birthdate) values(:id,:firstName,:lastName,:birthdate)";
        jdbcBatchItemWriter.setSql(sqlStr);
        jdbcBatchItemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
        return jdbcBatchItemWriter;
    }

}

我这里提前在resources目录下,准备了一个csv文件
在这里插入图片描述

截取了部分内容
在这里插入图片描述

数据库提前创建了一张与之对应的customer表
在这里插入图片描述

下面启动程序,可以看到很快就执行完了,速度还是很快的,可以根据自己的电脑的配置,适当调整chunk的参数,即每次批量执行的数据条数
在这里插入图片描述

本篇就到此结束,最后感谢观看!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Flink是一个分布式流处理框架,能够处理和分析实时数据流。Kafka是一个分布式流式数据处理平台,能够实时地收集、存储和处理大规模数据流。 在Flink读取Kafka数据并将其写入MySQL数据库需要以下步骤: 1. 配置Kafka Consumer:通过配置Kafka Consumer相关的属性,如bootstrap.servers(Kafka的地址)、group.id(消费者组标识)、topic(要读取的主题名称)等。 2. 创建Flink Execution Environment:通过创建Flink执行环境,可以定义Flink作业的运行模式和相关配置。 3. 创建Kafka Data Source:使用Flink的Kafka Consumer API创建一个Kafka数据源,通过指定Kafka Consumer的配置和要读取的主题,可以从Kafka获取数据。 4. 定义数据转换逻辑:根据需要,可以使用Flink提供的转换算子对Kafka数据进行处理,如map、filter、reduce等。 5. 创建MySQL Sink:通过配置MySQL数据库的连接信息,如URL、用户名、密码等,创建一个MySQL数据池。 6. 将数据写入MySQL:通过使用Flink的MySQL Sink API,将经过转换后的数据写入MySQL数据库。可以指定要写入的表名、字段映射关系等。 7. 设置并执行作业:将Kafka数据源和MySQL Sink绑定在一起,并设置作业的并行度,然后执行Flink作业。 通过以上步骤,我们可以将Kafka数据读取出来,并经过转换后写入MySQL数据库,实现了从Kafka到MySQL数据传输。 需要注意的是,在配置Kafka Consumer和MySQL数据库时,要确保其正确性和可用性,以确保数据的正确读取和写入。同时,在处理大规模数据流时,还需要考虑分布式部署、容错性和高可用性等方面的问题,以保证系统的稳定性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小码农叔叔

谢谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值