如何使用 Spring Batch 将嵌套的 XML 写入数据库?

问题描述

我有一个 XML 文件 data 。我的目标是将它放入 mysql 数据库中,其中包含一个名为 predict 的表,该表仅包含四列(area_id、parameter_id、datetime 和 value)。 我设法从所有 XML 数据中读取数据,但无法将数据写入数据库。如何将日志类中读取到的数据写入数据库?

下面,有几个类是我用 spring 批处理配置创建的

区域.java

@XmlRootElement(name="area")
@XmlAccessorType(XmlAccessType.FIELD)
public class Area {

    @XmlAttribute(name = "id")
    private String area_id;

    @XmlElement(name = "parameter")
    private List<Parameter> area=null;

    public List<Parameter> getArea(){
        return area;
    }

    public void setArea(List<Parameter> area){
        this.area = area;
    }

    public Area(){

    }

    public Area(String area_id) {
        this.area_id = area_id;
    }

    @Override
    public String toString() {
        return "Area{" +
                "area_id='" + area_id + '\'' +
                ",area=" + area +
                '}';
    }
}

时间范围.java

@XmlRootElement(name="timerange")
@XmlAccessorType(XmlAccessType.FIELD)
public class TimeRange{

    @XmlElement(name = "value")
    String value;

    @XmlAttribute(name = "datetime")
    String datetime;

    public TimeRange(){

    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getDatetime() {
        return datetime;
    }

    public void setDatetime(String datetime) {
        this.datetime = datetime;
    }

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("TimeRange{");
        sb.append("value='").append(value).append('\'');
        sb.append(",datetime='").append(datetime).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

参数.java

@XmlRootElement(name="parameter")
@XmlAccessorType(XmlAccessType.FIELD)
public class Parameter{

    @XmlAttribute(name="id")
    private String parameter_id;

    @XmlElement(name="timerange")
    public List<TimeRange> parameter;

    public List<TimeRange> getParameter(){
        return parameter;
    }

    public void setParameter(List<TimeRange> parameter){
        this.parameter = parameter;
    }

    public Parameter(){

    }

    public Parameter(String parameter_id) {
        this.parameter_id = parameter_id;
    }

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("Parameter{");
        sb.append("parameter_id='").append(parameter_id).append('\'');
        sb.append(",parameter=").append(parameter);
        sb.append('}');
        return sb.toString();
    }
}

配置.java

@Configuration
public class SpringBatchExampleJobConfig {

    @Bean
    public ItemReader<Area> areaItemReader() {
        Jaxb2Marshaller areaMarshaller = new Jaxb2Marshaller();
        areaMarshaller.setClassesToBeBound(Area.class);

        return new StaxEventItemReaderBuilder<Area>()
                .name("areaReader")
                .resource(new ClassPathResource("data/DigitalForecast-SulawesiTengah.xml"))
                .addFragmentRootElements("area")
                .unmarshaller(areaMarshaller)
                .build();
    }

    @Bean
    public ItemWriter<Area> areaItemWriter(){
        return new LoggingAreaItemWriter();
    }

    /**
     * Creates a bean that represents the only step of our batch job.
     * @param areaItemReader
     * @param step1BuilderFactory
     * @param areaItemWriter
     * @return
     */

    @Bean
    public Step Step1(ItemReader<Area> areaItemReader,ItemWriter<Area> areaItemWriter,StepBuilderFactory step1BuilderFactory) {
        return step1BuilderFactory.get("Step1")
                .<Area,Area>chunk(1)
                .reader(areaItemReader)
                .writer(areaItemWriter)
                .build();
    }

    /**
     * Creates a bean that represents our example batch job.
     * @param Step1
     * @param jobBuilderFactory
     * @return
     */
    @Bean
    public Job areaJob(Step Step1,JobBuilderFactory jobBuilderFactory) {
        return jobBuilderFactory.get("areaJob")
                .incrementer(new RunIdIncrementer())
                .start(Step1)
                .build();
    }
}

和我用来写可读数据结果的日志类

LoggingAreaItemWriter.java

public class LoggingAreaItemWriter implements ItemWriter<Area> {
    private static final Logger LOGGER = LoggerFactory.getLogger(LoggingAreaItemWriter.class);

    @Override
    public void write(List<? extends Area> list) throws Exception {
        LOGGER.info("Writing area: {}",list);
    }
}

结果

Writing area: [Area{area_id='501520',area=[Parameter{parameter_id='hu',parameter=[TimeRange{value='95',datetime='202102010000'},TimeRange{value='80',datetime='202102010600'},TimeRange{value='90',datetime='202102011200'},TimeRange{value='95',datetime='202102011800'},TimeRange{value='85',datetime='202102020000'},TimeRange{value='60',datetime='202102020600'},datetime='202102021200'},datetime='202102021800'},datetime='202102030000'},TimeRange{value='55',datetime='202102030600'},datetime='202102031200'},datetime='202102031800'}]},Parameter{parameter_id='humax',datetime='202102031200'}]},Parameter{parameter_id='tmax',parameter=[TimeRange{value='91.4',TimeRange{value='91.4',Parameter{parameter_id='humin',parameter=[TimeRange{value='80',Parameter{parameter_id='tmin',parameter=[TimeRange{value='75.2',TimeRange{value='73.4',Parameter{parameter_id='t',TimeRange{value='75.2',TimeRange{value='77',TimeRange{value='78.8',Parameter{parameter_id='weather',parameter=[TimeRange{value='1',TimeRange{value='1',TimeRange{value='3',TimeRange{value='0',Parameter{parameter_id='wd',parameter=[TimeRange{value='29230',TimeRange{value='4500',TimeRange{value='2230',TimeRange{value='22500',TimeRange{value='15730',TimeRange{value='27000',TimeRange{value='000',Parameter{parameter_id='ws',parameter=[TimeRange{value='1.028888888',TimeRange{value='10.28888888',TimeRange{value='1.028888888',TimeRange{value='2.57222222',datetime='202102031800'}]}]}]

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)