play 框架引入了一个简单的数据库访问层:anorm。
使用anorm做模型层,代码大致如下:
case class Dog(id: Pk[Long], name: String, age: String) object Dog { val simple = get[Pk[Long]]("dog.id") ~ str("name") ~ int("age") map { case id ~ name ~ age => Dog(id, name, age) } def findById(id: Long) = DB.withConnection { implicit connection => SQL("select * from dog where id = {id}").on('id -> id).as(Dog.simple.singleOpt) } def create(dog: Dog) = DB.withConnection { implicit connection => val idOpt: Option[Long] = SQL( """ insert into dog (name, age) values ({name}, {age}) """ ).on( 'name -> dog.name, 'age -> dog.age ).executeInsert() val result = dog.copy(id = Id(idOpt.get)) result } def update(id: Long, dog: Dog) = DB.withConnection { implicit connection => SQL( """ update dog set name = {name}, age = {age} where id = {id} """ ).on( 'id -> id, 'name -> dog.name, 'age -> dog.age ).executeUpdate() } }
明显比JPA繁杂,那么,有没有办法封装下anorm,使它更象orm,提供更好的维护性,更快的开发速度?
在scala 2.10中,引入的试验性功能:macro, reflection,或许就是问题的答案(现在只是一个构想,会抽空实现验证下),还是代码为先:
trait Modal[T] { val simple = macro ModalMacroImpl.simple[T] def findById(id: Long): Option[T] = macro ModalMacroImpl.find def create(o: T) = macro ModalMacroImpl.create def update(id: Long, o: T) = macro ModalMacroImpl.update def list = macro ModalMacroImpl.list } object Dog extends Modal[Dog] { def findByName(name: String): Option[T] = macro ModalMacroImpl.find }
通过Modal及提供的macro,简化了model的定义。
ModalMacroImpl可以通过reflaction实现,并且macro是编译时增强的,不会对性能造成影响。
相关推荐
Play Framework是一种高效的Java和Scala Web应用程序框架,该框架集成了用于现代Web应用程序开发的组件和API。Play由Web开发人员开发,用于Web应用程序开发。 您会发现Play的Model-View-Controller(MVC)架构熟悉且...
anorm:Anorm数据库库
play-scala-anorm-example:使用Anorm的示例Play数据库应用程序
更新播放 2.4.0添加测试规范Playframework 2.2.1 (Scala) 和 MongoDb (Salat) 的第一步使用 MongoDb 而不是 Anorm 的待办事项应用程序我们将为 MongoDb 使用 Salat 库( )。 Play 2 有一个替代的“mongo-jackson-...
官方版本,亲测可用
官方版本,亲测可用
社会图API 这是根据Apache 2许可(以下引用)获得许可的开源Social Graph API。 持续交付: 关于该项目 社交图谱API(SGA)是在之上构建的 。 您可以看到在Heroku上部署的。 验证 SGA将与JWTAuthenticator(Json ...
ScalikeJDBC、Slick StaticQuery 和 Anorm。 博客文章 为什么 ScalikeJDBC 在使用普通 SQL 时高效? 怎么跑 只是sbt run将运行。 $ sbt run ----- ScalikeJDBC ----- statement: select p.id as i_on_p, p....
atWaredaShboArd 自述文件 此应用程序是 Heroku 上的 Play 应用程序演示。 数据库操作由连接到 PostgreSQL 的 Anorm 处理,而不是 MySQL 的东西。
TranzactIO是某些Scala数据库访问库(目前是Doobie和Anorm)的ZIO包装器。 如果该库随附一个IO monad(例如Doobie的ConnectionIO ),则会将其提升为ZIO[Connection, E, A] 。 如果该库没有以IO monad开头(例如...
C----------------------------------------------------------------------- program runocc C----------------------------------------------------------------------- c C OCCAM 2.0: Steven Constable IGPP/...
很棒的Scala 由社区驱动的有用的Scala库,框架和软件列表。 这不是所有库的目录,只是您探索的起点。...Anorm数据库库Casbah现在正式终止寿命(EOL)。 具有响应流支持的Clickhouse Scala客户端 适用于JVM客户端的