SpringBoot入門 vol.7:データベースを使おう
前提条件:データベースの使用する為の準備が完了していること
(「build.gradle」・「application.properties」への記述等)
まだ設定ができていない場合は下記を参考に設定すること
Spring Boot入門 vol.6:データベースの準備をしよう
※Spring Boot入門 vol.1から順に学習している場合
これまでに作成したファイルは不要なので「SampleController.java」、「hello.html」、「result.html」を削除しておくこと
①MySQLにテーブル作成し、レコードを挿入
【SQL内容 テーブル作成】
※今回はシンプルな「CUSTOMER」テーブルを作成
CREATE TABLE CUSTOMER (
ID INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
EMAIL VARCHAR(100)
)
;
【SQL内容 レコードを挿入】
INSERT INTO CUSTOMER (NAME, EMAIL) VALUES ('田中', 'tanaka@hoge.com');
INSERT INTO CUSTOMER (NAME, EMAIL) VALUES ('山田', 'yamada@hoge.jp');
INSERT INTO CUSTOMER (NAME, EMAIL) VALUES ('川崎', 'kawasaki@hoge.co.jp');
【作成結果】
ID | NAME | |
---|---|---|
1 | 田中 | tanaka@hoge.com |
2 | 山田 | yamada@hoge.jp |
3 | 川崎 | kawasaki@hoge.co.jp |
②エンティティクラスとなる「Customer.java」を作成
格納ディレクトリ:src\main\java\com\example\domain
※「domain」パケージは新たに作成しておく
package com.example.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
//ポイント1
@Entity
@Table(name = "customer")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Customer {
//ポイント2
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(nullable = false)
private String name;
private String email;
}
【ポイント】
1.下記アノテーションを設定
・@Entity
⇒JPAのエンティティであることを示す
・@Table(name = "customer")
⇒エンティティに対応するテーブル名を指定
・@Data
⇒getter、setterメソッド等を生成
・@AllArgsConstructor
⇒全ての引数を持つコンストラクタを生成
・@NoArgsConstructor
⇒引数を持たないコンストラクタを生成
※JPAの仕様でエンティティクラスには引数のないコンストラクタが必要な為>※JPAの仕様でエンティティクラスには引数のないコンストラクタが必要な為
2.下記アノテーションを設定
・@Id
⇒エンティティの主キーを示す
・@GeneratedValue(strategy = GenerationType.IDENTITY)
⇒主キーが自動採番されることを示す
・@Column(nullable = false)
⇒NotNull制約を示す
③「JpaRepositoryインターフェース」を継承した「CustomerRepositoryインターフェース」を作成する
格納ディレクトリ:src\main\java\com\example\repository
※「repository」パケージは新たに作成しておく
「JpaRepository」にはCRUD操作の為の基本的なメソッドが定義されている
※CRUD:「Create」、「Read」、「Update」、「Delete」の頭文字
package com.example.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.example.domain.Customer;
//ポイント1
public interface CustomerRepository extends JpaRepository<Customer, Integer> {
}
【ポイント】
1.JpaRepositoryを継承
【構文】 public interface 名前 extends JpaRepository <エンティティ , IDタイプ>
例)JpaRepository<Customer, Integer>
④サービスクラスとなる「CustomerService.java」を作成
格納ディレクトリ:src\main\java\com\example\service
※「service」パケージは新たに作成しておく
package com.example.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.example.domain.Customer;
import com.example.repository.CustomerRepository;
//ポイント1
@Service
@Transactional
public class CustomerService {
//ポイント2
@Autowired
CustomerRepository customerRepository;
//ポイント3
public List<Customer> findAll() {
return customerRepository.findAll();
}
}
【ポイント】
1.下記アノテーションを設定
・@Service
⇒サービスクラスであることを示し、クラスのBeanをDIコンテナに登録する
・@Transactional
⇒DBのトランザクション制御
2.DIを行う為に「@Autowired」を付与する
「DI」はSpringの肝となる部分なので次回の「Spring Boot入門 vol.8:DIを理解しよう」で詳しく解説する
3.「JpaRepositoryインターフェース」を継承している為、customerRepository.findAllメソッドで「SELECT * FROM CUSTMER」相当の処理を行う
⑤コントロールクラスとなる「CustomerController.java」を作成
格納ディレクトリ:src\main\java\com\example\web
※「web」パケージは新たに作成しておく
package com.example.web;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import com.example.domain.Customer;
import com.example.service.CustomerService;
//ポイント1
@Controller
public class CustomerController {
@Autowired
CustomerService customerService;
//ポイント2
@GetMapping("/")
String list(Model model) {
//ポイント3
List<Customer> customers = customerService.findAll();
model.addAttribute("customers", customers);
return "list";
}
}
【ポイント】
1.「@Controller」を付与してコントロールクラスであることを示す
2.「@GetMapping」を付与してHTTPリクエストのGETメソッドが呼ばれた時にそのメソッドで処理をする
3.「customerService.findAll()メソッド」でDBのレコードを取得
addAttribute()メソッドでModelオブジェクトに追加
「return "list";」で「list.htmlに遷移
⑥画面表示の為の「list.html」を作成する
「CustomerController.java」を作成
格納ディレクトリ:src/main/resources/templates
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>顧客一覧</title>
</head>
<body>
<table>
<tr>
<th>ID</th>
<th>名前</th>
<th>メールアドレス</th>
</tr>
<!-- ポイント1 -->
<tr th:each="customer : ${customers}">
<!-- ポイント2 -->
<td th:text="${customer.id}"></td>
<td th:text="${customer.name}"></td>
<td th:text="${customer.email}"></td>
</tr>
</table>
</body>
</html>
【ポイント】
1.「th:each="変数名 : ${属性名}"」で拡張For構文相当の役割をする
<tr th:each="customer : ${customers}">
2.「th:text="${変数.プロパティ名}"」でDBのレコードを取得
<td th:text="${customer.id}"></td>
<td th:text="${customer.name}"></td>
⑦プロジェクトを起動して「http://localhost:8080/」にアクセスして確認