play 框架引入了一個(gè)簡單的數(shù)據(jù)庫訪問層:anorm。
使用anorm做模型層,代碼大致如下:
Scala代碼 ?
- 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,提供更好的維護(hù)性,更快的開發(fā)速度?
? ? 在scala 2.10中,引入的試驗(yàn)性功能:macro, reflection,或許就是問題的答案(現(xiàn)在只是一個(gè)構(gòu)想,會(huì)抽空實(shí)現(xiàn)驗(yàn)證下),還是代碼為先:
Scala代碼 ?
- 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實(shí)現(xiàn),并且macro是編譯時(shí)增強(qiáng)的,不會(huì)對(duì)性能造成影響。
原文鏈接: http://www.software8.co/wzjs/
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
