この記事は、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;
2.Eclipse側でプロジェクトの作成をします。
(1)パッケージエクスプローラより、右クリックしてプロジェクトを選択します。
(3)名前を適当に入力して、次へをクリックします。ここでは demo-1 を設定しています。
(4)バッチ、JPA、PostgresSQL を選択して完了をクリックします。チェックボックスの表示がない場合、左側のメニューから選択します。
3.JPAプロジェクトに変換します。
(1) 2.で作成した、demo-1 プロジェクトを右クリックして、構成、JPAプロジェクトへ変換... をクリックします。
4.エンティティを作成します。
上記の 3.でJPAプロジェクトに変換すると、JPAツールが利用できます。
(1)demo-1プロジェクトを右クリック->JPAツール->テーブルからエンティティを生成をクリックします。
(2)新規PostgreSQLで接続の追加をクリックします。
(3)PostgreSQLを選択して、次へをクリックします。
(4)PostgreSQLの接続情報を入力して、接続テストをクリックします。
接続テストで成功したら、完了をクリックします。
(5)接続に新規PostgreSQL(1)、スキーマにpublicを選択すると、テーブル情報が表示されます。今回は 1.で作成したテーブルのエンティティを作成するので、mstr_info をチェックします。
(7)パッケージ名はentityクラス専用としたいので、デフォルトパッケージ名に .entity を追加して、次へをクリックします。
(8)クラス名にEntityを追加して、完了をクリックします。
(9)MstrInfoEntityクラスが自動生成されます。
5.DAOを作成します。
(1)com.example.demo.dao パッケージを作成します。
(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アプリケーションをクリックします。
(2) ログ出力で以下のように出力されていれば、DBからの取得が出来ています。
== BatchTestTasklet Start OK ==
ItemCode=1
ItemName=name1
== BatchTestTasklet Start END ==