Spring Batch JDBC XML
JDBC
At last entry, I explained simple Spring batch with command line argus.
As next step, let’s try MySQL(database) connection
Environment
MySQL 5.6
Create Database named test
Table is following
CREATE TABLE `test`.`user` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '', `name` VARCHAR(255) NOT NULL COMMENT '', PRIMARY KEY (`id`) COMMENT '', UNIQUE INDEX `name_UNIQUE` (`name` ASC) COMMENT '');
Preparation
Add dependencies
Codes
job.xml
Add datasource and DAO to bean
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:batch="http://www.springframework.org/schema/batch" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd"> <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/test" /> <property name="username" value="root" /> <property name="password" value="" /> </bean> <bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" /> <bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"> <property name="transactionManager" ref="transactionManager" /> </bean> <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> <property name="jobRepository" ref="jobRepository" /> </bean> <bean id="jdbctest" class="com.atmarkplant.batchsample.jdbc.JdbcTestDAO"> <property name="dataSource" ref="dataSource" /> </bean> <batch:job id="datasourcetask" job-repository="jobRepository"> <batch:step id="task3"> <batchlet scope="step" class="com.atmarkplant.batchsample.task.DataSourceTask"> <property name="jdbctest" ref="jdbctest"></property> </batchlet> </batch:step> </batch:job> </beans>
Add 2 beans. One is datasource. Prepare datasource with org.springframework.jdbc.datasource.DriverManagerDataSource
<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/test" /> <property name="username" value="root" /> <property name="password" value="" /> </bean>
This is datasource betting. By this, you can use dataSource object.
DAO
Create DAO class to access database.
From xml, dao has datasource property
public class JdbcTestDAO { private DataSource dataSource; public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public void insert(User user) { String sql = "INSERT INTO USER (name) VALUE(?)"; Connection conn = null; try { conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, user.getName()); ps.executeUpdate(); ps.close(); } catch (SQLException e) { e.printStackTrace(); } finally { if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
This class insert one data using JDBC.
Task
The last is task.
public class DataSourceTask implements Tasklet { private JdbcTestDAO jdbctest; public void setJdbctest(JdbcTestDAO jdbctest) { this.jdbctest = jdbctest; } @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { System.out.println("datasource task"); User user = new User(); user.setName("Ash"); jdbctest.insert(user); return RepeatStatus.FINISHED; } }
Create DAO and execute insert method to make new record.
Run
This is almost same as the last entry
java org.springframework.batch.core.launch.support.CommandLineJobRunner job.xml datasourcetask