scala jdbc/magnum

Magnum 기본 사용

wefree 2024. 11. 7. 22:20

https://github.com/AugustNagro/magnum 을 사용해 본다.

 

 

build.sbt

libraryDependencies += "com.augustnagro" %% "magnum" % "1.3.0"
libraryDependencies += "com.zaxxer" % "HikariCP" % "5.0.1"
libraryDependencies += "mysql" % "mysql-connector-java" % "8.0.33"

 

 

코드

import com.augustnagro.magnum.*
import com.mysql.cj.jdbc.MysqlDataSource
import com.zaxxer.hikari.pool.HikariPool
import com.zaxxer.hikari.{HikariConfig, HikariDataSource}

import javax.sql.DataSource
import scala.concurrent.duration.MINUTES

object MagnumTest {
  @Table(MySqlDbType, SqlNameMapper.CamelToSnakeCase)
  case class Person(name: String, age: Int)

  def main(args: Array[String]): Unit = {
    val mysqlDataSource: MysqlDataSource = new MysqlDataSource()
    mysqlDataSource.setUrl(
      "jdbc:mysql://localhost:3306/test"
    )
    mysqlDataSource.setUser("admin")
    mysqlDataSource.setPassword("admin123")
    mysqlDataSource.setAutoReconnect(true)

    val hikariConfig: HikariConfig = new HikariConfig()
    hikariConfig.setDataSource(mysqlDataSource)
    hikariConfig.setMaximumPoolSize(40)
    hikariConfig.setConnectionTimeout(MINUTES.toMillis(1))
    hikariConfig.setMaxLifetime(MINUTES.toMillis(60))

//    val pool: HikariPool = new HikariPool(hikariConfig)
    val dataSource: DataSource = new HikariDataSource(hikariConfig)
    val xa: Transactor = Transactor(dataSource)

//    val xa: Transactor = Transactor(
//      dataSource,
//      sqlLogger = SqlLogger.logSlowQueries(500.milliseconds),
//      connectionConfig = con =>
//        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ)
//    )

    val people: Seq[Person] = connect(xa) {
      sql"select * from person".query[Person].run()
    }

    // transaction 처리시
    val people2: Seq[Person] = transact(xa) {
      sql"select * from person".query[Person].run()
    }

    val people3: Seq[Person] = connect(xa) {
      val nameOpt = Some("A")
      sql"select * from person where name=$nameOpt".query[Person].run()
    }

    // dynamic query
    val people4: Seq[Person] = connect(xa) {
//      val nameOpt: Option[String] = Some("A")
      val nameOpt: Option[String] = None

      val cond: Frag = Spec[Person]
        .where(nameOpt.map(n => sql"name=$n").getOrElse(sql""))
        .build

      val frag: Frag = Frag(
        s"select * from person ${cond.sqlString}",
        cond.params,
        cond.writer
      )

      frag.query[Person].run()
    }

    people4.foreach { p =>
      println(s"${p.name} ${p.age}")
    }
  }
}