首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Anorm RowParser

使用Anorm RowParser
EN

Stack Overflow用户
提问于 2014-06-24 10:22:52
回答 2查看 3.8K关注 0票数 2

我已经使用Play Framework2.0大约6个月了,我一直想知道为什么他们使用这么多样板代码来解析我的SQL查询返回,如下所示:

代码语言:javascript
复制
case class Journal_accountDetail(amount: Double, states: Boolean)

val Journal_AccountParser: RowParser[Journal_accountDetail] = {
    get[Double] ("amount") ~
    get[Boolean] ("states") map({
        case amount~states => Journal_accountDetail(amount,states)
    })
}

是什么提高了游戏框架的性能吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-24 10:50:05

解析API一开始看起来有点乏味,但当您开始组合和重用解析器时,它非常强大,而且在每个返回SQL结果的函数中,它的丑陋程度也远远低于模式匹配。

想象一下这样的事情:

代码语言:javascript
复制
case class User(id: Int, name: String, address: Address)
case class Address(id: Int, street: String, city: String, state: State, country: Country)
case class State(id: Int, abbrev: String, name: String)
case class Country(id: Int, code: String, name: String)

要构造User,您需要使用多个JOIN解析结果。与其有一个大型解析器,不如为其配套对象中的每个类构造一个解析器:

代码语言:javascript
复制
object User {
    val parser: RowParser[User] = {
        get[Int]("users.id") ~
        get[String]("users.name") ~ 
        Address.parser map {
            case id~name~address => User(id, name, address)
        }
    }
}

object Address {
    val parser: RowParser[Address] = {
        get[Int]("address.id") ~
        get[String]("address.street) ~
        get[String]("address.city") ~ 
        State.parser ~
        Country.parser map {
            case id~street~city~state~country => Address(id, street, city, state, country)
        }
    }
}

object State {
    val parser: RowParser[State] = {
        get[Int]("states.id") ~
        get[String]("states.abbrev") ~ 
        get[String]("states.name") map {
            case id~abbrev~name => State(id, abbrev, name)
        }
    }
}

object Country {
    val parser: RowParser[Country] = {
        get[Int]("countries.id") ~
        get[String]("countries.code") ~ 
        get[String]("countries.name") map {
            case id~code~name => Country(id, code, name)
        }
    }
}

请注意,为了避免列名冲突,我如何在解析器中使用完整的表空间。

总的来说,这看起来像很多代码,但是对于每个源文件来说,它只是一个很小的占用空间。最大的好处是我们的User解析器非常干净,尽管它的结构很复杂。假设在User中,address实际上是Option[Address]。那么,解释这种更改就像将User解析器中的User更改为(Address.parser ?)一样简单。

对于解析简单的查询,是的,它看起来确实是很多样板。但是,当涉及到像上面这样的例子(以及更复杂的例子)时,我非常感谢解析API。

票数 12
EN

Stack Overflow用户

发布于 2014-06-24 12:54:36

anorm.SqlParser还提供了方便的解析器函数,如.str.int.float.double、.而不是.get[String].get[Int].get[Float].get[Double]。诚挚的问候。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24384169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档