スプリングブートとは:
Spring Bootは、オープンソースのマイクロサービスベースのJavaWebフレームワークです。
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 + "]";
}
}
制限なしで3つのテーブルの結合を含むMYSQLクエリ
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));
}
待機はここで終了します!!!
マッパークラス
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;
}
}
別の方法:
- すべてのクラスの変数を含む新しいモデルを作成します
- エイリアスを作成してモデルを適切にマッピングする
- 結果は、すべてのデータを含むネストされていないクラスになります。
別のモデルを作成することの欠点
- 保守性のオーバーヘッド
- エイリアスを作成し、すべてのモデルで異なる名前を維持する
結論
カスタム行マッパーを使用して、mysqlからネストされたクラスオブジェクトリストを取得できます。