§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 #3016,SqlQuery
案例類別被重構為具有伴隨物件的特質。
因此,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")
)
新的 fold
和 foldWhile
函式可與結果串流搭配使用。
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 | 否 | 否 |
-
- 類型
java.io.InputStream
。
- 類型
-
- 類型
java.sql.Blob
。
- 類型
-
- 類型
java.sql.Clob
。
- 類型
-
- 類型
java.io.Reader
。
- 類型
二進制和大資料也可以用作參數
JVM | JDBC |
---|---|
Array[Byte] | 長 varbinary |
Blob1 | Blob |
InputStream2 | 長 varbinary |
Reader3 | 長 varchar |
-
- 類型
java.sql.Blob
- 類型
-
- 類型
java.io.InputStream
- 類型
-
- 類型
java.io.Reader
- 類型
雜項
- Joda Time:針對 Joda
Instant
或DateTime
的新轉換,從Long
、Date
或Timestamp
欄位。 - 將文字欄位解析為
UUID
值:SQL("SELECT uuid_as_text").as(scalar[UUID].single)
。 - 傳遞
None
給可為 Null 的參數已不建議使用,必須改用類型安全的Option.empty[T]
。
下一步:將外掛程式移轉至模組
在此文件中發現錯誤?此頁面的原始程式碼可以在 此處 找到。在閱讀完 文件指南 後,請隨時貢獻拉取請求。有問題或建議要分享嗎?請前往 我們的社群論壇 與社群展開對話。