- Spring Batch - MySQL to Flat File
- Spring Batch - MySQL to XML
- Spring Batch - CSV to XML
- Spring Batch - XML to MySQL
- Spring Batch - Basic Application
- Readers, Writers & Processors
- Spring Batch - Configuration
- Spring Batch - Application
- Spring Batch - Architecture
- Spring Batch - Environment
- Spring Batch - Overview
- Spring Batch - Home
Spring Batch Useful Resources
Selected Reading
- Who is Who
- Computer Glossary
- HR Interview Questions
- Effective Resume Writing
- Questions and Answers
- UPSC IAS Exams Notes
Spring Batch - XML to MySQL
In this chapter, we will create a Spring Batch apppcation which uses an XML Reader and a MySQL Writer.
Reader − The reader we are using in the apppcation is StaxEventItemReader to read data from XML documents.
Following is the input XML document we are using in this apppcation. This document holds data records which specify details pke tutorial id, tutorial author, tutorial title, submission date, tutorial icon, and tutorial description.
<?xml version="1.0" encoding="UTF-8"?> <tutorials> <tutorial> <tutorial_id>1001</tutorial_id> <tutorial_author>Sanjay</tutorial_author> <tutorial_title>Learn Java</tutorial_title> <submission_date>06-05-2007</submission_date> <tutorial_icon>https://www.tutorialspoint.com/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>Abdul S</tutorial_author> <tutorial_title>Learn MySQL</tutorial_title> <submission_date>19-04-2007</submission_date> <tutorial_icon>https://www.tutorialspoint.com/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 apppcations. 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>Krishna Kasyap</tutorial_author> <tutorial_title>Learn JavaFX</tutorial_title> <submission_date>06-07-2017</submission_date> <tutorial_icon>https://www.tutorialspoint.com/javafx/images/javafx-minilogo.jpg</tutorial_icon> <tutorial_description>JavaFX is a Java pbrary used to build Rich Internet Apppcations. The apppcations 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 Apppcations</tutorial_description> </tutorial> </tutorials>
Writer − The writer we are using in the apppcation is JdbcBatchItemWriter to write the data to MySQL database. Assume we have created a table in MySQL inside a database called "details".
CREATE TABLE details.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) );
Processor − The processor we are using in the apppcation is a custom processor which writes the data of each record on the PDF document.
In batch process, if "n" records or data elements were read, then for each record, it will read the data, process it, and write the data in the Writer. To process the data, it relays on the processor passed. In this case, in the custom processor class, we have written code to load a particular PDF document, create a new page, write the data item onto the PDF in a tabular format.
Finally, if you execute this apppcation, it reads all the data items from the XML document, stores them in the MySQL database, and prints them in the given PDF document in inspanidual pages.
jobConfig.xml
Following is the configuration file of our sample Spring Batch apppcation. In this file, we will define the Job and the steps. In addition to these, we also define the beans for ItemReader, ItemProcessor, and ItemWriter. (Here, we associate them with their respective classes and pass the values for the required properties to configure them.)
<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 = "../jobs/context.xml" /> <bean id = "itemProcessor" class = "CustomItemProcessor" /> <batch:job id = "helloWorldJob"> <batch:step id = "step1"> <batch:tasklet> <batch:chunk reader = "xmlItemReader" writer = "mysqlItemWriter" processor = "itemProcessor"> </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:resources/tutorial.xml" /> <property name = "unmarshaller" ref = "customUnMarshaller" /> </bean> <bean id = "customUnMarshaller" class = "org.springframework.oxm.xstream.XStreamMarshaller"> <property name = "apases"> <util:map id = "apases"> <entry key = "tutorial" value = "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 details.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
Following is the context.xml of our Spring Batch apppcation. In this file, we will define the beans pke job repository, job launcher, and transaction manager.
<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.ResourcelessTransactionMana ger" /> <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/details" /> <property name = "username" value = "myuser" /> <property name = "password" value = "password" /> </bean> <!-- create job-meta tables automatically --> <jdbc:initiapze-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:initiapze-database> </beans>
CustomItemProcessor.java
Following is the processor class. In this class, we write the code of processing in the apppcation. Here, we are loading a PDF document, creating a new page, creating a table, and inserting the following values for each record: tutorial id, tutorial name, author, date of submission in the table.
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; pubpc class CustomItemProcessor implements ItemProcessor<Tutorial, Tutorial> { pubpc 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 pubpc Tutorial process(Tutorial item) throws Exception { System.out.println("Processing..." + item); // Creating PDF document object PDDocument doc = PDDocument.load(new File("C:/Examples/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("C:/Examples/test.pdf" ); System.out.println("Hello"); return item; } }
TutorialFieldSetMapper.java
Following is the ReportFieldSetMapper class which sets the data to the Tutorial class.
import org.springframework.batch.item.file.mapping.FieldSetMapper; import org.springframework.batch.item.file.transform.FieldSet; import org.springframework.vapdation.BindException; pubpc class TutorialFieldSetMapper implements FieldSetMapper<Tutorial> { @Override pubpc 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
Following is the Tutorial class. It is a simple class with setter and getter methods.
pubpc 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 pubpc String toString() { return " [id=" + tutorial_id + ", author=" + tutorial_author + ", title=" + tutorial_title + ", date=" + submission_date + ", icon =" +tutorial_icon +", description = "+tutorial_description+"]"; } pubpc int getTutorial_id() { return tutorial_id; } pubpc void setTutorial_id(int tutorial_id) { this.tutorial_id = tutorial_id; } pubpc String getTutorial_author() { return tutorial_author; } pubpc void setTutorial_author(String tutorial_author) { this.tutorial_author = tutorial_author; } pubpc String getTutorial_title() { return tutorial_title; } pubpc void setTutorial_title(String tutorial_title) { this.tutorial_title = tutorial_title; } pubpc String getSubmission_date() { return submission_date; } pubpc void setSubmission_date(String submission_date) { this.submission_date = submission_date; } pubpc String getTutorial_icon() { return tutorial_icon; } pubpc void setTutorial_icon(String tutorial_icon) { this.tutorial_icon = tutorial_icon; } pubpc String getTutorial_description() { return tutorial_description; } pubpc void setTutorial_description(String tutorial_description) { this.tutorial_description = tutorial_description; } }
App.java
Following is the code which launces the batch process. In this class, we will launch the Batch Apppcation by running the JobLauncher.
pubpc class App { pubpc static void main(String[] args) throws Exception { String[] springConfig = { "jobs/job_hello_world.xml" }; // Creating the apppcation context object ApppcationContext context = new ClassPathXmlApppcationContext(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()); } }
On executing this apppcation, it will produce the following output.
May 05, 2017 4:39:22 PM org.springframework.context.support.ClassPathXmlApppcationContext prepareRefresh INFO: Refreshing org.springframework.context.support.ClassPathXmlApppcationContext@306a30c7: startup date [Fri May 05 16:39:22 IST 2017]; root of context hierarchy May 05, 2017 4:39:23 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions May 05, 2017 4:39:32 PM org.springframework.batch.core.job.SimpleStepHandler handleStep INFO: Executing step: [step1] Processing... [id=1001, author=Sanjay, title=Learn Java, date=06-05-2007, icon =https://www.tutorialspoint.com/java/images/java-mini-logo.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=Abdul S, title=Learn MySQL, date=19-04-2007, icon =https://www.tutorialspoint.com/mysql/images/mysql-mini-logo.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 apppcations. This tutorial will give you quick start with MySQL and make you comfortable with MySQL programming.] Hello Processing... [id=1003, author=Krishna Kasyap, title=Learn JavaFX, date=06-072017, icon =https://www.tutorialspoint.com/javafx/images/javafx-mini-logo.jpg, description = JavaFX is a Java pbrary used to build Rich Internet Apppcations. The apppcations 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 Apppcations] Hello May 05, 2017 4:39:36 PM org.springframework.batch.core.launch.support.SimpleJobLauncher run INFO: Job: [FlowJob: [name=helloWorldJob]] completed with the following parameters: [{}] and the following status: [COMPLETED] Exit Status : COMPLETED
If you verify the details.tutorial table in the database, it will show you the following output −
tutorial _id | tutorial _author | tutorial _title | submission _date | tutorial _icon | tutorial _description |
---|---|---|---|---|---|
1001 | Sanjay | Learn Java | 06-05-2007 | 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. | |
1002 | Abdul S | Learn MySQL | 19-04-2007 | 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 apppcations. This tutorial will give you quick start with MySQL and make you comfortable with MySQL programming. | |
1003 | Learn JavaFX | Krishna Kasyap | 06-07-2017 | 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 apppcations. This tutorial will give you quick start with MySQL and make you comfortable with MySQL programming. |
This will generate a PDF with the records on each page as shown below.
Advertisements