Spring Boot/第三回 Spring Bootでデータベース操作(準備編)

Spring Bootでデータベース操作をする。
今回は準備編としてSpring Bootでのデータベース接続と、サンプルのドメインオブジェクトを作成する。

依存関係の追加

今回はH2を使う。
まずはMavenの依存関係を追加する。

  <dependencies>
    <!-- append start -->
    <dependency>  <!-- a -->
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>  <!-- b -->
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
    </dependency>
    <dependency>  <!-- c -->
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.14.0</version>
      <scope>provided</scope>
    </dependency>
    <!-- append end -->
  </dependencies>

a -> Spring BootでJDBCを扱うための依存関係。
b -> H2の依存関係。
c -> Lombokの依存関係。

LombokはデータベースともSpring Bootとも関係はないが、Javaの短所の一つsetter/getter地獄から解放してくれたり、toString()・equals()メソッドを自動実装してくれたりしてくれるプロダクト。
コードが短くなるのでここで依存関係を追加する。
Lombokについて、詳しくはググりましょう。

データベース接続

アプリケーションが接続する先のデータベースを定義する。
定義は下記のYAML形式のファイルに行う。

src/main/resources/application.yml

このファイルに下記の内容を記載する。

spring:
  datasource:
    driverClassName: org.h2.Driver
    url: jdbc:h2:file:testdb/testdb
    username: sa
    password:

接続先はurlで指定していて、今回はカレントフォルダにtestdbフォルダを作って、その中に作成する。
実行環境によって作成される場所が変わるので注意が必要。


Spring Bootはクラスパス直下に下記のファイルがあると自動で実行する。

  • schema-(platform).sql
  • schema.sql
  • data-(platform).sql
  • data.sql

ファイル名からわかるように、schemaにはテーブル定義用のDDLを、dataには初期データ用のDMLを記載する。
どちらのファイルも起動するたびに実行されるので注意が必要。
つまりDDLはテーブルが存在する場合を考慮しないといけないし、DMLはキー重複しないよう考慮しないといけない。
・・・実際の業務ではあまり使わない機能かと思う。

今回はschema.sqlを使ってサンプルテーブルを作成する。
前述の通り、テーブルが存在する場合を考慮して「if not exists」を入れている。

create table if not exists customer (
    id int primary key auto_increment,
    name varchar(50),
    email varchar(50)
);

ここまででコンパイルする。

mvn compile

続いて起動

mvn spring-boot:run

するとプロジェクトフォルダに「testdb」フォルダが作成され、その中に「testdb.h2.db」と「testdb.lock.db」の2ファイルが生成される。
これがH2のデータベースファイルとなる。

起動後のコンソールの最後のに「Executing SQL script」とあり「schema.sql」を実行したとのことなので、テーブルが出来ているのでしょう。

ドメインオブジェクト

先ほど作ったcustomerテーブルのドメインオブジェクトを作る。

package tools.springsample.springsample03.domain;

public class Customer {
    private Integer id;
    private String name;
    private String email;
}

まずはcustomerテーブルのカラムと同名のフィールドを宣言する。
これだけだとprivateフィールドなのでどこからもアクセスできない。
setter/getter等が必要だが、決まりきった実装をするのが手間なので、ここで先述のLombokの出番となる。

Lombokを使って宣言すると下記のようになる。

package tools.springsample.springsample03.domain;

import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

@Data    // a
@AllArgsConstructor  // b
@NoArgsConstructor  // c
public class Customer {
    private Integer id;
    private String name;
    private String email;
}

アノテーションを付けたのと、そのアノテーションのimportを追加した。
アノテーションの意味は下記の通り。
a -> すべてのフィールドに対するsetter/getterメソッド、equalsメソッド、hashCodeメソッド、toStringメソッドが生成される。
b -> すべてのフィールドを初期化する引数を持つコンストラクタが生成される。
c -> 引数なしのデフォルトコンストラクタが生成される。

これらの煩雑なコードを自動的に生成してくれるLombokは便利。
本当に生成されたのか、javapコマンドで見てみる。

Compiled from "Customer.java"
public class tools.springsample.springsample03.domain.Customer {
  public java.lang.Integer getId();
  public java.lang.String getName();
  public java.lang.String getEmail();
  public void setId(java.lang.Integer);
  public void setName(java.lang.String);
  public void setEmail(java.lang.String);
  public boolean equals(java.lang.Object);
  public int hashCode();
  public java.lang.String toString();
  public tools.springsample.springsample03.domain.Customer(java.lang.Integer, java.lang.String, java.lang.String);
  public tools.springsample.springsample03.domain.Customer();
}

@Dataで指定したgetterメソッドが3つ、setterメソッドが3つ、equalsメソッド、hashCodeメソッド、toStringメソッドが、
@AllArgsConstructorで指定した全フィールドを引数を持つコンストラクタが、
@NoArgsConstructorで指定したデフォルトコンストラクタが生成されたのがわかる。

ほかにどのようなアノテーションがあり、何が起きるかは、Lombokのサイトを参照。
http://projectlombok.org/features/index.html


準備編はここまで。

■ 参考文献 ■

この記事で参考にしたのは「はじめての Spring Boot」です。