Spring Batch XML到MySQL
在本章中,我们将创建一个使用XML Reader和MySQL Writer的Spring Batch应用程序。
读取器 - 在应用程序中使用的读取器是StaxEventItemReader
,用于从XML文档读取数据。
以下是应用程序中使用的输入XML文档。 此文档包含指定详细信息的数据记录,如教程ID,教程作者,教程标题,提交日期,教程图标和教程说明。
完整的项目目录结构如下所示 -
文件:tutorials.xml -
<?xml version="1.0" encoding="UTF-8"?> <tutorials> <tutorial> <tutorial_id>1001</tutorial_id> <tutorial_author>Sansu</tutorial_author> <tutorial_title>Learn Java</tutorial_title> <submission_date>06-05-2007</submission_date> <tutorial_icon>http://www.zyiz.net/java/images/java-minilogo.jpg</tutorial_icon> <tutorial_description>Java is a high-level programming language originally developed by Sun Microsystems and released in 1995. Java runs on a variety of platforms. This tutorial gives a complete understanding of Java.');</tutorial_description> </tutorial> <tutorial> <tutorial_id>1002</tutorial_id> <tutorial_author>Maxsu</tutorial_author> <tutorial_title>MySQL学习</tutorial_title> <submission_date>19-04-2007</submission_date> <tutorial_icon>http://www.zyiz.net/mysql/images/mysql-minilogo.jpg</tutorial_icon> <tutorial_description>MySQL is the most popular Open Source Relational SQL database management system. MySQL is one of the best RDBMS being used for developing web-based software applications. This tutorial will give you quick start with MySQL and make you comfortable with MySQL programming.</tutorial_description> </tutorial> <tutorial> <tutorial_id>1003</tutorial_id> <tutorial_author>Kobe</tutorial_author> <tutorial_title>Learn JavaFX</tutorial_title> <submission_date>06-07-2017</submission_date> <tutorial_icon>http://www.zyiz.net/javafx/images/javafx-minilogo.jpg</tutorial_icon> <tutorial_description>JavaFX is a Java library used to build Rich Internet Applications. The applications developed using JavaFX can run on various devices such as Desktop Computers, Mobile Phones, TVs, Tablets, etc. This tutorial, discusses all the necessary elements of JavaFX that are required to develop effective Rich Internet Applications</tutorial_description> </tutorial> </tutorials>
Writer - 在应用程序中使用的写入器是JdbcBatchItemWriter
,用于将数据写入MySQL数据库。 假设在testdb
的数据库中创建了一个tutorials
表。使用以下SQL语句创建创建表:
CREATE TABLE testdb.tutorials( tutorial_id int(10) NOT NULL, tutorial_author VARCHAR(20), tutorial_title VARCHAR(50), submission_date VARCHAR(20), tutorial_icon VARCHAR(200), tutorial_description VARCHAR(1000) );
处理器 - 在应用程序中使用的处理器是一个自定义处理器,它将每个记录的数据写入PDF文档。
在批处理过程中,如果读取了“n”
个记录或数据元素,那么对于每个记录,它将读取数据,处理数据并将数据写入Writer
。要处理数据,它在通过的处理器上进行中继。 在这种情况下,在自定义处理器类中,我们编写代码来加载特定的PDF文档,创建新页面,并以表格格式将数据项写入PDF。
最后,如果您执行此应用程序,它将读取XML文档中的所有数据项,将它们存储在MySQL数据库中,并将它们打印到单个页面中给定的PDF文档中。
jobconfig.xml
以下是示例Spring Batch应用程序的配置文件。 在这个文件中,我们将定义Job和step。 除此之外,还为ItemReader
,ItemProcessor
和ItemWriter
定义了bean。 (在这里,我们将它们与它们各自的类相关联,并传递所需属性的值来配置它们。)
<beans xmlns = "http://www.springframework.org/schema/beans" xmlns:batch = "http://www.springframework.org/schema/batch" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:util = "http://www.springframework.org/schema/util" xsi:schemaLocation = "http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd "> <import resource = "context.xml" /> <bean id = "itemProcessor" class = "com.zyiz.CustomItemProcessor" /> <batch:job id = "helloWorldJob"> <batch:step id = "step1"> <batch:tasklet> <batch:chunk reader = "xmlItemReader" writer = "mysqlItemWriter" processor = "itemProcessor" commit-interval="10000"> </batch:chunk> </batch:tasklet> </batch:step> </batch:job> <bean id = "xmlItemReader" class = "org.springframework.batch.item.xml.StaxEventItemReader"> <property name = "fragmentRootElementName" value = "tutorial" /> <property name = "resource" value = "classpath:tutorials.xml" /> <property name = "unmarshaller" ref = "customUnMarshaller" /> </bean> <bean id = "customUnMarshaller" class = "org.springframework.oxm.xstream.XStreamMarshaller"> <property name = "aliases"> <util:map id = "aliases"> <entry key = "tutorial" value ="com.zyiz.Tutorial" /> </util:map> </property> </bean> <bean id = "mysqlItemWriter" class = "org.springframework.batch.item.database.JdbcBatchItemWriter"> <property name = "dataSource" ref = "dataSource" /> <property name = "sql"> <value> <![CDATA[insert into testdb.tutorials (tutorial_id, tutorial_author, tutorial_title, submission_date, tutorial_icon, tutorial_description) values (:tutorial_id, :tutorial_author, :tutorial_title, :submission_date, :tutorial_icon, :tutorial_description);]]> </value> </property> <property name = "itemSqlParameterSourceProvider"> <bean class = "org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider" /> </property> </bean> </beans>
context.xml 文件
以下是Spring Batch应用程序的context.xml
的内容。 在这个文件中,我们将定义bean,如作业存储库,作业启动器和事务管理器。
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd"> <!-- stored job-meta in database --> <bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="transactionManager" ref="transactionManager" /> <property name="databaseType" value="mysql" /> </bean> <bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" /> <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> <property name="jobRepository" ref="jobRepository" /> </bean> <!-- connect to MySQL database --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/testdb" /> <property name="username" value="root" /> <property name="password" value="123456" /> </bean> <!-- create job-meta tables automatically --> <jdbc:initialize-database data-source="dataSource"> <jdbc:script location="org/springframework/batch/core/schema-drop-mysql.sql" /> <jdbc:script location="org/springframework/batch/core/schema-mysql.sql" /> </jdbc:initialize-database> </beans>
文件:CustomItemProcessor.java
以下是处理器类。 在这个类中,在应用程序中编写处理代码。 在这里,我们正在加载一个PDF文档,创建一个新页面,创建一个表格,并为每条记录插入以下值:教程ID,教程名称,作者,表格中的提交日期。
package com.zyiz; import java.io.File; import java.io.IOException; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDType1Font; import org.springframework.batch.item.ItemProcessor; public class CustomItemProcessor implements ItemProcessor<Tutorial, Tutorial> { public static void drawTable(PDPage page, PDPageContentStream contentStream, float y, float margin, String[][] content) throws IOException { final int rows = content.length; final int cols = content[0].length; final float rowHeight = 50; final float tableWidth = page.getMediaBox().getWidth() - (2 * margin); final float tableHeight = rowHeight * rows; final float colWidth = tableWidth / (float) cols; final float cellMargin = 5f; // draw the rows float nexty = y; for (int i = 0; i <= rows; i++) { contentStream.drawLine(margin, nexty, margin + tableWidth, nexty); nexty -= rowHeight; } // draw the columns float nextx = margin; for (int i = 0; i <= cols; i++) { contentStream.drawLine(nextx, y, nextx, y - tableHeight); nextx += colWidth; } // now add the text contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12); float textx = margin + cellMargin; float texty = y - 15; for (int i = 0; i < content.length; i++) { for (int j = 0; j < content[i].length; j++) { String text = content[i][j]; contentStream.beginText(); contentStream.moveTextPositionByAmount(textx, texty); contentStream.drawString(text); contentStream.endText(); textx += colWidth; } texty -= rowHeight; textx = margin + cellMargin; } } @Override public Tutorial process(Tutorial item) throws Exception { System.out.println("Processing..." + item); // Creating PDF document object //PDDocument doc = PDDocument.load(new File("D:/test.pdf")); // Creating a blank page PDPage page = new PDPage(); //doc.addPage(page); //PDPageContentStream contentStream = new PDPageContentStream(doc, page); String[][] content = { { "Id", "" + item.getTutorial_id() }, { "Title", item.getTutorial_title() }, { "Authour", item.getTutorial_author() }, { "Submission Date", item.getSubmission_date() } }; //drawTable(page, contentStream, 700, 100, content); //contentStream.close(); //doc.save("D:/test.pdf"); System.out.println("Hello"); return item; } }
文件:TutorialFieldSetMapper.java
以下是将数据设置为Tutorial
类的ReportFieldSetMapper
类的代码实现。
import org.springframework.batch.item.file.mapping.FieldSetMapper; import org.springframework.batch.item.file.transform.FieldSet; import org.springframework.validation.BindException; public class TutorialFieldSetMapper implements FieldSetMapper<Tutorial> { @Override public Tutorial mapFieldSet(FieldSet fieldSet) throws BindException { // instantiating the Tutorial class Tutorial tutorial = new Tutorial(); // Setting the fields from XML tutorial.setTutorial_id(fieldSet.readInt(0)); tutorial.setTutorial_title(fieldSet.readString(1)); tutorial.setTutorial_author(fieldSet.readString(2)); tutorial.setTutorial_icon(fieldSet.readString(3)); tutorial.setTutorial_description(fieldSet.readString(4)); return tutorial; } }
文件:Tutorial.java
以下是Tutorial
类。 这是一个带有setter
和getter
方法的简单类。
public class Tutorial { private int tutorial_id; private String tutorial_author; private String tutorial_title; private String submission_date; private String tutorial_icon; private String tutorial_description; @Override public String toString() { return " [id=" + tutorial_id + ", author=" + tutorial_author + ", title=" + tutorial_title + ", date=" + submission_date + ", icon =" +tutorial_icon +", description = "+tutorial_description+"]"; } public int getTutorial_id() { return tutorial_id; } public void setTutorial_id(int tutorial_id) { this.tutorial_id = tutorial_id; } public String getTutorial_author() { return tutorial_author; } public void setTutorial_author(String tutorial_author) { this.tutorial_author = tutorial_author; } public String getTutorial_title() { return tutorial_title; } public void setTutorial_title(String tutorial_title) { this.tutorial_title = tutorial_title; } public String getSubmission_date() { return submission_date; } public void setSubmission_date(String submission_date) { this.submission_date = submission_date; } public String getTutorial_icon() { return tutorial_icon; } public void setTutorial_icon(String tutorial_icon) { this.tutorial_icon = tutorial_icon; } public String getTutorial_description() { return tutorial_description; } public void setTutorial_description(String tutorial_description) { this.tutorial_description = tutorial_description; } }
文件:App.java
以下是启动批处理过程的代码。 在这个类中,我们将通过运行JobLauncher
来启动批处理应用程序。
package com.zyiz; import org.springframework.batch.core.Job; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.launch.JobLauncher; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App { public static void main(String[] args) throws Exception { String[] springConfig = {"jobconfig.xml" }; // Creating the application context object ApplicationContext context = new ClassPathXmlApplicationContext(springConfig); // Creating the job launcher JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher"); // Creating the job Job job = (Job) context.getBean("helloWorldJob"); // Executing the JOB JobExecution execution = jobLauncher.run(job, new JobParameters()); System.out.println("Exit Status : " + execution.getStatus()); } }
在执行这个应用程序时,它将产生以下输出 -
信息: Executed SQL script from class path resource [org/springframework/batch/core/schema-mysql.sql] in 5074 ms. 四月 28, 2018 10:15:26 上午 org.springframework.batch.core.launch.support.SimpleJobLauncher run 信息: Job: [FlowJob: [name=helloWorldJob]] launched with the following parameters: [{}] 四月 28, 2018 10:15:27 上午 org.springframework.batch.core.job.SimpleStepHandler handleStep 信息: Executing step: [step1] Processing... [id=1001, author=Sansu, title=Learn Java, date=06-05-2007, icon =http://www.zyiz.net/java/images/java-minilogo.jpg , description = Java is a high-level programming language originally developed by Sun Microsystems and released in 1995. Java runs on a variety of platforms. This tutorial gives a complete understanding of Java.'); ] Hello Processing... [id=1002, author=Maxsu, title=MySQL学习, date=19-04-2007, icon =http://www.zyiz.net/mysql/images/mysql-minilogo.jpg , description = MySQL is the most popular Open Source Relational SQL database management system. MySQL is one of the best RDBMS being used for developing web-based software applications. This tutorial will give you quick start with MySQL and make you comfortable with MySQL programming. ] Hello Processing... [id=1003, author=Kobe, title=Learn JavaFX, date=06-07-2017, icon =http://www.zyiz.net/javafx/images/javafx-minilogo.jpg , description = JavaFX is a Java library used to build Rich Internet Applications. The applications developed using JavaFX can run on various devices such as Desktop Computers, Mobile Phones, TVs, Tablets, etc. This tutorial, discusses all the necessary elements of JavaFX that are required to develop effective Rich Internet Applications ] Hello 四月 28, 2018 10:15:30 上午 org.springframework.batch.core.launch.support.SimpleJobLauncher run 信息: Job: [FlowJob: [name=helloWorldJob]] completed with the following parameters: [{}] and the following status: [COMPLETED] Exit Status : COMPLETED
如果打开数据库中的test.tutorial
表,应该会看到以下内容 -
Maven依赖配置文件:pom.xml -
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zyiz</groupId> <artifactId>SpringBatchSample</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>SpringBatchExample</name> <url>http://maven.apache.org</url> <properties> <jdk.version>1.8</jdk.version> <spring.version>4.3.8.RELEASE</spring.version> <spring.batch.version>3.0.7.RELEASE</spring.batch.version> <mysql.driver.version>5.1.25</mysql.driver.version> <junit.version>4.11</junit.version> </properties> <dependencies> <!-- Spring Core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/pdfbox/pdfbox --> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.0</version> </dependency> <!-- Spring jdbc, for database --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <!-- Spring XML to/back object --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>${spring.version}</version> </dependency> <!-- MySQL database driver --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.driver.version}</version> </dependency> <!-- Spring Batch dependencies --> <dependency> <groupId>org.springframework.batch</groupId> <artifactId>spring-batch-core</artifactId> <version>${spring.batch.version}</version> </dependency> <dependency> <groupId>org.springframework.batch</groupId> <artifactId>spring-batch-infrastructure</artifactId> <version>${spring.batch.version}</version> </dependency> <!-- Spring Batch unit test --> <dependency> <groupId>org.springframework.batch</groupId> <artifactId>spring-batch-test</artifactId> <version>${spring.batch.version}</version> </dependency> <!-- Junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>spring-batch</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-eclipse-plugin</artifactId> <version>2.9</version> <configuration> <downloadSources>true</downloadSources> <downloadJavadocs>false</downloadJavadocs> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>${jdk.version}</source> <target>${jdk.version}</target> </configuration> </plugin> </plugins> <defaultGoal>compile</defaultGoal> </build> </project>
上一篇:Spring Batch入门程序
- Java教程
- Vim教程
- Swing教程
- Spring教程
- Spring Web Services教程
- Spring MVC教程
- Spring JDBC教程
- Spring Cloud教程
- Spring Boot教程
- Spring Boot CLI教程
- Spring Batch教程
- Spring AOP教程
- PDFBox教程
- JSP教程
- JSF教程
- JPA教程
- Java面向对象设计
- Java设计模式
- Java虚拟机教程
- Java泛型教程
- Java正则表达式教程
- Java数据类型教程
- Java并发编程教程
- Java密码学教程
- Java多线程教程
- Java国际化(i18n)教程
- JavaFX教程
- Java9教程
扫描二维码
程序员编程王