SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Spring Bootで作るマイクロサービス

Spring Bootでデータベースにアクセスしよう

Spring Bootで作るマイクロサービス 第5回


  • X ポスト
  • このエントリーをはてなブックマークに追加

Spring Data JPAを使ってテーブルにアクセスする

 Spring Data JPAでは、図3のようにテーブルに相当するEntityクラスとそのテーブルにアクセスするためのRepositoryクラスを用いてデータの管理を行います。

 ただし、プログラマはRepositoryクラスの実装ではなくインターフェースの定義だけを行います。

図3:Spring Data JPAを使う場合のクラス・インターフェース・アノテーションの関係
図3:Spring Data JPAを使う場合のクラス・インターフェース・アノテーションの関係

Entityクラスを作成する

 テーブルに相当するEntityクラスを作成します。リスト6は、サンプルアプリケーションで住所録を管理するためのcontactテーブルに相当するクラスです。

[リスト6]Entityクラスの実装例(src/main/java/com/coltware/contacts/data/ContactModel.javaの抜粋)
import javax.persistence.*;

@Entity // (1)
@Table(name = "contact") // (2)テーブル指定
public class ContactModel {

    @Id // (3)IDを指定する
    @GeneratedValue // (4)自動生成される値
    private Integer id;

    // (5)各フィールドを定義する
    @Column(name = "zip", nullable = false)
    private String zip;

    @Column(name = "address", nullable = false)
    private String address;

    @Column(name = "name", nullable = false)
    private String name;

    @Column(name = "tel", nullable = false)
    private String tel;

    : (以下省略 setter/getterを定義する)
}

 (1)では、指定したクラスがEntityクラスであることを示すアノテーションを指定します。(2)では対応するテーブル名を指定します。クラス名と同じテーブル名であれば省略可能ですが、筆者は必ず明示的に指定するようにしています。

 (3)は、指定したフィールドが主キーであることを示します。(4)は、主キーの値が自動生成される値であることを示しています。

 また、(5)ではカラムであることを指定します。指定できる項目には主に表6のような項目があります。

表6:@Columnアノテーションに指定できる主な属性
属性キー 説明
name  カラム名を指定。省略した場合には変数名と同じと見なされる
unique ユニーク属性が必要な場合にはtrueを設定する。デフォルトはfalse
nullable  NULL値であることが許されるかどうかの指定。NULL値が許されない場合にはfalseにする。デフォルトはtrue
length 文字列の場合に、文字列長をいくつにするのかの指定。デフォルトは255
columnDefinition カラム定義を手動にて場合に指定する。この指定を利用するのであれば、前述したschema.sqlなどを使うことを検討した方が良いと思われる
insertable NSERT時にカラムとして含むかどうかの指定。デフォルトはtrue
updatable  UPDATE時にカラムとして含むかどうかの指定。デフォルトはtrue

 また、Javaで指定したフィールドの型はテーブル上の型に自動的にマッピングされます。そのマッピングはHibernate ORMのドキュメントを見ると詳しくわかります。

EntityクラスにアクセスするためのRepositoryインターフェースを定義する

 Entityクラスに相当するテーブルデータの取得や追加・保存・削除などは、JpaRepositoryインターフェースを継承することで行います。

 今回のサンプルアプリケーションでは基本的なCRUD(Create/Read/Update/Delete)操作のみのため、リスト7のように、具体的なコードは何も実装する必要はありません。

[リスト7]リポジトリクラスの実装例(src/main/java/com/coltware/contacts/data/ContactRepository.javaの抜粋)
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository // (1)
// (2) 扱うEntityクラスと主キーの型を指定
public interface ContactRepository extends JpaRepository<ContactModel,Integer> {
}

 (1)では、このインターフェースがJPAに置けるRepositoryであることを指定します。また、JpaRepositoryを継承する際には(2)のように扱うEntityクラスであるContactModelクラスとそのクラスの主キーの方であるIntegerを指定します。

データの取得

 作成したContactRepositoryを使ってデータを取得する場合にはfindById、findOneやfindAllといったメソッドを利用します。リスト8はこれらの利用例です。

[リスト8]データの取得例(src/main/java/com/coltware/contacts/controller/ContactController.javaの抜粋)
// (省略)
public class ContactController {
    // (省略)
    // (1)Repositoryインスタンスを取得する
    @Autowired
    ContactRepository contactRepository;

    // (省略)

    @GetMapping("/item/{id}")
    public Response itemAction(@PathVariable("id") String id){
        : (省略)
        // (2)主キーを指定した値の取得
        Optional<ContactModel> model = contactRepository.findById(rid);
        : (省略)
    }
    : (省略)
    @GetMapping("/list")
    public Response listAction(){
        // (3)全件データの取得
        List<ContactModel> list = contactRepository.findAll();
        return Response.createSuccessResponse(list);
    }
}

 (1)ではContactRepositoryを取得します。また、(2)で主キーを使った取得メソッドであるfindByIdを使ってデータを取得します。

 また、すべてのデータを取得するには、(3)のようにfindAllメソッドで取得できます。

データの追加・更新・削除

 データの登録と更新は、いずれもsaveもしくはsaveAndFlushメソッドにて行います。また、削除はdeleteもしくは、deleteByIdメソッドなどを利用します。

 リスト9はデータの登録と更新、削除を行うコード例です。

[リスト9]データの追加・更新・削除例(src/main/java/com/coltware/contacts/controller/ContactController.javaの抜粋)
public Response addAction(@RequestBody(required = false) ContactModel item){
    // (1)データの登録
    contactRepository.save(item);
    return Response.createSuccessResponse(item);
}
// : (省略)
public Response updateAction(@PathVariable("id") String id,@RequestBody(required = false) ContactModel item){

    // (2)更新対象の取得
    Optional<ContactModel> model = contactRepository.findById(rid);
    // : (省略)
    ContactModel updateModel = model.get();
    updateModel.setZip(item.getZip());
    updateModel.setAddress(item.getAddress());
    updateModel.setName(item.getName());
    updateModel.setTel(item.getTel());

    // (3)更新
    contactRepository.save(updateModel);
}
// : (省略)
public Response deleteAction(@PathVariable("id") String id){

    Optional<ContactModel> model = contactRepository.findById(rid);
    // : (省略)
    // (4)削除
    contactRepository.delete(model.get());
}

 (1)ではJSON形式から自動的にContactModelオブジェクトに変換したデータを用いてデータを登録しています。

 この際、IDが指定されていないことから、自動的にsaveメソッドがデータ登録を行います。また更新では、(2)のようにIDを指定しオブジェクトを指定し、それぞれの変更データを設定し、(3)のsaveメソッドで更新を行います。

 オブジェクトにいはIDが指定されていることから自動的にデータは更新されます。また、(4)のようにdeleteメソッドで削除可能です。

 ここで説明した以外にもデータ数を取得するcountメソッドやその他のメソッドもありますので、JpaRepositoryのJavaDocを参照してみてください。

最後に

 Spring Bootでのデータベース操作についても、前回同様、今回だけでは紹介しきれない内容がまだまだたくさんあります。

 プログラム部分ではSpring Data JPAを用いた簡単なデータ操作のみについて紹介しましたが、トランザクションを使った操作や、特定の条件を指定した場合のデータ取得など実際の利用時にまだ多くのことを理解する必要があります。

 ただし、これらは、Spring Bootというよりは個別のプロジェクトの内容になるため、本稿では詳しく紹介しません。JPAについて詳しく知りたい方は、その他のブログ、書籍やSpring Data JPAのリファレンスドキュメントなども併せてご覧ください。

参考資料

 

本連載の書籍が発売されました!

Javaによる高速Webアプリケーション開発のためのSpring Boot入門

Amazon(POD) Amazon(電子書籍) その他

Javaによる高速Webアプリケーション開発のためのSpring Boot入門

著者:WINGSプロジェクト 小林昌弘
発売日:2020年5月31日(水)
価格(POD):2,200円(税込)
価格(電書):1,760円(税込)

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Spring Bootで作るマイクロサービス連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/11584 2020/06/01 18:59

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング