§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 | いいえ | いいえ |
-
- 型 `java.io.InputStream`。
-
- 型 `java.sql.Blob`。
-
- 型 `java.sql.Clob`。
-
- 型`java.io.Reader`.
バイナリデータとラージデータはパラメータとしても使用できます
JVM | JDBC |
---|---|
Array[Byte] | Long varbinary |
Blob1 | Blob |
InputStream2 | Long varbinary |
Reader3 | Long varchar |
-
- 型 `java.sql.Blob`
-
- 型 `java.io.InputStream`
-
- 型 `java.io.Reader`
その他
- **Joda Time**:`Long`、`Date`、または`Timestamp`列からのJoda `Instant`または`DateTime`の新しい変換。
- テキスト列を`UUID`値として解析します:`SQL("SELECT uuid_as_text").as(scalar[UUID].single)`。
- Null許容パラメータに`None`を渡すことは非推奨となり、代わりにタイプセーフな`Option.empty[T]`を使用する必要があります。
**次:**プラグインからモジュールへの移行
このドキュメントに誤りを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。質問やアドバイスがありましたら、コミュニティフォーラムにアクセスして、コミュニティとの会話を始めてください。