本記事では、SpringBatchによる接続例を紹介します。
環境構成
JDK1.8
OceanBase 3.x(MySQLモード/Oracleモード)
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:mysql://xxxxxxxx:3306/test
driver-class-name: com.mysql.cj.jdbc.Driver
# username: admin@mysql
username: admin@oracle
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 の3つの主キー生成戦略はいずれもサポートされていません。 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); }