sql >> データベース >  >> RDS >> Mysql

ネストされたクラス-CustomRowMapper!!もう問題ありません!! - パート2

    スプリングブートとは:
    Spring Bootは、オープンソースのマイクロサービスベースのJavaWebフレームワークです。

    RowMapper:
    RowMapperインターフェイスは、JdbcTemplateによって、行ごとにResultSetの行をマッピングするために使用されます。

    はじめに
    ここでは、オブジェクトのリストをリターンタイプとして使用する場合に、カスタム行マッパーを使用します。

    ネストされたクラスのRowMapperの問題:
    クラスのネストのために個々のプリミティブデータ型変数を正確に指定できないため、DBから返されたパラメータをクラスモデルに直接割り当てることはできません。

    この例で使用されているクラス図:

    シンプルクラス:ネストされていないクラス

    SportsMasterDTO.java

    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 + "]";
      }
    }
    
    

    ThresholdDTOクラス

    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
            + "]";
      }
    
    
    }
    
    

    ネストされたクラス:

    ネストされたクラス:SportsThresholdCommonDTO

    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 + "]";
      }
    }
    

    制限なしで3つのテーブルの結合を含むMYSQLクエリ

    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がネストされたクラスのオブジェクトのリストを返す場合の行マッパーの使用方法:
    Javaメソッド

    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;
      }
    }
    

    別の方法:

    1. すべてのクラスの変数を含む新しいモデルを作成します
    2. エイリアスを作成してモデルを適切にマッピングする
    3. 結果は、すべてのデータを含むネストされていないクラスになります。

    別のモデルを作成することの欠点

    1. 保守性のオーバーヘッド
    2. エイリアスを作成し、すべてのモデルで異なる名前を維持する

    結論
    カスタム行マッパーを使用して、mysqlからネストされたクラスオブジェクトリストを取得できます。


    1. C#から出力パラメータとして参照カーソルを使用してOracle関数を呼び出す方法は?

    2. MariaDBでATAN2()がどのように機能するか

    3. t-sqlで「execute」を使用して値を変数に設定するにはどうすればよいですか?

    4. 更新コマンドでのSQLServerエラー-現在のコマンドで重大なエラーが発生しました