Spring Batch_JdbcCursorItemReader
该demo主要完成的功能就是把数据从表people读出来处理加上people的desc属性然后保存到表ok_people。对应的People.java和PeopleDESC.java
package com.lyx.batch;
public class People {
private int id;
private String lastName;
private String firstName;
public People() {
}
public People(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getFirstName() {
return this.firstName;
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public String toString() {
return "firstName: " + this.firstName + ", lastName: " + this.lastName;
}
}
package com.lyx.batch;
public class PeopleDESC {
private int id;
private String lastName;
private String firstName;
private String desc;
public PeopleDESC(String lastName, String firstName, String desc) {
super();
this.lastName = lastName;
this.firstName = firstName;
this.desc = desc;
}
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getFirstName() {
return this.firstName;
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public String toString() {
return "firstName: " + this.firstName + ", lastName: " + this.lastName;
}
public String getDesc() {
return this.desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
对应的数据库表
CREATE TABLE ok_people (
person_id BIGINT NOT NULL AUTO_INCREMENT,
first_name VARCHAR(20),
last_name VARCHAR(20),
batch_desc varchar(255),
PRIMARY KEY (person_id)
);
CREATE TABLE people (
person_id BIGINT NOT NULL AUTO_INCREMENT,
first_name VARCHAR(20),
last_name VARCHAR(20),
PRIMARY KEY (person_id)
);
主要过程还是配置job的reader,processor,writer,下面是配置文件中的reader,processor,wirter,如下配置文件:
<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-4.0.xsd
http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd">
<bean id="exceptionHandler" class="com.lyx.batch.ExceptionListener" />
<batch:step id="abstractStep" abstract="true">
<batch:listeners>
<batch:listener ref="exceptionHandler" />
</batch:listeners>
</batch:step>
<bean id="abstractCursorReader" abstract="true"
class="org.springframework.batch.item.database.JdbcCursorItemReader">
<property name="dataSource" ref="dataSource" />
</bean>
<batch:job id="addPeopleDescJob">
<batch:step id="addDescStep" parent="abstractStep">
<batch:tasklet>
<batch:chunk reader="peopleAddDescReader" processor="addDescProcessor"
writer="addDescPeopleWriter" commit-interval="2"/>
</batch:tasklet>
</batch:step>
</batch:job>
<bean id="peopleAddDescReader" parent="abstractCursorReader"
scope="step">
<property name="sql">
<value><![CDATA[select first_name ,last_name from people where
first_name like ? or last_name like ?]]></value>
</property>
<property name="rowMapper" ref="peopleRowMapper" />
<property name="preparedStatementSetter" ref="preparedStatementSetter" />
<property name="fetchSize" value="20" />
</bean>
<bean id="peopleRowMapper" class="com.lyx.batch.PeopleRowMapper" />
<bean id="preparedStatementSetter" class="com.lyx.batch.PeoplePreparedStatementSetter" />
<bean id="addDescProcessor" class="com.lyx.batch.AddPeopleDescProcessor" />
<bean id="addDescPeopleWriter" class="com.lyx.batch.AddDescPeopleWriter" >
<property name="dataSource" ref="dataSource"/>
</bean>
<!--tomcat jdbc pool数据源配置 -->
<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource"
destroy-method="close">
<property name="poolProperties">
<bean class="org.apache.tomcat.jdbc.pool.PoolProperties">
<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="034039" />
</bean>
</property>
</bean>
<!-- spring batch 配置jobRepository -->
<batch:job-repository id="jobRepository"
data-source="dataSource" transaction-manager="transactionManager"
isolation-level-for-create="REPEATABLE_READ" table-prefix="BATCH_"
max-varchar-length="1000" />
<!-- spring的事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- batch luncher -->
<bean id="jobLauncher"
class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
</bean>
</beans>
对应的类:PeopleRowMapper.java
package com.lyx.batch;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
public class PeopleRowMapper implements RowMapper<People> {
public People mapRow(ResultSet rs, int rowNum) throws SQLException {
People p = new People();
p.setFirstName(rs.getString("first_name"));
p.setLastName(rs.getString("last_name"));
return p;
}
}
PeoplePreparedStatementSetter.java
package com.lyx.batch;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.springframework.jdbc.core.PreparedStatementSetter;
public class PeoplePreparedStatementSetter implements PreparedStatementSetter {
public void setValues(PreparedStatement ps) throws SQLException {
// TODO Auto-generated method stub
ps.setString(1, "%JOHN%");
ps.setString(2, "%DOE%");
}
}
AddPeopleDescProcessor.java
package com.lyx.batch;
import org.springframework.batch.item.ItemProcessor;
public class AddPeopleDescProcessor implements
ItemProcessor<People, PeopleDESC> {
public PeopleDESC process(People item) throws Exception {
return new PeopleDESC(item.getLastName(), item.getFirstName(), Thread
.currentThread().getName());
}
}
AddDescPeopleWriter.java
package com.lyx.batch;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.batch.item.ItemWriter;
import org.springframework.jdbc.core.JdbcTemplate;
public class AddDescPeopleWriter implements ItemWriter<PeopleDESC> {
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public void write(List<? extends PeopleDESC> items) throws Exception {
for (PeopleDESC peopleDESC : items) {
this.jdbcTemplate
.update("insert into ok_people (first_name, last_name, batch_desc) values (?, ?, ?)",
peopleDESC.getFirstName(),
peopleDESC.getLastName(), peopleDESC.getDesc());
}
}
}
===============END===============