mysql - 如何使用 Spring Batch 将嵌套 XML 写入数据库?
问题描述
我有一个 XML 文件数据。我的目标是将它放在mysql数据库中,其中包含一个名为forecast的表,其中只包含四列(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();
}
}
配置文件
@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'}, TimeRange{value='90', datetime='202102021200'}, TimeRange{value='90', datetime='202102021800'}, TimeRange{value='85', datetime='202102030000'}, TimeRange{value='55', datetime='202102030600'}, TimeRange{value='95', datetime='202102031200'}, TimeRange{value='95', datetime='202102031800'}]}, Parameter{parameter_id='humax', parameter=[TimeRange{value='95', datetime='202102011200'}, TimeRange{value='95', datetime='202102021200'}, TimeRange{value='95', datetime='202102031200'}]}, Parameter{parameter_id='tmax', parameter=[TimeRange{value='91.4', datetime='202102011200'}, TimeRange{value='91.4', datetime='202102021200'}, TimeRange{value='91.4', datetime='202102031200'}]}, Parameter{parameter_id='humin', parameter=[TimeRange{value='80', datetime='202102011200'}, TimeRange{value='60', datetime='202102021200'}, TimeRange{value='55', datetime='202102031200'}]}, Parameter{parameter_id='tmin', parameter=[TimeRange{value='75.2', datetime='202102011200'}, TimeRange{value='73.4', datetime='202102021200'}, TimeRange{value='73.4', datetime='202102031200'}]}, Parameter{parameter_id='t', parameter=[TimeRange{value='75.2', datetime='202102010000'}, TimeRange{value='91.4', datetime='202102010600'}, TimeRange{value='75.2', datetime='202102011200'}, TimeRange{value='73.4', datetime='202102011800'}, TimeRange{value='77', datetime='202102020000'}, TimeRange{value='91.4', datetime='202102020600'}, TimeRange{value='77', datetime='202102021200'}, TimeRange{value='75.2', datetime='202102021800'}, TimeRange{value='78.8', datetime='202102030000'}, TimeRange{value='91.4', datetime='202102030600'}, TimeRange{value='77', datetime='202102031200'}, TimeRange{value='73.4', datetime='202102031800'}]}, Parameter{parameter_id='weather', parameter=[TimeRange{value='1', datetime='202102010000'}, TimeRange{value='1', datetime='202102010600'}, TimeRange{value='1', datetime='202102011200'}, TimeRange{value='3', datetime='202102011800'}, TimeRange{value='1', datetime='202102020000'}, TimeRange{value='1', datetime='202102020600'}, TimeRange{value='1', datetime='202102021200'}, TimeRange{value='3', datetime='202102021800'}, TimeRange{value='3', datetime='202102030000'}, TimeRange{value='1', datetime='202102030600'}, TimeRange{value='0', datetime='202102031200'}, TimeRange{value='3', datetime='202102031800'}]}, Parameter{parameter_id='wd', parameter=[TimeRange{value='29230', datetime='202102010000'}, TimeRange{value='4500', datetime='202102010600'}, TimeRange{value='2230', datetime='202102011200'}, TimeRange{value='22500', datetime='202102011800'}, TimeRange{value='22500', datetime='202102020000'}, TimeRange{value='4500', datetime='202102020600'}, TimeRange{value='15730', datetime='202102021200'}, TimeRange{value='22500', datetime='202102021800'}, TimeRange{value='27000', datetime='202102030000'}, TimeRange{value='000', datetime='202102030600'}, TimeRange{value='000', datetime='202102031200'}, TimeRange{value='27000', datetime='202102031800'}]}, Parameter{parameter_id='ws', parameter=[TimeRange{value='1.028888888', datetime='202102010000'}, TimeRange{value='10.28888888', datetime='202102010600'}, TimeRange{value='1.028888888', datetime='202102011200'}, TimeRange{value='1.028888888', datetime='202102011800'}, TimeRange{value='1.028888888', datetime='202102020000'}, TimeRange{value='10.28888888', datetime='202102020600'}, TimeRange{value='1.028888888', datetime='202102021200'}, TimeRange{value='1.028888888', datetime='202102021800'}, TimeRange{value='1.028888888', datetime='202102030000'}, TimeRange{value='0', datetime='202102030600'}, TimeRange{value='0', datetime='202102031200'}, TimeRange{value='2.57222222', datetime='202102031800'}]}]}]
解决方案
请添加 JDBC 编写器,而不是像下面这样的日志记录器。
@Bean
public JdbcBatchItemWriter<UnifiedInvoiceDTO> summaryWriter() {
JdbcBatchItemWriter<UnifiedInvoiceDTO> databaseItemWriter = new JdbcBatchItemWriter<>();
databaseItemWriter.setDataSource(dataSource);
databaseItemWriter.setSql("YOUR SQL");
ItemPreparedStatementSetter<UnifiedInvoiceDTO> invoicePreparedStatementSetter = new InvoiceSummarySetter();
databaseItemWriter.setItemPreparedStatementSetter(invoicePreparedStatementSetter);
return databaseItemWriter;
}
public class InvoiceSummarySetter implements ItemPreparedStatementSetter<UnifiedInvoiceDTO> {
Logger logger = LoggerFactory.getLogger(InvoiceSummarySetter.class);
@Override
public void setValues(UnifiedInvoiceDTO invoiceDTO, PreparedStatement preparedStatement) throws SQLException {
preparedStatement.setString(1, invoiceDTO.getTypeInvInfo().getAccountNumber());
}
推荐阅读
- r - 如何从r中的ggplot中提取密度值
- excel - VBA:为什么打开随机语句失败?
- javascript - 如果它们包含完成,我是否需要在 try/catch 中包装 jest 测试
- flutter - 在下一页调用 Navigator.of().pop() 时重新加载上一页
- reactjs - onMouseMove + useState 在自定义轮播上滞后
- node.js - Res.send() 返回空数组
- xml - 如何修复 xml 模式文件中的命名空间错误
- rabbitmq - 无法在 RabbitMQ 中接收消息并且 UI 显示空队列
- java - Selenium 无法在字段集标记内的表单中输入元素
- flutter - 如何在 vscode 上键入时禁用提示