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にはテーブル定義用の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」です。
はじめてのSpring Boot―「Spring Framework」で簡単Javaアプリ開発 (I・O BOOKS)
- 作者: 槇俊明
- 出版社/メーカー: 工学社
- 発売日: 2014/11
- メディア: 単行本
- この商品を含むブログ (4件) を見る