ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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()
        }
      }
    }

    댓글

Designed by Tistory.