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是编译时增强的,不会对性能造成影响。
相关推荐
1. **模块化设计**:Play Framework采用了模块化的设计,使得开发者可以方便地添加或替换特定功能,如模板引擎、持久化层等。 2. **异步编程**:Play Framework基于Akka框架,支持非阻塞I/O和异步处理,提高了Web...
4. **模块化结构**:Play Framework支持模块化,允许开发者选择或创建自己的模块来扩展框架功能。 5. **强大的路由系统**:通过简洁的路由定义,可以将URL映射到控制器方法,方便处理HTTP请求。 6. **模板引擎**:...
Play Framework以其简洁的API、模块化的设计和强大的工具集,使得开发Web应用变得更加高效和愉快。继续深入学习,你会发现更多关于路由、模板引擎、异步处理、安全控制以及与其他服务集成的强大功能。
Play Framework 是一个基于Java和Scala的开源Web应用框架,它遵循模型-视图-控制器(MVC)架构模式。在“Playframework框架学习之路 1”中,我们可能要探讨这个框架的基础概念、安装过程以及如何创建一个简单的应用...
除了 Play 自带的 Anorm 或 Slick 数据库支持外,Play-Utils 可能包含了对 ORM(对象关系映射)的扩展,例如简化 CRUD 操作,提供事务管理,以及优化查询性能的工具。 3. **验证和表单处理**: 在 Web 开发中,...
模型通常使用Ebean或Anorm等持久化库来与数据库交互。 2. **视图(View)**:视图通常是HTML模板文件,可以使用Scala或Java语法进行编写。在`todolist`中,我们可能会找到一个`message.scala.html`文件,它定义了...
4. **模板引擎**:Play提供了Ebean和Anorm等多种ORM工具,以及Twirl模板引擎,用于生成HTML、XML或其他格式的响应。Twirl模板与Scala语言紧密集成,提供了一种类型安全的方式来编写视图。 5. **测试支持**:Play ...
通常会使用Anorm或Slick等库来实现ORM(对象关系映射),简化数据库操作。 6. **表单验证**:Play Framework 提供了表单处理和验证功能,可以方便地处理用户提交的数据,并进行前端验证和后端验证。 7. **异步编程...
安装完成后,创建一个新的Play项目,可以通过命令行运行 `play new project-name`,这将初始化一个新的项目结构。 在项目中,你需要配置数据库连接。在 `conf/application.conf` 文件中,添加如下MySQL数据库的配置...
7. **模块化设计**:Play 社区提供了丰富的插件和模块,开发者可以根据需求选择或自定义,如Anorm(一个轻量级的SQL库)和/play2-auth(认证和授权模块)。 8. **JSON支持**:在许多现代Web应用中,JSON是最常见的...
3. **模板引擎**:Play支持Ebean、Anorm等多种ORM框架,同时内置了模板引擎用于生成HTML响应。`play.templates.Template`和`play.twirl.api.Html`等类揭示了模板编译和执行的过程。 4. **Akka集成**:Play ...
4. **模板引擎**:Play支持Ebean、Anorm等多种ORM工具,用于数据库操作。同时,它内置了Twirl模板引擎,用于生成HTML或其他类型的响应,提供了丰富的语法糖和模板继承功能。 5. **热加载**:在开发过程中,Play ...
Play Framework 是一个基于Java和Scala的高性能Web应用框架,它以简洁、模块化和类型安全的设计理念著称。在这个“playframework做的demo”项目中,我们可以深入探讨Play Framework的一些核心特性,以及如何利用它来...
1. **模块化结构:** Play Framework 的设计原则之一是模块化,这使得开发者可以轻松地添加或移除功能,根据项目需求定制框架。它包含了诸如模板引擎、JSON处理、数据库集成等模块。 2. **异步编程模型:** 与传统...
Play框架支持JDBC和Anorm等库来操作数据库,本例中可能会使用Anorm,这是一个轻量级的SQL模odel库,允许我们直接用Scala代码编写SQL查询。 接着,我们将定义数据模型。例如,可以创建一个`Message`模型类,包含`id`...
3. **模板引擎**:Play支持Ebean和Anorm等数据库操作库,用于数据持久化。同时,它也提供了模板引擎(如Twirl)来创建动态HTML页面。在`app/views`目录下,可以看到`.scala.html`文件,这些都是模板文件,可以结合...
Play拥有众多社区开发的插件,如Anorm(一个轻量级SQL库),或是用于处理JSON和XML的插件,这些插件扩展了Play的功能,使开发者能够更灵活地构建应用程序。 9. **国际化与本地化**: Play支持多语言应用,可以...
- **数据库支持**:Play框架可以与多种数据库配合,例如通过Ebean或Anorm实现ORM操作,相关的jar包会提供数据库连接和查询支持。 - **测试工具**:Play提供了测试工具和插件,如模拟HTTP请求的FakeRequest,以及...
8. **国际化与本地化**:介绍如何在Play应用中实现多语言支持,以及时间、货币等的本地化处理。 9. **性能优化与部署**:讨论如何优化Play应用的性能,包括缓存策略、压缩响应、负载均衡等,以及如何将应用部署到...