sql >> Databáze >  >> RDS >> Mysql

Vnořené třídy - CustomRowMapper !! Už to není problém!! - Část 1

Co je Spring Boot:
Spring Boot je open source webový framework Java založený na mikroslužbách.

RowMapper:
Rozhraní RowMapper používá JdbcTemplate k mapování řádků sady ResultSet na základě jednotlivých řádků.

Úvod
Zde použijeme vlastní mapovač řádků, když chceme jako návratový typ pouze jeden objekt

Problém v RowMapper pro vnořené třídy:
Nemůžeme přímo přiřadit parametry vrácené z DB do modelu třídy, protože nikdy nemůžeme přesně určit jednotlivé primitivní datové typy proměnných kvůli vnoření tříd.

Diagram třídy použitý v tomto příkladu:

Jednoduchá třída :Nevnořené třídy

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

Třída 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 + "]";
  }
}

Třída 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
        + "]";
  }


}

Vnořená třída:

Vnořená třída: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 + "]";
  }
}

Jak používat rowmapper, pokud mysql vrací jeden objekt pro vnořenou třídu:

Dotaz MYSQL, který obsahuje spojení na 3 tabulkách s limitem 1

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

Jak získat přístup k databázi:

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

Tady čekání končí!!!

Třída mapovače

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

Alternativní způsob:

  1. Vytvořte nový model, který bude obsahovat proměnné všech tříd
  2. Vytvořte aliasy tak, aby správně mapovaly model
  3. Výsledkem bude nevnořená třída se všemi daty.

Nevýhoda vytvoření jiného modelu

  1. Režijní náklady na údržbu
  2. Vytváření aliasů a udržování různých jmen ve všech modelech

Závěr
Jsme schopni získat vnořený objekt třídy z mysql pomocí vlastního mapovače řádků.


  1. Jednoduché nastavení replikace Slony-I.

  2. Dotaz Můj výběr SUM vrátí hodnotu null. Mělo by vrátit 0

  3. Jak začít s SQLCipher pro Android?

  4. Jak vypsat název tabulky ze sqlite DB -- Android