CodeZine(コードジン)

特集ページ一覧

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

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2019/07/01 11:00

目次

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円(税込)



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

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

もっと読む

著者プロフィール

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

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。個人紹介主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応...

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

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

あなたにオススメ

All contents copyright © 2005-2022 Shoeisha Co., Ltd. All rights reserved. ver.1.5