本文介紹 SpringBatch 串連樣本。
環境配置
JDK 1.8。
OceanBase 3.x(MySQL 模式)。
基於 spring-boot 整合 spring-batch。
配置依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<!--資料庫驅動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<!--串連池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.22</version>
</dependency>
<!--基於實體類自動建表-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--spring-boot核心等其他依賴省略。。。。-->設定檔
#yml 檔案:
spring:
datasource:
url: jdbc:oceanbase://xxx.xxx.xxx.xxx:3306/test
driver-class-name: com.mysql.cj.jdbc.Driver
username: a****
password: ******
jpa:
hibernate:
ddl-auto: update範例程式碼
通過調用資料庫寫入類方法寫入資料,具體步驟如下:
建立需要的類。
實體類:
People和PeopleDESC。//基本 people 類 @Entity @Table(name = "PEOPLE") public class People { @Id @GeneratedValue private int id; private String lastName; private String firstName; //略 }//加工後的 peopledesc 類(增加 desc 屬性) @Entity @Table(name = "OK_PEOPLE") public class PeopleDESC { @Id @GeneratedValue //strategy = AUTO / IDENTITY / SEQUENCE 三種主鍵建置原則均不支援 private int id; private String lastName; private String firstName; private String desc1; //略 }批處理類:
AddPeopleDescProcessor和AddDescPeopleWriter。//用於給 people 添加 desc 屬性返回一個 peopledesc 類的處理器 public class AddPeopleDescProcessor implements ItemProcessor<People, PeopleDESC> { public PeopleDESC process(People item) throws Exception { return new PeopleDESC(item.getId() , item.getLastName(), item.getFirstName(), Thread.currentThread().getName()); } }將 peopledesc 寫入資料庫的類。
//將 peopledesc 寫入資料庫的類 public class AddDescPeopleWriter implements ItemWriter<PeopleDESC> { private JdbcTemplate jdbcTemplate; public void setDataSource(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } public JdbcTemplate getJdbcTemplate() { return jdbcTemplate; } public void write(List<? extends PeopleDESC> items) throws Exception { for (PeopleDESC peopleDESC : items) { this.jdbcTemplate .update("insert into ok_people (id,first_name,last_name,desc1) values (?, ?, ?, ?)", peopleDESC.getId(), peopleDESC.getFirstName(), peopleDESC.getLastName(), peopleDESC.getDesc()); } } }啟動工程
spring-data-jpa會根據實體類People及PeopleDESC自動建表,樣本結果如下。
大量新增測試資料至
people。public void addData(){ jdbcTemplate = new JdbcTemplate(dataSource); StringBuilder stringBuilder = new StringBuilder(""); for (int i = 1 ; i<=100 ; i++){ stringBuilder.append("insert into people values ("+i+",'first_test"+i+"','last_test"+i+"');"); jdbcTemplate.execute(stringBuilder.toString()); stringBuilder.delete(0, stringBuilder.length()); } }測試下結果,顯示如下:

執行批處理方法。
public void writerTest() throws Exception { //獲得 people 表的結果集 String sql = "select * from people;"; preparedStatement = dataSource.getConnection().prepareStatement(sql); ResultSet resultSet = preparedStatement.executeQuery(); List list = new ArrayList<PeopleDESC>(); //基於添加 desc 屬性的處理器對結果集進行加工,並封裝成一個 List<PeopleDESC> while (resultSet.next()){ People people = peopleRowMapper.mapRow(resultSet, resultSet.getRow()); PeopleDESC desc = addPeopleDescProcessor.process(people); list.add(desc); } //調用資料庫寫入類方法寫入資料 addDescPeopleWriter.setDataSource(dataSource); addDescPeopleWriter.write(list); }