yu-tarrrrの日記

完全に個人の趣味でその時々書きたいことを書く

Quarkus×Kotlinで遊んでみる②

はじめに

  • 今回は前回のブログの続きでDBアクセスする簡単なAPIを作成したいと思います
  • ソースコードは前回の続きです

実装開始する

  • まずはgradleにORMの依存を注入する ./gradlew listExtensions依存できるものを確認できるが、今回はagroalを追加すれば良いということがわかっているので、./gradlew addExtension --extensions="artifactId"で実行すれば良い
./gradlew addExtension --extensions="agroal"

> Task :addExtension
✅ Adding extension io.quarkus:quarkus-agroal

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

ちなみに、agroalはORMなので、Hibernateを使ってる場合は追加する必要はないし、Hibernateでも代用できる

余談ですが、./gradlew addExtension --extensions="artifactId"のextensionへの引数は複数指定できる模様です。ただし、jdbcのように複数引っかかるものを指定してしまうと怒られるので、jdbc*で全部入れてあげるか、必要なもののみ指定してあげるのが良さそうです。

  • database driverの依存を追加する

現状、quarkusで利用できるdriverは下記の通り。

H2 - jdbc-h2
PostgreSQL - jdbc-postgresql
MariaDB - jdbc-mariadb
MySQL - jdbc-mysql
Microsoft SQL Server - jdbc-mssql
Derby - jdbc-derby
  • src/main/resources/application.properties に諸々追加する
quarkus.datasource.url=jdbc:mysql://localhost:3306/test
quarkus.datasource.driver=com.mysql.cj.jdbc.MysqlDataSource
quarkus.datasource.username=test
quarkus.datasource.min-size=5
quarkus.datasource.max-size=10
  • あとはDBアクセスするレイヤでDIしてあげるのみ
@Inject
private lateinit var defaultDataSource : AgroalDataSource

ちなみに、agroalは複数のdatabase情報に持つことができ、DIするタイミングでアノテーションで明示することで必要なもののみ注入することができる。

quarkus.datasource.url=jdbc:mysql://localhost/company
quarkus.datasource.driver=com.mysql.cj.jdbc.MysqlDataSource
quarkus.datasource.username=test
quarkus.datasource.min-size=5
quarkus.datasource.max-size=10

quarkus.datasource.url=jdbc:mysql://localhost/users
quarkus.datasource.driver=com.mysql.cj.jdbc.MysqlDataSource
quarkus.datasource.username=test
quarkus.datasource.min-size=5
quarkus.datasource.max-size=10
@Inject
@DataSource("users")
private lateinit var usersDataSource : AgroalDataSource

@Inject
@DataSource("company")
private lateinit var companyDataSource : AgroalDataSource

あとは、AgroalDataSourceはjavax.sql.DataSourceを継承してるので、コネクションを作成して生のsqlを流せば良いかと。

val connection = defaultDataSource.connection
val prepareStatement = connection.prepareStatement("selecet * from users")

とりあえず今回はDBアクセスまでできたので終了とする。

まとめ

  • quarkusとしてはagroalを標準として推しており、その理由としては高いパフォーマンスとスケーラビリティを意識した軽量なコネクションプール実装がされているということかららしい。
  • とはいえ、Hibernateも使えるので、そこは柔軟だなと。