Springバッチの例 - MySQLデータベースからXMLへ

このチュートリアルでは、 JdbcCursorItemReader`と JdbcPagingItemReader`を使用してMySQLデータベースからデータを読み込み、それをXMLファイルに書き込む方法を説明します。

使用されるツールとライブラリ

  1. Maven 3

  2. Eclipse 4.2

  3. JDK 1.6

  4. Spring Core 3.2.2.RELEASE

  5. Spring OXM 3.2.2.RELEASE

  6. Spring Batch 2.2.0.RELEASE

  7. MySQLのJavaドライバ5.1.25

P.Sこの例 - MySQLのjdbc(リーダー) - XML(ライター).

1.プロジェクトのディレクトリ構造

標準のMavenプロジェクトである最終的なプロジェクト構造を見直してください。

スプリングバッチデータベースからxml、width = 456、height = 473

2.データベース

"users"テーブルは、5つのレコードのみを含み、後でそれをjdbcで読み込みます。

ユーザーテーブル

id, user__login, password, age

'1','mkyong','password','30'
'2','user__a','password','25'
'3','user__b','password','10'
'4','user__c','password','25'
'5','user__d','password','40'

3.アイテムリーダー

データベース値を "user"オブジェクトにマップする行マッパーを作成します。

User.java

package com.mkyong;

public class User {

    int id;
    String username;
    String password;
    int age;

   //... getter and setter methods

}

UserRowMapper.java

package com.mkyong;

import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;

public class UserRowMapper implements RowMapper<User> {

    @Override
    public User mapRow(ResultSet rs, int rowNum) throws SQLException {

        User user = new User();

        user.setId(rs.getInt("id"));
        user.setUsername(rs.getString("user__login"));
        user.setPassword(rs.getString("user__pass"));
        user.setAge(rs.getInt("age"));

        return user;
    }

}

データベースからデータを読み取る例

job.xml

  <bean id="itemReader"
    class="org.springframework.batch.item.database.JdbcCursorItemReader"
    scope="step">
    <property name="dataSource" ref="dataSource"/>
    <property name="sql"
        value="select ID, USER__LOGIN, USER__PASS, AGE from USERS"/>
    <property name="rowMapper">
        <bean class="com.mkyong.UserRowMapper"/>
    </property>
  </bean>

大きなレコードの場合は、 `JdbcPagingItemReader`を使用できます。

job.xml

  <bean id="pagingItemReader"
    class="org.springframework.batch.item.database.JdbcPagingItemReader"
    scope="step">
    <property name="dataSource" ref="dataSource"/>
    <property name="queryProvider">
      <bean
        class="org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="selectClause" value="select id, user__login, user__pass, age"/>
        <property name="fromClause" value="from users"/>
        <property name="whereClause" value="where user__login=:name"/>
        <property name="sortKey" value="id"/>
      </bean>
    </property>
    <property name="parameterValues">
       <map>
        <entry key="name" value="#{jobParameters['name']}"/>
       </map>
    </property>
    <property name="pageSize" value="10"/>
    <property name="rowMapper">
        <bean class="com.mkyong.UserRowMapper"/>
    </property>
  </bean>

4.アイテムライター

データをXMLファイルに書き込みます。

job.xml

    <bean id="itemWriter"
                class="org.springframework.batch.item.xml.StaxEventItemWriter">
        <property name="resource" value="file:xml/outputs/users.xml"/>
        <property name="marshaller" ref="userUnmarshaller"/>
        <property name="rootTagName" value="users"/>
    </bean>

    <bean id="userUnmarshaller"
                class="org.springframework.oxm.xstream.XStreamMarshaller">
        <property name="aliases">
            <util:map id="aliases">
                <entry key="user" value="com.mkyong.User"/>
            </util:map>
        </property>
    </bean>

5.バネバッチジョブ

MySQLからデータを読み込んでXMLファイルに書き込むジョブ。

resources/spring/batch/jobs/job-extract-users.xml

<?xml version="1.0" encoding="UTF-8"?>
<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"
    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
        ">

  <import resource="../config/context.xml"/>
  <import resource="../config/database.xml"/>

  <bean id="itemReader"
    class="org.springframework.batch.item.database.JdbcCursorItemReader"
    scope="step">
    <property name="dataSource" ref="dataSource"/>
    <property name="sql"
        value="select ID, USER__LOGIN, USER__PASS, AGE from USERS where age > #{jobParameters['age']}"/>
    <property name="rowMapper">
        <bean class="com.mkyong.UserRowMapper"/>
    </property>
  </bean>

  <job id="testJob" xmlns="http://www.springframework.org/schema/batch">
    <step id="step1">
      <tasklet>
        <chunk reader="pagingItemReader" writer="itemWriter"
            commit-interval="1"/>
      </tasklet>
    </step>
  </job>

  <bean id="itemWriter" class="org.springframework.batch.item.xml.StaxEventItemWriter">
    <property name="resource" value="file:xml/outputs/users.xml"/>
    <property name="marshaller" ref="userUnmarshaller"/>
    <property name="rootTagName" value="users"/>
  </bean>

  <bean id="userUnmarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
    <property name="aliases">
        <util:map id="aliases">
            <entry key="user" value="com.mkyong.User"/>
        </util:map>
    </property>
  </bean>
</beans>

resources/spring/batch/config/database.xml

<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">

        <!-- connect to 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/test"/>
        <property name="username" value="root"/>
        <property name="password" value=""/>
    </bean>

    <bean id="transactionManager"
    class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/>

</beans>

6.それを実行する

Javaクラスを作成し、バッチジョブを実行します。

App.java

package com.mkyong;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
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) {
    App obj = new App();
    obj.run();
  }

  private void run() {

    String[]springConfig = { "spring/batch/jobs/job-extract-users.xml" };

    ApplicationContext context = new ClassPathXmlApplicationContext(springConfig);

    JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher");
    Job job = (Job) context.getBean("testJob");

    try {

        JobParameters param = new JobParametersBuilder().addString("age", "20").toJobParameters();

        JobExecution execution = jobLauncher.run(job, param);
        System.out.println("Exit Status : " + execution.getStatus());
        System.out.println("Exit Status : " + execution.getAllFailureExceptions());

    } catch (Exception e) {
        e.printStackTrace();
    }
    System.out.println("Done");

  }

}

出力。すべての「20歳以上のユーザー」をXMLファイルに抽出します。

xml/outputs/users.xml

<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user>
        <id>1</id>
        <username>mkyong</username>
        <password>password</password>
        <age>30</age>
    </user>
    <user>
        <id>2</id>
        <username>user__a</username>
        <password>password</password>
        <age>25</age>
    </user>
    <user>
        <id>4</id>
        <username>user__c</username>
        <password>password</password>
        <age>25</age>
    </user>
    <user>
        <id>5</id>
        <username>user__d</username>
        <password>password</password>
        <age>40</age>
    </user>
</users>

ソースコードをダウンロードする

ダウンロードする - SpringBatch-MySQL-XML-Example.zip (22 kb)