Spring BootでSpring Data JPAを利用できるようになる
今回は、Spring BootでSpring Data JPAを利用できる環境を構築します。
環境
筆者は以下の環境で構築を進めていきます。
お手持ちのPCとの構成や使うIDEが違う場合、適宜読み替えていただけると幸いです。
- OS Windows 10 Pro 64bit
- JDK Amazon Corretto 11
- IDE IntelliJ IDEA Community Editioin 2020.1.3
※ Java 8でも動作すると思われますが、基本的にJava 8はサポートが終了しているので、現行LTSバーションのJava 11を使用することをおすすめします。
Spring Bootの雛形を作成する
Springの公式サイトにて手軽にSpring Boot環境を作成できるように、プロジェクトの雛形を作成するツールが公開されているので、今回はそちらを利用していきます。
基本的にデフォルトのままでよいが、今回は以下の入力を変更しています。
-
Project
-
Maven Project
→Gradle Project
-
-
Java
-
8
→11
-
-
Dependencies ※以下を選択肢から追加する
-
Spring Web
必須 Webサーバー(Tomcat)を提供してくれる -
Spring Data JPA
必須 今回の要となるライブラリ -
H2 Database
DBサーバーを用意しない場合必須 組み込み型のDB -
Lombok
今回は必須 モデルクラスの Getter / Setter を省略できるようになる
-
今回はDBサーバーの構築工程を省略できる組み込みDB H2 Database
を採用しました。
DBとしてMySQLサーバーを利用する場合は、 H2 Database
ではなく MySQL Driver
をDependenciesに追加してください。
※MySQL Driverを用いる場合のDB接続方法は今回は省略します、本稿の内容と逸れてしまうためご了承ください。
一通りの入力を済ませたら左下の Generate
を押下してzipファイルを適宜フォルダへ解凍してください。
Lombok
は冗長となるGetterやSetterメソッドを省略することができるため、導入することをおすすめします。
また、以下で紹介するコードは Lombok
を選択した前提での実装となっています。
IDEのセットアップ
IntelliJ IDEAを利用する場合、設定(File > Settings...)のPluginsからLombokプラグインをインストールして再起動してください。
IDEでプロジェクトを開く
ダウンロードしたファイルの中にある build.gradle
を選択して OK
を押下するとプロジェクトとして開くかファイル単体として開くかを問われるので、 Open as Project
を押下。
Open as Project
を押下するとIDE側でSpring Bootで必要なライブラリを自動的にダウンロードしてくれるので、しばらく放置しましょう。
ステータスバーのローディング状態が終われば実際にSpring Bootが動作する状態となります。
IntelliJ IDEA標準レイアウトの場合、右サイドバーが隠れているので右端にある Gradle
ボタンを押下してサイドバーを表示させます。
demo > Tasks > application > bootRun
を実行すると、SpringアプリケーションとWebサーバーが立ち上がります。
立ち上がった状態にてブラウザで http://localhost:8080 にアクセスすると以下のようなエラーページが表示されると思います(正常な挙動です)。
また、停止ボタンを押してから再度 http://localhost:8080 へアクセスしようとしても、ページが表示されないことを確認できればOKです。
設定ファイルのリネームとDB設定
src/main/resources/application.properties
を application.yml
に変更し、DB情報を追記します。
spring:
# データの保存手段にh2dbを用いて、格納先とDBのモードを指定する(今回はH2DBをMySQLのように振る舞わせる)
datasource:
url: jdbc:h2:./.data/h2/db;MODE=MySQL
# Spring Bootを再起動してもデータを保持するようにする
jpa:
hibernate:
ddl-auto: update
実装
ここから実際にサンプルを作っていきます。
今回は以下のようなファイル構成で実装を進めますが、適宜変更してもらって構いません。
src/main/java/com/example/demo/
├── DemoApplication.java
├── SampleController.java #新規作成
└── user/
├── User.java #新規作成
├── UserRepository.java #新規作成
└── UserService.java #新規作成
Model(テーブル)の作成
今回は例としてユーザーテーブル用のModelクラスを作成します。
User.java
package com.example.demo.user;
import lombok.Data;
import javax.persistence.*;
@Entity
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(unique = true, nullable = false)
private String userName;
@Column(nullable = false)
private String password;
private String role;
}
ユーザー名とパスワード、権限の情報を持つテーブルを作成しました。
@Id
がプライマリーキーの指定、 @GeneratedValue
でinsertを実行する際にidをユニークな値を格納してくれます。
@Column
で、カラムの情報を適宜セットしています。
※ userName
は他のユーザー名と重複しないように unique
指定にしたり、 null
にならないように等。
次にモデルクラスをベースにデータのやりとりを行う Repository
を作成します。
Repositoryインターフェースの作成
UserRepository.java
package com.example.demo.user;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
}
JpaRepository<User, Integer>
でRepositoryインターフェースでデータのやり取りするModelクラスを指定しています。
Integer
の指定は User
モデルクラスの @Id
で指定した型を指定してあげればOK。
Serviceクラスの作成
実際にはRepositoryインターフェースを作った時点で、データ新規作成・更新・データ取得・削除(CURD)はできるようになっているのですが、Userテーブルの保存と同時に他のテーブルにも更新をかけたり等、もう少し複雑な処理をする必要がある場合は Serviceクラスを作成してあげるのが望ましいです。
UserService.java
package com.example.demo.user;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.UUID;
@Service
public class UserService {
// UserRepositoryを読み込む
@Autowired
UserRepository userRepository;
/**
* Userテーブルにある全データを出力する
*
* @return 全Userデータ
*/
public List<User> findAll() {
return userRepository.findAll();
}
/**
* ユーザーを登録する
*
* @param user 登録したいユーザー名
*/
public void registerUser(String user) {
var model = new User();
model.setUserName(user);
// 実際にアプリケーションを公開し、パスワードを管理する際は暗号化などの対応必須
// BCryptPasswordEncoderでの暗号化などを検討してください
model.setPassword(UUID.randomUUID().toString());
userRepository.save(model);
}
}
Controllerの実装
データのやりとりをする処理は既に完成したので、実際に動作を確認するために適当なControllerクラスを作成していきます。
今回は一覧の取得とユーザーの作成のみ例として作成してみます。
SampleController.java
package com.example.demo;
import com.example.demo.user.User;
import com.example.demo.user.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.sql.SQLException;
import java.util.List;
@RestController
public class SampleController {
@Autowired
UserService userService;
/**
* ユーザー一覧取得
*
* @return userテーブルの一覧
*/
@GetMapping("/user")
public ResponseEntity<List<User>> index() {
return ResponseEntity.ok(userService.findAll());
}
/**
* ユーザー登録
*
* @param name userテーブルのuserNameカラムの値
* @return 登録成功時 200 OK を出力, ユーザー名重複による登録失敗時 400
*/
@RequestMapping("/user/create/{name}")
public ResponseEntity create(
@PathVariable("name") String name
) {
userService.registerUser(name);
return ResponseEntity.ok().body("OK");
}
}
ここまで実装してからGradleのbootRunを実行し、 http://localhost:8080/user/create/適当な名前 を何度か繰り返しアクセスし、 http://localhost:8080/user へアクセスするとユーザー一覧が表示されるかと思います。
※この表示はFirefoxで見ているため、データが整形されて表示されていますが、実際にSpring Bootからは以下のようなJSONが出力されています。
[{"id":1,"userName":"testUser1","password":"2c7e5a81-ccc0-426f-bc84-d5b53167a643","role":null},{"id":3,"userName":"testUser2","password":"052b0800-f540-462b-b429-bd2f7c7012de","role":null},{"id":226,"userName":"適当な名前","password":"e3536fd5-914c-429d-8de6-9c84dd8e117a","role":null}]
終わりに
これでSpring Data JPAの最低限の実装は作成できました。
今後、当ブログでSprind Data JPA関連の記事を当記事をベースに横展開していく予定です、
実際に上記の記事で実装した内容は以下にて保管していますので、そちらも参照いただければと思います。
https://git.pu10g.com/root/spring_jpa_example/tree/node/17
参考になれば幸いです。
それでは。