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