SpringBoot入門 vol.16:DBのコード値から画面表示用テキストに変換しよう
現在の「CUSTOMER」テーブルに「性別」カラムをコード値(0 or 1)で追加
データベースとマッピングしてコード値から画面表示用テキストに変換する方法を解説する
カラムの追加やテーブル作成は「Spring Boot入門 vol.15:Flywayマイグレーションでデータベースの管理をしよう」で解説した方法で実行する
Spring Boot入門 vol.15:Flywayマイグレーションでデータベースの管理をしよう
①「CUSTOMER」テーブルに「性別」カラムを追加
ファイル名:V0_0_2__addColGenderAndUpdateCustomer.sql
格納場所:src/main/resources/db/migration
ALTER TABLE CUSTOMER ADD (GENDER VARCHAR(1) COMMENT '性別');
-- 性別はコード値で管理(男性:0、女性:1)
UPDATE CUSTOMER
SET GENDER = '0'
WHERE ID < 3;
UPDATE CUSTOMER
SET GENDER = '1'
WHERE ID = 3;
【ポイント】
・性別の種別(男性、女性)はコード値で管理
「男性:0」
「女性:1」
・画面で表示する時はコード値(0 or 1)から値(男性 or 女性)に変換する
・変換処理は後ほど作成する「MASTER」テーブルを使用する
②「Customer.java」と「CustomerForm.java」に「gender」フィールドを追記
・Customer.java
.
.
.
private String name;
private String email;
//追記
private String gender;
}
・CustomerForm.java
.
.
.
@Size(max = 100)
private String email;
//追記
private String gender;
}
③「MASTER」テーブルの作成
ファイル名:V0_0_3__createAndInsertMaster.sql
格納場所:src/main/resources/db/migration
CREATE TABLE MASTER (
ID INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',
CATEGORY_CD VARCHAR(5) COMMENT 'カテゴリーコード',
CATEGORY_NAME VARCHAR(100) COMMENT 'カテゴリー名',
OUTPUT_CD VARCHAR(5) COMMENT '出力コード',
OUTPUT_NAME VARCHAR(100) COMMENT '出力名'
);
INSERT INTO MASTER (CATEGORY_CD, CATEGORY_NAME, OUTPUT_CD, OUTPUT_NAME) VALUES ('00001', '性別', '0', '男性');
INSERT INTO MASTER (CATEGORY_CD, CATEGORY_NAME, OUTPUT_CD, OUTPUT_NAME) VALUES ('00001', '性別', '1', '女性');
【「MASTER」テーブルの概要】
・CATEGORY_CD(カテゴリーコード)
種目コードのようなもの
※今回のように「性別」の1種類のみなら不要だが、今後の拡張性を考慮している
・CATEGORY_NM(カテゴリー名)
種目名のようなもの
※「CATEGORY_CD」と同じく1種類のみなら不要
・OUTPUT_CD(出力コード)
コード値
・OUTPUT_NAME(出力名)
画面で出力する値
上記にカラムを利用して画面で表示する時はコード値(0 or 1)から値(男性 or 女性)に変換する方法で実装する
④エンティティクラスとなる「Master.java」を作成
格納ディレクトリ:src\main\java\com\example\domain
package com.example.domain;
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;
@Entity
@Table(name = "master")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Master {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String categoryCd;
private String categoryName;
private String outputCd;
private String outputName;
}
アノテーション等の内容はSpring Boot入門 vol.7:データベースを使おうを参照
⑤「MasterRepositoryインターフェース」を作成する
格納ディレクトリ:src\main\java\com\example\repository
package com.example.repository;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import com.example.domain.Master;
public interface MasterRepository extends JpaRepository<Master, Integer> {
//ポイント1
@Query("SELECT u FROM Master u WHERE u.categoryCd = :categoryCd")
//ポイント2
List<Master> masterList(@Param("categoryCd") String categoryCd);
}
【ポイント】
1.「:変数名」
JPQLのパラメータ名は「:変数名」と記述する
2.「@Param("パラメーター名") 型 変数」
メソッドの引数をWHERE句に代入している
⑥サービスクラスとなる「MasterService.java」を作成
格納ディレクトリ:src\main\java\com\example\service
package com.example.service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.example.domain.Master;
import com.example.repository.MasterRepository;
@Service
@Transactional
public class MasterService {
@Autowired
MasterRepository masterRepository;
public Map<String, String> masterMap(String categoryCd) {
//ポイント1
List<Master> list = masterRepository.masterList(categoryCd);
Map<String, String> map = new HashMap<>();
//ポイント2
for (Master item : list) {
map.put(item.getOutputCd(), item.getOutputName());
}
return map;
}
}
【ポイント】
1.List
カテゴリーコードをキーにマスターテーブルからレコードを取得し、リストに格納
2.for (Master item : list)・・・
mapインスタンスに出力コードと出力名を格納
これにより下記の処理を実行できる
Ⅰ.「SELECT * FROM MASTER WHERE CATEGORY_CD = ‘00001’」でレコードを取得
Ⅱ.Map(0:男性, 1:女性)を戻り値にする
⑦定数管理ファイル(Constant.java)を作成
MATERテーブルで使用するカテゴリーコード等の定数をまとめて管理するファイル
格納ディレクトリ:src/main/java/com/example/constant
package com.example.constant;
public class Constant {
/**
* カテゴリーコード
*/
public enum CATEGORY_CD {
GENDER("00001");
private String value;
private CATEGORY_CD(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
}
}
⑧コントローラークラス(CustomerContoroller.java)に追記
.
.
//ポイント1
@Autowired
MasterService masterService;
.
.
@GetMapping
//ポイント2
String list(@ModelAttribute CustomerForm customerForm, Model model) {
List<Customer> customers = customerService.findAll();
model.addAttribute("customers", customers);
.
.
【ポイント】
1.「MasterService」をDI
2.「CustomerForm」をモデルに格納
⑨顧客一覧画面(list.html)の編集
.
.
<tr>
<th>ID</th>
<th>名前</th>
<th>メールアドレス</th>
<!-- 追記1 -->
<th>性別</th>
<th colspan="2">編集</th>
</tr>
<tr th:each="customer : ${customers}">
<td th:text="${customer.id}"></td>
<td th:text="${customer.name}"></td>
<td th:text="${customer.email}"></td>
<!-- 追記2 -->
<!-- ポイント1 -->
<td th:text="${genderMap.get('__${customer.gender}__')}"></td>
.
.
【ポイント】
1.${genderMap.get(‘${customer.gender}‘)}
「__${employee.gender}__」でプリプロセッシング(事前評価)することにより、「0 or 1」がセットされる
${genderMap.get(‘キー’)}でキーを元にマップを取得することにより、「男性 or 女性」が表示される
⑩アプリケーションを起動して顧客一覧画面を確認