Co to jest wiosenny but:
Spring Boot to otwarta platforma internetowa Java oparta na mikrousługach.
RowMapper:
Interfejs RowMapper jest używany przez JdbcTemplate do mapowania wierszy zestawu wyników na podstawie wiersza.
Wprowadzenie
Tutaj użyjemy niestandardowego mapowania wierszy, gdy chcemy, aby lista obiektów była zwracanym typem.
Problem w RowMapper dla klas zagnieżdżonych:
Nie możemy bezpośrednio przypisać parametrów zwracanych z bazy danych do modelu klasy, ponieważ nigdy nie jesteśmy w stanie dokładnie określić poszczególnych zmiennych typów danych pierwotnych z powodu zagnieżdżenia klas.
Diagram klas użyty w tym przykładzie:
Klasa prosta:klasa niezagnieżdżona
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 Class:
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 + "]";
}
}
Próg klasy DTO
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
+ "]";
}
}
Klasa zagnieżdżona:
Klasa zagnieżdżona: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 + "]";
}
}
Zapytanie MYSQL, które zawiera złączenia 3 tabel bez limitu
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
Jak korzystać z mapowania wierszy, jeśli mysql zwraca listę obiektów dla klasy zagnieżdżonej:
Metoda Javy
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));
}
Czekanie kończy się tutaj !!!
Klasa twórców map
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;
}
}
Alternatywny sposób:
- Stwórz nowy model, który zawiera zmienną wszystkich klas
- Utwórz aliasy, aby poprawnie odwzorować model
- Wynikiem będzie niezagnieżdżona klasa ze wszystkimi danymi.
Wada wykonania kolejnego modelu
- Ogólne koszty utrzymania
- Tworzenie aliasów i utrzymywanie różnych nazw we wszystkich modelach
Wniosek
Jesteśmy w stanie uzyskać listę obiektów zagnieżdżonych klas z mysql za pomocą niestandardowego mapowania wierszy.