入れ子クラス- Customrowmapper!もう問題じゃない!第2部


スプリングブートとは
Spring BootはオープンソースのMicroServiceベースのJava Webフレームワークです.
rowmapper :
Rowmapperインターフェイスは、JDbcTemplateによって行単位で結果セットの行をマッピングするために使用されます.
導入
ここでは、オブジェクトのリストを戻り型としたい場合に、カスタム行マッパーを使用します.
入れ子クラスに対するRowmapperの問題点:
クラスの入れ子によって個々のプリミティブデータ型変数を正確に正確に知ることができないので、DBから返されるパラメーターを直接クラスに割り当てることはできません.

この例で使用するクラス図



単純なクラス


SportsMasterto.ジャバ
package workspace;

public class SportsMasterDTO {
  private int id;
  private String sportsCode;

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public String getSportsCode() {
    return sportsCode;
  }

  public void setSportsCode(String sportsCode) {
    this.sportsCode = sportsCode;
  }
}

SportsMetadToクラス:
package workspace;

public class SportsMetaDTO {
  private int id;
  private int sportsName;
  private int sportsMasterId;
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public int getSportsName() {
    return sportsName;
  }
  public void setSportsName(int sportsName) {
    this.sportsName = sportsName;
  }
  public int getSportsMasterId() {
    return sportsMasterId;
  }
  public void setSportsMasterId(int sportsMasterId) {
    this.sportsMasterId = sportsMasterId;
  }
  @Override
  public String toString() {
    return "SportsMetaDTO [id=" + id + ", sportsName=" + sportsName + ", sportsMasterId="
        + sportsMasterId + "]";
  }
}

しきい値クラス
package workspace;

public class ThresholdDTO {
  private int id;
  private int sportsMetaDataId;
  private String value;

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public int getSportsMetaDataId() {
    return sportsMetaDataId;
  }

  public void setSportsMetaDataId(int sportsMetaDataId) {
    this.sportsMetaDataId = sportsMetaDataId;
  }

  public String getValue() {
    return value;
  }

  public void setValue(String value) {
    this.value = value;
  }

  @Override
  public String toString() {
    return "ThresholdDTO [id=" + id + ", sportsMetaDataId=" + sportsMetaDataId + ", value=" + value
        + "]";
  }


}

入れ子クラス:


ネストしたクラス
package workspace;

public class SportsThresholdCommonDTO {
  private SportsMasterDTO sportsMasterDTO;
  private SportsMetaDTO sportsMetaDTO;
  private ThresholdDTO thresholdDTO;
  public SportsMasterDTO getSportsMasterDTO() {
    return sportsMasterDTO;
  }
  public void setSportsMasterDTO(SportsMasterDTO sportsMasterDTO) {
    this.sportsMasterDTO = sportsMasterDTO;
  }
  public SportsMetaDTO getSportsMetaDTO() {
    return sportsMetaDTO;
  }
  public void setSportsMetaDTO(SportsMetaDTO sportsMetaDTO) {
    this.sportsMetaDTO = sportsMetaDTO;
  }
  public ThresholdDTO getThresholdDTO() {
    return thresholdDTO;
  }
  public void setThresholdDTO(ThresholdDTO thresholdDTO) {
    this.thresholdDTO = thresholdDTO;
  }
  @Override
  public String toString() {
    return "SportsThresholdCommonDTO [sportsMasterDTO=" + sportsMasterDTO + ", sportsMetaDTO="
        + sportsMetaDTO + ", thresholdDTO=" + thresholdDTO + "]";
  }
}
MySQLクエリは制限なしで3つのテーブルに結合を含んでいます
select 
  sm.id as sportsMasterId, 
  sm.sportsCode, 
  smd.id as sportsMetaId, 
  smd.sportsName, 
  smd.sportsMasterId, 
  t.id as thresholdId, 
  t.sportsMetaDataId, 
  t.value 
from 
  sportsMaster 
  inner join sportsMetaData smd on sm.id = smd.sportsMasterId 
  inner join threshold t on t.sporsMetaDataId = smd.id

MySQLがネストしたクラスのオブジェクトのリストを返す場合、行マッパを使用する方法
ジャバメソッド
public List<AlertingMasterThresholdCommonDTO> getSportsThresholdCommonList() {
    String sql =
        "select sm.id as sportsMasterId, sm.sportsCode, smd.id as sportsMetaId, smd.sportsName, smd.sportsMasterId, t.id as thresholdId, t.sportsMetaDataId, t.value from sportsMaster inner join sportsMetaData smd on sm.id = smd.sportsMasterId inner join threshold t on t.sporsMetaDataId = smd.id";
    return sportsThresholdCommonMapperList
        .mapper(jdbcTemplate.queryForList(sql));
  }

ここで待ち時間!


マッパークラス
package workspace;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class SportsThresholdCommonMapperList {
  public List<SportsThresholdCommonDTO> mapper(List<Map<String, Object>> rows) {
    List<SportsThresholdCommonDTO> sportsThresholdCommonDTOs = new ArrayList<>();
    for (Map rs : rows) {
      SportsThresholdCommonDTO sportsThresholdCommonDTO = new SportsThresholdCommonDTO();
      SportsMasterDTO sportsMasterDTO = new SportsMasterDTO();
      SportsMetaDTO sportsMetaDTO = new SportsMetaDTO();
      ThresholdDTO thresholdDTO = new ThresholdDTO();
      sportsMasterDTO.setId((Integer) rs.get("sportsMasterId"));
      sportsMasterDTO.setSportsCode((String) rs.get("sportsCode"));
      sportsMetaDTO.setId((Integer) rs.get("sportsMetaId"));
      sportsMetaDTO.setSportsName((String) rs.get("sportsName"));
      sportsMetaDTO.setSportsMasterId((Integer) rs.get("sportsMasterId"));
      thresholdDTO.setId((Integer) rs.get("thresholdId"));
      thresholdDTO.setSportsMetaDataId((Integer) rs.get("sportsMetaId"));
      thresholdDTO.setValue((String) rs.get("value"));
      sportsThresholdCommonDTO.setSportsMasterDTO(sportsMasterDTO);
      sportsThresholdCommonDTO.setSportsMetaDTO(sportsMetaDTO);
      sportsThresholdCommonDTO.setThresholdDTO(thresholdDTO);
      sportsThresholdCommonDTOs.add(sportsThresholdCommonDTO);
    }
    return sportsThresholdCommonDTOs;
  }
}

交互の方法

  • はすべてのクラス
  • の変数を含む新しいモデルを作ります
  • Tモデルを適切にマップするエイリアスを
  • の結果は、すべてのデータを持つ未入れ子クラスです.
  • 別のモデルを作ることの欠点
  • 保全性オーバーヘッド
  • エイリアスを作り、すべてのモデル
  • で異なる名前を保持する
    結論
    我々は、カスタム行マッパーの助けを借りてMySQLからネストされたクラスのオブジェクトのリストを取得することができます.