プログラミング逆引き辞典

~ 多言語対応のプログラミングレシピ ~

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 list = masterRepository.masterList(categoryCd);
カテゴリーコードをキーにマスターテーブルからレコードを取得し、リストに格納
 
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 女性」が表示される
 
 


⑩アプリケーションを起動して顧客一覧画面を確認

 
 


前へ
 
目次へ戻る