イベント編の続きです。
今回はデータベースを使ってプレイヤーのログインのログをとってみます。
データベースはMySQLを使用しています。

データベースといえばJPAを使用したかったんですが、試行錯誤してもダメでした。
理由としてはMETA-INF/services/の中にあるファイルを読み込めないのが原因のようでした。
というわけでBukkitで用意されているEbeanを使用していきます。

まずMySQLを使用するために依存関係にcompile ‘mysql:mysql-connector-java:5.1.34’を追加します。
次にplugin.ymlにdatabase: trueを追加。これを行うことでデータベースを使用できるようになります。

Ebeanで使用するためのエンティティを作成します。
JPAと同じでjavax.persistence.Entityアノテーションをクラスにつける感じで。
また、デフォルトコンストラクタとゲッタ/セッタが必要です。

@Entity
@Table(name = "PLAYER_JOIN_LOG")
public class PlayerJoinLog {
    @Id
    @GeneratedValue
    private Long id;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(nullable = false)
    private Date joinDate;

    @Column(nullable = false)
    private String playerName;

    @Column(nullable = false)
    private String playerUUID;

    @Column(nullable = false)
    private String joinIP;

    //コンストラクタとゲッタセッタは省略
}

PluginクラスでgetDatabaseClassesメソッドをオーバーライドしてデータベースで使用するエンティティのClassクラスのリストを返します。

@Override
public List<Class<?>> getDatabaseClasses() {
    return Arrays.asList(PlayerJoinLog.class);
}

onEnableされた時にテーブルの存在を確認し、テーブルを作成します。

private static EbeanServer database;
@Override
public void onEnable() {
    setupDatabase();
}

private void setupDatabase() {
    try {
        getDatabase().beginTransaction();
        getDatabase().find(PlayerJoinLog.class).findRowCount();
    } catch (PersistenceException ex) {
        installDDL();
    } finally {
        getDatabase().commitTransaction();
    }
}

public static EbeanServer getPluginDataBase() {
    return getPlugin().getDatabase();
}
public static Plugin getPlugin() {
    return getPlugin(ServerPlugin.class);
}

ListenerでPlayerがログインした時DBに情報を保存しましょう。

@EventHandler
public void onLogin(PlayerJoinEvent event) {
    Player player = event.getPlayer();
    UUID uuid = player.getUniqueId();
    PlayerJoinLog log = new PlayerJoinLog(player.getPlayerListName(), uuid.toString(),
            player.getAddress().getHostName());

    EbeanServer dataBase = MyPlugin.getPluginDatabase();
    try {
        dataBase.beginTransaction();
        dataBase.save(log);
    } finally {
        dataBase.commitTransaction();
    }
}

後はビルドして動作を確認して終了です。
このプラグインを使うためにはBukkit側で設定が必要になります。

実際動かすjarと同じディレクトリに生成されているbukkit.ymlに以下を記述します。

database:
  username: DBのユーザー名
  isolation: SERIALIZABLE
  driver: com.mysql.jdbc.Driver
  password: DBのパスワード
  url: DBのURL

これで設定は以上です。


おまけ

IntelliJでDBの設定(Ultimateの機能だけど)

追加からMySQLを選択
DatabaseTool1

ホストとポート、データベース名とユーザー名パスワードを入力
TestConnectionで接続確認をとれたらOK
DatabaseTool2

データはこのような形で見れるようになります。
データをダブルクリックで編集できます。
DatabaseTool3

SQL文はデータベースかテーブルを右クリックしてConsoleを選ぶと入力用のタブが開くのでそこで入力して実行。
補完めっちゃきいて良い感じです。
実行結果はこんなかんじで表示。
いいですね。IntelliJ
DatabaseTool4