Was ist Spring Boot:
Spring Boot ist ein Open-Source-Microservice-basiertes Java-Webframework.
RowMapper:
Die RowMapper-Schnittstelle wird von JdbcTemplate verwendet, um Zeilen eines ResultSets pro Zeile zuzuordnen.
Einführung
Hier verwenden wir einen benutzerdefinierten Zeilenzuordner, wenn wir nur ein einzelnes Objekt als Rückgabetyp wünschen
Problem in RowMapper für verschachtelte Klassen:
Wir können Parameter, die von DB zurückgegeben werden, nicht direkt dem Klassenmodell zuweisen, da wir aufgrund der Verschachtelung von Klassen niemals in der Lage sind, einzelne primitive Datentypen variabel zu bestimmen.
In diesem Beispiel verwendetes Klassendiagramm:
Einfache Klasse :Nicht verschachtelte Klassen
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-Klasse:
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-Klasse
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
+ "]";
}
}
Verschachtelte Klasse:
Verschachtelte Klasse: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 + "]";
}
}
Verwendung von Rowmapper, wenn mysql ein einzelnes Objekt für eine verschachtelte Klasse zurückgibt:
MYSQL-Abfrage, die Joins für 3 Tabellen mit Limit 1 enthält
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
Zugriff auf die Datenbank:
Java-Methode
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);
}
Das Warten endet hier!!!
Mapper-Klasse
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;
}
}
Alternativer Weg:
- Erstellen Sie ein neues Modell, das Variablen aller Klassen enthält
- Erstellen Sie Aliase, um das Modell richtig abzubilden
- Ergebnis ist eine nicht verschachtelte Klasse mit allen Daten.
Nachteil der Herstellung eines anderen Modells
- Wartungsaufwand
- Aliase erstellen und unterschiedliche Namen in allen Modellen beibehalten
Fazit
Wir sind in der Lage, verschachtelte Klassenobjekte von MySQL mit Hilfe des benutzerdefinierten Zeilenzuordners zu erhalten.