8

我将在 Play 2.1 (Scala) 中实现一个只读 Web 应用程序。由于我只会读取和编组读取到 JSON 的数据,因此我想避免使用任何其他 DSL 和映射。

我使用dapper-dot-net在 .NET/C# 中完成了类似的项目,并且对结果非常满意。没有大惊小怪,没有太多的样板。

我目前正在查看:

  • anormanormtyped看起来也很有前途,但可能还为时过早。避免手动将变量映射到案例类构造函数参数似乎很棒。)
  • 前传
  • slick - 因为它应该是 2.1 中执行 SQL 的主要方式,主要是普通 SQL API
4

2 回答 2

3

光滑非常好。请务必查看这本关于它的短书——它非常擅长解释一些基础知识。连同文档一起,它会让您快速前进。另外,请注意 github 中的文档更好——最新的尚未发布。

使用普通 sql 选项得到了很好的支持。但是,对于普通的 sql 查询,您在类型检查方面并不多。否则,使用 Scala 2.10 进行简单查询就像:

sql"select * from coffees where name = $name".as[Coffee]

这甚至可以保护您免受 sql 注入的影响,因为$name实际上并没有在查询中。有关更多信息,请参阅文档

于 2013-01-24T09:31:03.990 回答
0

我在GitHub 上有一个深受 Dapper 启发的项目,名为dbmapper

优于 Slick 的优点是:

  • 没有 DSL——你已经知道一个好的数据 DSL,它叫做 SQL
  • 完全异步
  • 很少的样板代码

这是一个例子:

// Scala class that maps to the book table, with columns to match the class members
case class Book(
  bookId: Int,
  title: String,
  retailPrice: BigDecimal,
  publishDate: LocalDate)

// mapping function from table row to Book class, 
// auto generated at compile time by Scala Macro  
implicit def rowToBook: RowData => Book = (r) => DbCodeGenerator.rowToClass[Book](r)

// query returning future list of books, 
// safe query interpolation, the maxPrice is converted to a query argument  
val maxPrice = 11.99
val allBooksFuture = DbAsync.exec[Book](q"select * from book where retail_price < $maxPrice")        

val oneBook: Future[Book] = DbAsync.execOne[Book](q"select * from book where book_id = 2")

// returns Future[Option[]]     
val maybeOneBook: Future[Option[Book]] = DbAsync.execOneOrNone[Book](q"select * from book where book_id = -123")

如果您从 dotnet 世界了解 dapper,那么 dbmapper 会感到奇怪的熟悉!

于 2014-09-15T13:54:00.363 回答