こんにちは、運営者のハックです!
Javaコース上級ミニゲーム開発編Day9の今回はデータベース(DB)を作成し、スコア情報を登録できるように実装したので、その内容を紹介します。
データベースを作成し、スコアを記録しよう
今回はMySQLを用いてデータテーブルを作成し、スコアを記録できるように実装しました。また、ゲーム終了後にスコアが保存されるように実装もしました。
実装するにあたり中級編Day27「MySQLのインストールと動作確認、簡単なSQLの実践」、Day28「DB①(JDBCを使ったシンプルなSelect) 」及びDay29「DB②(JDBCを使ってスコア情報の登録) 」の回を参考にしました。
データテーブル作成
まずはSQLコマンドを入力し、「ore_player_score」というデータテーブルを作成しました。
データテーブル内の列に以下の情報を作成しました。
- id(自動インクリメント)
- プレイヤーの名前
- スコア
- 日時と時間
実際のコード
実装するにあたり以下のコードを作成及び追加しました。
- コマンド入力により、リストを表示する機能を実装
- ゲーム終了後にデータベースにスコアが自動で保存されるように実装
//OreMiningCommandクラス
public class OreMiningCommand extends BaseCommand implements Listener {
…
public static final String LIST = "list";
…
//「ore_player_score」データベースからコマンド入力によりデータを取得する
//個人情報に当たる箇所は「***」に置き換えています
public boolean onExecutePlayerCommand(Player player, Command command, String label, String[] args) {
if(args.length == 1 && (LIST.equals(args[0]))){
try (Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:****/spigot_server?serverTimezone=UTC",
"****", "********");
Statement statement = con.createStatement();
ResultSet resultSet = statement.executeQuery( "select * from ore_player_score;")) {
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("player_name");
int score = resultSet.getInt("score");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime date = LocalDateTime.parse(resultSet.getString("registered_at"), formatter);
player.sendMessage(id + " | " + name + " | " + score + " | " + date.format(formatter));
}
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
//ゲーム終了後にデータベースにスコアが保存されるように実装
//個人情報に当たる箇所は「***」に置き換えています
private void gamePlay(Player player, PlayerScore nowPlayerScore) {
…
try (Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:****/spigot_server?serverTimezone=UTC",
"***", "********");
Statement statement = con.createStatement()) {
statement.executeUpdate(
"insert ore_player_score(player_name, score, registered_at)"
+ "values('" + nowPlayerScore.getPlayerName() + "'," + " " + nowPlayerScore.getScore()+ ", now());");
} catch (SQLException e) {
e.printStackTrace();
}
実装できたのはいいんだけど、なんだかコードがぐちゃぐちゃなのにゃ。
また、メインとなるOreMiningクラスに直接パスワード等を記載するのは安全性の面で避けたいところですね。
今回はJDBCを使用していましたが、次回はMyBatisに置き換えていきます。
実装結果
コマンド入力をすると、データベースからリストを表示することができました。また、ゲーム終了時にスコアが自動的にデータベースに保存されるように実装できました。
まとめ 課題の要件をほぼ満たしてきた
今回はMySQLを用いてデータテーブルを作成し、ゲーム終了後にスコアを記録できるように実装しました。また、コマンド入力により保存されたリストが表示されるように実装もしました。
今回データベースの実装により、課題の要件はほぼ満たしたことになります。
完成まであと少し、引き続き頑張っていきます。
以上で今回の学習記録を終えます。
ここまでご覧いただきありがとうございました。
コメント