Exposed
Kotlin
でsql
をやるライブラリだそうです
動機
こちらの記事を拝見し、ぼくもExposed
を使ってみようと思った
ライブラリを追加する
Gradle
repositories {
mavenCentral()
}
dependencies {
implementation 'org.jetbrains.exposed:exposed-core:0.35.1'
implementation 'org.jetbrains.exposed:exposed-dao:0.35.1'
implementation 'org.jetbrains.exposed:exposed-jdbc:0.35.1'
// カラムの型に日付、時間を使いたい場合これがいる
implementation 'org.jetbrains.exposed:exposed-java-time:0.35.1'
// ドライバー(今回はmysqlを使う)
implementation 'mysql:mysql-connector-java:8.0.26'
}
使ってみる
テーブルを定義
今回はプレイヤーのmcid,uuid,最終ログイン日時を記録するプラグインを作ってみます
object User : Table() {
val mcid = varchar("mcid", 16)
val uuid = uuid("uuid").primaryKey()
val login = datetime("login")
}
データベースの作成
ターミナルからMysql
に接続してデータベースを作成します。
mysql> create database exposed_sample;
テーブルの作成
プラグインが起動したとき、Mysql
に接続してUser
テーブルを作成します。
override fun onEnable() {
Database.connect("jdbc:mysql://localhost/exposed_sample", driver = "com.mysql.jdbc.Driver", user = "user", password = "password")
transaction {
// データを作成
SchemaUtils.create(User)
}
}
起動すると、テーブルが自動で作成されてるのが分かります。
mysql> use exposed_sample;
mysql> show tables;
+--------------------------+
| Tables_in_exposed_sample |
+--------------------------+
| user |
+--------------------------+
1 row in set (0.00 sec)
もう一度起動したらどうなる?
どうやら実行されるSQL文には、自動的にIF NOT EXISTS
が付くので気にしなくてもいいようです。テーブルを削除する時も同様です。
プレイヤーデータの追加
プレイヤーがサーバーに参加した時、プレイヤーの情報をデータベースに書き込みます。
@EventHandler
fun onJoin(event: PlayerJoinEvent) {
val player = event.player
transaction {
User.insert {
it[mcid] = player.name
it[uuid] = player.uniqueId
it[login] = LocalDateTime.now()
}
}
}
データの取得
プレイヤーがサーバーに入って来た時、前回のログイン日時をチャットで送信する仕組みを作ってみます。
先ほどのonJoin
を書き換えて...
@EventHandler
fun onJoin(event: PlayerJoinEvent) {
val player = event.player
transaction {
val user = User.select { User.uuid eq player.uniqueId }
// ユーザーデータがあればアップデート&前回のログインを通知
if (user.count() > 0L) {
player.sendMessage("ようこそ!前回のログインは${user.single()[User.login].format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"))}です!")
User.update({ User.uuid eq player.uniqueId }) { it[login] = LocalDateTime.now() }
return@transaction
}
// なければ追加&初めまして
User.insert {
it[mcid] = player.name
it[uuid] = player.uniqueId
it[login] = LocalDateTime.now()
}
player.sendMessage("初めまして${player.name}さん!")
}
}
実際の動きはこんな感じ
初めてサーバーに参加したとき
二回目以降
最後に
Javaはどうすればいいんですか
えっとJava
の場合は、Kotlin
を使ってみるといいです。
感想
Exposed
の使い方が分かりました(小並感)
ユーザーデータがあるかどうかを確かめるとき、返ってくるQuery
のカウントが0かどうか見てるんですがisEmpty
みたいなのないんですかね。まだまだ調査が必要です。
ぼくsql
はまだ完全に理解すらしていないので、間違ってることがあれば遠慮なくコメントなりSNSなりで指摘してください。
あとTwitterフォローお願いします。
https://twitter.com/Gorayan_kun
参考