LoginSignup
1
1

More than 5 years have passed since last update.

Eclipseのバッチ処理でJPAを使ったDBアクセスを行う。

Last updated at Posted at 2018-01-13

この記事は、Eclipseのバッチ処理でJPAとDBでPostgreSQLを扱ったプロジェクトの作成方法と簡単なDAOを使った処理について、記載したものです。

ポイント:

依存関係の注入を行う為、以下のアノテーションを追加しています。
(1) @EnableJpaRepositories(basePackages = {"com.example.demo.dao"})
(2) @EntityScan(basePackages = {"com.example.demo.entity"})
(3) @ComponentScan(basePackages = {"com.example.demo"})
@Autowired アノテーションによって、(1)で "com.example.demo.dao" のパッケージ内で作成した@Repositoryアノテーションクラス、(2)で "com.example.demo.entity" のパッケージ内で作成した@Entityアノテーションクラス、(3)で "com.example.demo" のパッケージ内で作成した@Componentアノテーションクラスの依存関係の注入を行えるようにします。

プロジェクトの作成手順:

1.Postgres側のDBにテスト用のテーブルを作成しています。
今回は、以下のような簡単なテーブルを作成します。

-- Table: public.mstr_info

-- DROP TABLE public.mstr_info;

CREATE TABLE public.mstr_info
(
itemcode character varying(12) NOT NULL,
itemname character varying(100) NOT NULL,
CONSTRAINT mstr_info_pkey PRIMARY KEY (itemcode)
)
WITH (
OIDS=FALSE
);
ALTER TABLE public.mstr_info
OWNER TO postgres;

テスト用にデータも入れておきます。
image.png

2.Eclipse側でプロジェクトの作成をします。
(1)パッケージエクスプローラより、右クリックしてプロジェクトを選択します。
image.png

(2)Springスターター・プロジェクトを選択します。
image.png

(3)名前を適当に入力して、次へをクリックします。ここでは demo-1 を設定しています。
image.png

(4)バッチ、JPA、PostgresSQL を選択して完了をクリックします。チェックボックスの表示がない場合、左側のメニューから選択します。
image.png

3.JPAプロジェクトに変換します。
(1) 2.で作成した、demo-1 プロジェクトを右クリックして、構成、JPAプロジェクトへ変換... をクリックします。
image.png

(2)そのまま、次へをクリックします。
image.png

(3)そのまま、次へをクリックします。
image.png

(4)完了をクリックします。
image.png

4.エンティティを作成します。
上記の 3.でJPAプロジェクトに変換すると、JPAツールが利用できます。
(1)demo-1プロジェクトを右クリック->JPAツール->テーブルからエンティティを生成をクリックします。
image.png

(2)新規PostgreSQLで接続の追加をクリックします。
image.png

(3)PostgreSQLを選択して、次へをクリックします。
image.png

(4)PostgreSQLの接続情報を入力して、接続テストをクリックします。
接続テストで成功したら、完了をクリックします。
image.png

(5)接続に新規PostgreSQL(1)、スキーマにpublicを選択すると、テーブル情報が表示されます。今回は 1.で作成したテーブルのエンティティを作成するので、mstr_info をチェックします。
image.png

(6)そのまま、次へをクリックします。
image.png

(7)パッケージ名はentityクラス専用としたいので、デフォルトパッケージ名に .entity を追加して、次へをクリックします。
image.png

(8)クラス名にEntityを追加して、完了をクリックします。
image.png

(9)MstrInfoEntityクラスが自動生成されます。
image.png

5.DAOを作成します。
(1)com.example.demo.dao パッケージを作成します。
image.png

image.png

(2)MstrInfoDaoクラスを作成します。
image.png

image.png

(3)MstrInfoDao.java クラスに簡単な検索文を追加していきます。

以下のコードで上書きします。
package com.example.demo.dao;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.example.demo.entity.MstrInfoEntity;

@Repository
public interface MstrInfoDao extends JpaRepository {

public List<MstrInfoEntity> findByItemcode(String itemcode);

}

6.バッチ処理からテストデータを取得して表示してみます。
(1)Eclipseで簡単なバッチ処理の枠組みを作成する。の記事で使用したプロジェクトを参考にして、ジョブとタスクのクラスを作成していきます。
https://qiita.com/toolate32/items/4381bfd19c4c46733571
ここでは、Demo1Application.java、Demo1Job.java、Demo1Tasklet.java を作成します。

Demo1Application.java

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.ApplicationContext;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@EnableJpaRepositories(
basePackages = {"com.example.demo.dao"}
)
@EntityScan(
basePackages = {"com.example.demo.entity"}
)
@ComponentScan(
basePackages = {"com.example.demo"}
)
@SpringBootApplication
public class Demo1Application {

public static void main(String[] args) {
    System.out.println("main start");
    ApplicationContext context = SpringApplication.run(Demo1Application.class, args);
    int iRet = SpringApplication.exit(context);
    System.out.println("exit code = " + iRet);
    System.exit(iRet);
    System.out.println("main end");
}

}

Demo1Job.java

package com.example.demo;

import javax.sql.DataSource;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@EnableBatchProcessing
public class Demo1Job {

@Autowired
private JobBuilderFactory jobFactory;

@Autowired
private StepBuilderFactory stepFactory;

@Autowired
private Demo1Tasklet demo1Tasklet;

@Bean
public Step step1() {

    return stepFactory
            .get("step1")
            .tasklet(demo1Tasklet)
            .build();
}

@Bean
public Job job(Step step1) {

    return jobFactory
            .get("job")
            .incrementer(new RunIdIncrementer())
            .start(step1)
            .build();
}

}

Demo1Tasklet.java

package com.example.demo;

import java.util.List;

import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ExitCodeGenerator;
import org.springframework.stereotype.Component;

import com.example.dao.MstrInfoDao;
import com.example.entity.MstrInfoEntity;

@Component
public class Demo1Tasklet implements Tasklet, ExitCodeGenerator {

@Autowired
private MstrInfoDao mstrInfoDao;

    @Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {

    System.out.println("== BatchTestTasklet Start OK ==");
    List<MstrInfoEntity> lstMstrInfoEntity = mstrInfoDao.findByItemcode("1");
    MstrInfoEntity entity = lstMstrInfoEntity.get(0);
    System.out.println("ItemCode=" + entity.getItemcode());
    System.out.println("ItemName=" + entity.getItemname());
    System.out.println("== BatchTestTasklet Start END ==");
    return RepeatStatus.FINISHED;
}

@Override
public int getExitCode() {
    return 0;
}

}

7.Demo1Application.java を実行してみます。
(1) Demo1Application を右クリックして、実行->Javaアプリケーションをクリックします。
image.png

(2) ログ出力で以下のように出力されていれば、DBからの取得が出来ています。
== BatchTestTasklet Start OK ==
ItemCode=1
ItemName=name1
== BatchTestTasklet Start END ==

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1