Какво е 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 + "]";
}
}
Как да използвам rowmapper, ако mysql връща един обект за вложен клас:
MYSQL заявка, която съдържа обединения на 3 таблици с ограничение 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
Как да получите достъп до база данни:
Метод на 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);
}
Чакането приключва тук !!!
Mapper 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;
}
}
Алтернативен начин:
- Направете нов модел, който съдържа променлива от всички класове
- Направете псевдоними за правилно картографиране на t модел
- Резултатът ще бъде невложен клас с всички данни.
Недостатък при направата на друг модел
- Режийни разходи за поддръжка
- Създаване на псевдоними и запазване на различни имена във всички модели
Заключение
Ние можем да получим вложен обект на клас от mysql с помощта на персонализиран преобразувател на редове.