-
Quill 기본 사용scala jdbc/quill 2023. 6. 13. 13:22
https://zio.dev/zio-quill/ 의 기본 사용법
build.sbt
libraryDependencies += "io.getquill" %% "quill-jdbc" % "4.6.1" libraryDependencies += "mysql" % "mysql-connector-java" % "8.0.33"
코드
package com.github.windbird123 import com.mysql.cj.jdbc.MysqlDataSource import com.zaxxer.hikari.{HikariConfig, HikariDataSource} import io.getquill._ case class Person(name: String, age: Int) case class Info(name: String, address: String) object QuillMain { def main(args: Array[String]): Unit = { val mysqlDataSource = new MysqlDataSource() mysqlDataSource.setUrl("jdbc:mysql://localhost:3306/test") mysqlDataSource.setUser("admin") mysqlDataSource.setPassword("mypasswd") mysqlDataSource.setAutoReconnect(true) val hikariConfig = new HikariConfig() hikariConfig.setDataSource(mysqlDataSource) hikariConfig.setMaximumPoolSize(10) // LowerCase: Person case class --> person table // UpperCase: Person case class --> PERSON table // SnakeCase // CamelCase val ctx = new MysqlJdbcContext(LowerCase, new HikariDataSource(hikariConfig)) import ctx._ /////////////////////////////////////////////////////// // map /////////////////////////////////////////////////////// val query1 = quote { query[Person].map(_.name) } val out1: List[String] = ctx.run(query1) println(out1) /////////////////////////////////////////////////////// // filter /////////////////////////////////////////////////////// val query2 = quote { query[Person].filter(_.age >= 10) } val out2: List[Person] = ctx.run(query2) println(out2) /////////////////////////////////////////////////////// // lifting /////////////////////////////////////////////////////// // select name, age from person where person.name = ? def find(name: String): List[Person] = { val query3 = quote { query[Person].filter(_.name == lift(name)) } ctx.run(query3) } println(find("KJM")) /////////////////////////////////////////////////////// // Joins /////////////////////////////////////////////////////// val query4 = quote { query[Person] .join(query[Info]) .on(_.name == _.name) .filter { case (person, info) => person.age >= 10 } } val out4: List[(Person, Info)] = ctx.run(query4) println(out4) /////////////////////////////////////////////////////// // Inserts /////////////////////////////////////////////////////// val query5 = quote { query[Person].insertValue(Person("AAA", 50)) } ctx.run(query5) /////////////////////////////////////////////////////// // Batch Inserts /////////////////////////////////////////////////////// val persons = List(Person("A", 1), Person("B", 2)) val query6 = quote { liftQuery(persons).foreach(p => query[Person].insertValue(p)) } ctx.run(query6) /////////////////////////////////////////////////////// // Updates /////////////////////////////////////////////////////// val query7 = quote { query[Person].filter(_.name == "A").update(_.age -> 33) } ctx.run(query7) /////////////////////////////////////////////////////// // transactions /////////////////////////////////////////////////////// ctx.transaction { ctx.run(query4) ctx.run(query7) throw new Exception() } } }