Mysql
 sql >> база данни >  >> RDS >> Mysql

Вложени класове - CustomRowMapper !! Вече не е проблем!! - Част 2

Какво е Spring Boot:
Spring Boot е уеб рамка на Java, базирана на микросервизи с отворен код.

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 заявка, която съдържа обединения на 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 връща списък с обекти за вложен клас:
Метод на 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));
  }

Чакането приключва тук !!!

Mapper Class

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. Направете псевдоними за правилно картографиране на t модел
  3. Резултатът ще бъде невложен клас с всички данни.

Недостатък при направата на друг модел

  1. Режийни разходи за поддръжка
  2. Създаване на псевдоними и запазване на различни имена във всички модели

Заключение
Ние можем да получим списък с вложени клас обекти от mysql с помощта на персонализиран инструмент за преобразуване на редове.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Може ли MySQL да замени няколко знака?

  2. MySQL управление на потребителите

  3. Изберете всички месеци в рамките на даден период от време, включително тези със стойности 0

  4. Информация за базата данни information_schema в MySQL

  5. DATABASE() – Вземете текущото име на базата данни в MySQL