しおしお

IntelliJ IDEAのことなんかを書いてます

Spring BootでScalikeJDBCを使ってみた

Spring BootでScalikeJDBCを使ってデータベースにアクセスしてみたお話です。

build.gradle

データベース関連のライブラリとScalikeJDBCを足してあげます。

  implementation 'org.springframework.boot:spring-boot-starter'
  implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
  implementation 'org.scala-lang:scala-library:2.12.10'
  implementation 'org.scalikejdbc:scalikejdbc_2.12:3.4.0'
  implementation 'mysql:mysql-connector-java:8.0.18'

データベースの接続設定

Spring Bootのコネクションプールを使うので、application.propertiesに接続設定を行います

spring.datasource.url=jdbc:mysql://localhost:3306/siosio
spring.datasource.username=siosio
spring.datasource.password=siosio
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

ScalikeJDBCの設定クラス

コネクションプール(HikariCPのDataSource)をScalikeJDBCのConnectionPoolに登録してあげます。 これは、一度だけやればいいのでConfigurationクラスのPostConstructで行っています。

@Configuration
class ScalikeJdbcConfig(private val dataSource: DataSource) {
  
  @PostConstruct
  def initializeConnectionPool(): Unit = {
    ConnectionPool.singleton(new DataSourceConnectionPool(dataSource))
  }
}

データベースアクセスの実装

CommandLineRunnerでデータベースに1レコード追加するような処理にしています。 Springのアプリケーションの場合、トランザクション制御は@Transactionalで行いますが、ScalikeJDBC側の機能を使ってトランザクション制御を行うので@Transactionalはつけていません。

@SpringBootApplication
class Application {}

object Application {

  def main(args: Array[String]): Unit = {
    SpringApplication.run(classOf[Application], args: _*)
  }
}

@Component
class Cli(private val dbTest: DbTest) extends CommandLineRunner {
  override def run(args: String*): Unit = {
    dbTest.register("test")
  }
}

@Component
class DbTest {
  
  def register(name: String): Unit = {
    DB localTx { implicit session =>
      sql"insert into account(name) values ($name)".update().apply()
    }
  }
}

実行結果

登録したデータが入ってますね!

mysql> select * from account;
+----+------+
| id | name |
+----+------+
|  1 | test |
+----+------+
1 row in set (0.00 sec)