すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB for OceanBase:SpringBatch を使用して OceanBase データベースに接続する

最終更新日:Jan 19, 2025

このトピックでは、SpringBatch 接続の例を示します。

環境構成

  • JDK 1.8

  • OceanBase Database V3.x (MySQL モード)

  • SpringBoot に基づいて統合された SpringBatch

依存関係の構成

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<!--データベース ドライバー-->
<dependency>
   <groupId>com.oceanbase</groupId>
   <artifactId>oceanbase-client</artifactId>
   <version>2.4.0</version>
</dependency>
<!--エンティティ クラスに基づくテーブルの自動作成-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--その他の SpringBoot コア依存関係はここでは省略されています。-->

構成ファイル

# yml ファイル:
spring:
  datasource:
    url: jdbc:oceanbase://xxx.xxx.xxx.xxx:3306/test
    driver-class-name: com.oceanbase.jdbc.Driver
    username: a****
    password: ******
  jpa:
    hibernate:
      ddl-auto: update

サンプル コード

次の手順を実行して、データベース書き込みクラスのメソッドを呼び出してデータを書き込みます。

  1. 必要なクラスを作成します。

    エンティティ クラス: 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());
        }
    }
  2. 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());
            }
        }
    }
  3. spring-data-jpa プロジェクトを開始すると、エンティティ クラス People および PeopleDESC に基づいてテーブルが自動的に作成されます。サンプル結果:

    SpringBatch 连接示例1

  4. テスト データを 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());
        }
    }

    テスト結果:

    SpringBatch 连接示例2

  5. バッチ処理メソッドを実行します。

    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);
    }