ドキュメント

§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は、要素の型(`T`)が列マッピングでサポートされている場合、それを配列またはリスト(`Array[T]`または`List[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] Long varbinary
Blob1 Blob
InputStream2 Long varbinary
Reader3 Long varchar

その他

**次:**プラグインからモジュールへの移行


このドキュメントに誤りを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。質問やアドバイスがありましたら、コミュニティフォーラムにアクセスして、コミュニティとの会話を始めてください。