ハック
こんにちは、運営者のハックです!
Javaコース上級ミニゲーム開発編Day10の今回は前回JDBCを使用して記載したコードを、MyBatisに変更したので、その内容を紹介します。
MyBatisに変更しよう
今回は前回JDBCを使用して記載したコードをMyBatisに変更しました。作成するにあたり中級編Day31「ゲームを作りながら学ぶ Java実践 DB③(JDBCを使ってたところをMyBatisに変更)」及びDay32「 ゲームを作りながら学ぶ Java実践 DB④(InsertをMyBatisに変更)」を参考にしました。
実際のコード
実装するにあたり以下のコードを作成及び追加しました。
- JDBCを使ってたところをMyBatisに変更
- InsertをMyBatisに変更
- PlayerScoreクラスとPlayerScoreMappeインターフェースを作成(既存のPlayerScoreクラスはExecutingPlayerクラスに名前を変更)
- mybatis-config.xmlを別途作成
//OreMiningCommandクラス
public class OreMiningCommand extends BaseCommand implements Listener {
…
private SqlSessionFactory sqlSessionFactory;
…
public OreMiningCommand(Main main) {
this.main = main;
try {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public boolean onExecutePlayerCommand(Player player, Command command, String label, String[] args) {
if(args.length == 1 && (LIST.equals(args[0]))){
try(SqlSession session = sqlSessionFactory.openSession()){
PlayerScoreMapper mapper = session.getMapper(PlayerScoreMapper.class);
List<PlayerScore> playerScoresList = mapper.selectList();
for(PlayerScore playerScore:playerScoresList){
player.sendMessage(playerScore.getId() + " | "
+ playerScore.getPlayerName()+ " | "
+ playerScore.getScore() + " | "
+ playerScore.getRegisteredAt().
format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
}
return false;
}
private void gamePlay(Player player, ExecutingPlayer nowExecutingPlayer) {
…
try(SqlSession session = sqlSessionFactory.openSession(true)){
PlayerScoreMapper mapper = session.getMapper(PlayerScoreMapper.class);
mapper.insert(
new PlayerScore(nowExecutingPlayer.getPlayerName(),
nowExecutingPlayer.getScore()));
}
//PlayerScoreクラス
@Getter
@Setter
@NoArgsConstructor
public class PlayerScore {
private int id;
private String playerName;
private int score;
private LocalDateTime registeredAt;
public PlayerScore(String playerName, int score){
this.playerName = playerName;
this.score = score;
}
}
//PlayerScoreMapperクラス
public interface PlayerScoreMapper {
@Select("select * from ore_player_score")
List<PlayerScore> selectList();
@Insert("insert into ore_player_score (player_name, score, registered_at) values (#{playerName}, #{score}, now());")
int insert(PlayerScore playerScore);
}
//mybatis-config.xmlを別途作成
//個人情報に該当する箇所は***に置換
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name = "mapUnderscoreToCamelCase" value="true"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:***/spigot_server?serverTimezone=UTC"/>
<property name="username" value="***"/>
<property name="password" value="********"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="plugin.oremining.mapper.PlayerScoreMapper"/>
</mappers>
</configuration>
ねこ奈
クラスを分けたおかげで前回のコードよりも見やすくなった気がするのにゃ。
モナ
ここまで来たら完成まであと少しですね!
実装結果
MyBatisに変更した後も、ゲーム終了後にスコアがデータベースに保存され、コマンドを実行するとスコアのリストが表示されることを確認しました。
まとめ 中級編の時は大苦戦した箇所も、今はスムーズに
今回はJDBCを使用して記載したコードをMyBatisに変更しました。
ハック
実は、この回は中級編を学習していた際はエラーが解決できず、苦戦した回でした。
今はエラーの原因が分かっているので、エラーを発生させずスムーズにコードを作成できています。あの時に四苦八苦した経験はちゃんと生きているのだなと実感します。
以上で今回の学習記録を終えます。
ここまでご覧いただきありがとうございました。
コメント