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

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

    スプリングブートとは:
    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 + "]";
      }
    }
    

    mysqlがネストされたクラスに対して単一のオブジェクトを返す場合にrowmapperを使用する方法:

    制限1の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 limit 1
    
    

    データベースにアクセスする方法:

    Javaメソッド

    public SportsThresholdCommonDTO getSportsThresholdCommonObject() {
        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 limit 1";
    return jdbcTemplate.queryForObject(sql, SportsThresholdCommonDTO.class);
      }
    

    待機はここで終了します!!!

    マッパークラス

    package workspace;
    
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import javax.swing.tree.RowMapper;
    
    public class SportsThresholdCommonMapper implements RowMapper<SportsThresholdCommonDTO> {
    
      @Override
      public SportsThresholdCommonDTO mapRow(ResultSet rs, int rowNum) throws SQLException {
        SportsThresholdCommonDTO sportsThresholdCommonDTO = new SportsThresholdCommonDTO();
        SportsMasterDTO sportsMasterDTO = new SportsMasterDTO();
        SportsMetaDTO sportsMetaDTO = new SportsMetaDTO();
        ThresholdDTO thresholdDTO = new ThresholdDTO();
        sportsMasterDTO.setId(rs.getInt("sportsMasterId"));
        sportsMasterDTO.setSportsCode(rs.getString("sportsCode"));
        sportsMetaDTO.setId(rs.getInt("sportsMetaId"));
        sportsMetaDTO.setSportsName(rs.getString("sportsName"));
        sportsMetaDTO.setSportsMasterId(rs.getInt("sportsMasterId"));
        thresholdDTO.setId(rs.getInt("thresholdId"));
        thresholdDTO.setSportsMetaDataId(rs.getInt("sportsMetaId"));
        thresholdDTO.setValue(rs.getString("value"));
        sportsThresholdCommonDTO.setSportsMasterDTO(sportsMasterDTO);
        sportsThresholdCommonDTO.setSportsMetaDTO(sportsMetaDTO);
        sportsThresholdCommonDTO.setThresholdDTO(thresholdDTO);
        return sportsThresholdCommonDTO;
      }
    }
    

    別の方法:

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

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

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

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


    1. 垂直出力を使用するようにMariaDBを設定する方法

    2. T-SQLを使用してSQLServerでデータベースのリカバリモデルを取得する方法

    3. AWS上のWindowsでのShareplex入門、パート1

    4. SQLで月末日を取得する