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