Dog(id,name,age)}deffindById(id:Long)=DB.w" />

play framework anorm orm 化构想

系统 1466 0

play 框架引入了一个简单的数据库访问层:anorm。

使用anorm做模型层,代码大致如下:

Scala代码  

  1. case class Dog(id: Pk[Long], name: String, age: String)  
  2.   
  3. object Dog {  
  4.   val simple = get[Pk[Long]]( "dog.id" ) ~ str( "name" ) ~ int( "age" ) map {  
  5.     case id ~ name ~ age => Dog(id, name, age)  
  6.   }  
  7.   
  8.   def findById(id: Long) = DB.withConnection {  
  9.     implicit connection =>  
  10.       SQL( "select * from dog where id = {id}" ).on('id -> id).as(Dog.simple.singleOpt)  
  11.   }  
  12.   
  13.   def create(dog: Dog) = DB.withConnection {  
  14.     implicit connection =>  
  15.       val idOpt: Option[Long] = SQL(  
  16.          "" "  
  17.           insert into dog (name, age)  
  18.           values ({name}, {age})  
  19.          "" "  
  20.       ).on(  
  21.         'name -> dog.name,  
  22.         'age -> dog.age  
  23.       ).executeInsert()  
  24.       val result = dog.copy(id = Id(idOpt.get))  
  25.       result  
  26.   }  
  27.   
  28.   def update(id: Long, dog: Dog) = DB.withConnection {  
  29.     implicit connection =>  
  30.       SQL(  
  31.          "" "  
  32.         update dog set name = {name}, age = {age} where id = {id}  
  33.          "" "  
  34.       ).on(  
  35.         'id -> id,  
  36.         'name -> dog.name,  
  37.         'age -> dog.age  
  38.       ).executeUpdate()  
  39.   }  
  40.   
  41. }  

 

    明显比JPA繁杂,那么,有没有办法封装下anorm,使它更象orm,提供更好的维护性,更快的开发速度?

    在scala 2.10中,引入的试验性功能:macro, reflection,或许就是问题的答案(现在只是一个构想,会抽空实现验证下),还是代码为先:

Scala代码  

  1. trait Modal[T] {  
  2.   val simple = macro ModalMacroImpl.simple[T]  
  3.   def findById(id: Long): Option[T] = macro ModalMacroImpl.find  
  4.   def create(o: T) = macro ModalMacroImpl.create  
  5.   def update(id: Long, o: T) = macro ModalMacroImpl.update  
  6.   def list = macro ModalMacroImpl.list  
  7. }  
  8.   
  9. object Dog extends Modal[Dog] {  
  10.   def findByName(name: String): Option[T] = macro ModalMacroImpl.find  
  11. }  

 

通过Modal及提供的macro,简化了model的定义。

ModalMacroImpl可以通过reflaction实现,并且macro是编译时增强的,不会对性能造成影响。

原文链接: http://www.software8.co/wzjs/

play framework anorm orm 化构想


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论