首页 > 解决方案 > Anorm - 通用插入

问题描述

有没有办法像使用常规 ORM 一样使用 Anorm?我想要一个只插入提供的元素的方法。

  def insert[T](element: T)(implicit connection: Connection) = {
    element.insert(connection)
  }

我绝对可以自己实现它,但感觉就像我在重新实现一个 ORM ......旧的 anorm 版本有这个Magic[T]但我现在看不到它

标签: scalaanorm

解决方案


文档明确指出 Anorm 不是 ORM(永远不会是)。

如前所述,要插入或更新,必须提供类型类T的实例。ToStatement

提供了一些来自动实现此类实例。

import anorm.{ Macro, SQL, ToParameterList }
import anorm.NamedParameter

case class Bar(v: Int)

val bar1 = Bar(1)

// Convert all supported properties as parameters
val toParams1: ToParameterList[Bar] = Macro.toParameters[Bar]

val params1: List[NamedParameter] = toParams1(bar1)
// --> List(NamedParameter(v,ParameterValue(1)))

val names1: List[String] = params1.map(_.name)
// --> List(v)

val placeholders = names1.map { n => s"{$n}" } mkString ", "
// --> "{v}"

val generatedStmt = s"""INSERT INTO bar(${names1 mkString ", "}) VALUES ($placeholders)"""
val generatedSql1 = SQL(generatedStmt).on(params1: _*)

推荐阅读