文件

§Anorm

Anorm 已從 Play 核心移出,成為一個獨立管理的專案,可以擁有自己的生命週期。若要加入對它的依賴關係,請使用

libraryDependencies += "org.playframework.anorm" %% "anorm" % "2.6.7"

完整清單如下:https://mvnrepository.com/artifact/org.playframework.anorm/anorm

Anorm 的 2.4.0 版本需要 Java 8。最後一個與 JDK 1.6 或 1.7 相容的版本是 Anorm 2.3.9。

§變更

新的 Anorm 版本包含各種修正和改進。

根據 BatchSQL #3016SqlQuery 案例類別被重構為具有伴隨物件的特質。
因此,BatchSql 現在是透過傳遞一個在內部驗證的原始陳述來建立的。

import anorm.BatchSql

// Before
BatchSql(SqlQuery("SQL")) // No longer accepted (won't compile)

// Now
BatchSql("SQL")
// Simpler and safer, as SqlQuery is created&validated internally

§剖析

現在可以使用欄位索引從 Row 取得值。

val res: (String, String) = SQL("SELECT * FROM Test").map(row =>
 row[String](1) -> row[String](2) // string columns #1 and #2
)

現在無論標籤是名稱或別名,每個標籤的欄位解析都已統一。

val res: (String, Int) = SQL"SELECT text, count AS i".map(row =>
  row[String]("text") -> row[Int]("i")
)

新的 foldfoldWhile 函式可與結果串流搭配使用。

val countryCount: Either[List[Throwable], Long] =
  SQL"Select count(*) as c from Country".fold(0l) { (c, _) => c + 1 }

val books: Either[List[Throwable], List[String]] =
 SQL("Select name from Books").foldWhile(List[String]()) { (list, row) =>
  foldWhile(List[String]()) { (list, row) =>
    if (list.size == 100) (list -> false) // stop with `list`
    else (list := row[String]("name")) -> true // continue with one more name
  }

新的 withResult 函式可提供自訂串流剖析器。

import anorm.{ Cursor, Row }
@annotation.tailrec
def go(c: Option[Cursor], l: List[String]): List[String] = c match {
  case Some(cursor) => {
    if (l.size == 100) l // custom limit, partial processing
    else {
      val row = it.next()
      go(it, l :+ row[String]("name"))
    }
  }
  case _ => l
}

val books: Either[List[Throwable], List[String]] =
  SQL("Select name from Books").withResult(go(_, List.empty[String]))

§類型對應

有更多參數和欄位轉換可用。

陣列

如果欄位的類型是 JDBC 陣列 (java.sql.Array),則該欄位可以是多值。現在 Anorm 可以將其對應到陣列或清單 (Array[T]List[T]),只要在欄位對應中也支援元素類型 (T) 即可。

import anorm.SQL
import anorm.SqlParser.{ scalar, * }

// array and element parser
import anorm.Column.{ columnToArray, stringToArray }

val res: List[Array[String]] =
  SQL("SELECT str_arr FROM tbl").as(scalar[Array[String]].*)

也為陣列提供了新的方便剖析函式,包括 SqlParser.array[T](...)SqlParser.list[T](...)

如果 JDBC 陳述式預期陣列參數 (java.sql.Array),則只要元素類型 T 是支援的類型,就可以將其值傳遞為 Array[T]

val arr = Array("fr", "en", "ja")
SQL"UPDATE Test SET langs = $arr".execute()

多值參數

有新的轉換可用於傳遞 List[T]Set[T]SortedSet[T]Stream[T]Vector[T] 作為多值參數。

SQL("SELECT * FROM Test WHERE cat IN ({categories})")
 .on('categories -> List(1, 3, 4))

SQL("SELECT * FROM Test WHERE cat IN ({categories})")
 .on('categories -> Set(1, 3, 4))

SQL("SELECT * FROM Test WHERE cat IN ({categories})")
 .on('categories -> SortedSet("a", "b", "c"))

SQL("SELECT * FROM Test WHERE cat IN ({categories})")
 .on('categories -> Stream(1, 3, 4))

SQL("SELECT * FROM Test WHERE cat IN ({categories})")
 .on('categories -> Vector("a", "b", "c"))

數字和布林類型

已改善基本類型(例如數字和布林類型)的欄位轉換。

已移除一些無效的轉換

欄位 (JDBC 類型) (作為) JVM/Scala 類型
Double Boolean
Int Boolean

有新的轉換可延伸欄位支援。

欄位 (JDBC 類型) (作為) JVM/Scala 類型
BigDecimal BigInteger
BigDecimal Int
BigDecimal Long
BigInteger BigDecimal
BigInteger Int
BigInteger Long
Boolean Int
Boolean Long
Boolean Short
Byte BigDecimal
Float BigDecimal
Int BigDecimal
Long Int
Short BigDecimal

二進位和大型資料

已提供新的欄位轉換,可將二進位欄位 (位元組、串流、blob) 剖析為 Array[Byte]InputStream

↓JDBC / JVM➞ Array[Byte] InputStream1
Array[Byte]
Blob2
Clob3
InputStream4
Reader5

二進制和大資料也可以用作參數

JVM JDBC
Array[Byte] 長 varbinary
Blob1 Blob
InputStream2 長 varbinary
Reader3 長 varchar

雜項

下一步:將外掛程式移轉至模組


在此文件中發現錯誤?此頁面的原始程式碼可以在 此處 找到。在閱讀完 文件指南 後,請隨時貢獻拉取請求。有問題或建議要分享嗎?請前往 我們的社群論壇 與社群展開對話。