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)