由于对play2.0自带的Anorm比较不满, 所以研究了一下如何集成squeryl到play2, 附件是示例项目, 十分简单, 仅展示了如何使用squeryl建立model到单表的映射以及查询功能.
使用的类库: play2.0, squeryl 0.9.5, h2db
主要代码清单:
Build.scala. 这里主要是引用squeryl的依赖
import sbt._ import Keys._ import PlayProject._ object ApplicationBuild extends Build { val appName = "playWithSqueryl" val appVersion = "1.0-SNAPSHOT" val appDependencies = Seq( "org.squeryl" %% "squeryl" % "0.9.5" ) val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings( // Add your own project settings here ) }
GlobalSettings.scala.
主要是override onStart, 在其中构建squeryl的SessionFactory. 有了这个SessionFactory, 后面才可以在Controller中使用inTranscation{...}
import play.api._ import org.squeryl.adapters.H2Adapter import org.squeryl.{Session, SessionFactory} import play.api.db.DB object Global extends GlobalSettings { override def onStart(app: Application) { implicit val _app = app Logger.info("Initializing squeryl session factory.") SessionFactory.concreteFactory = Some(() => Session.create(DB.getConnection(), new H2Adapter) ) Logger.info("Application has started") } override def onStop(app: Application) { Logger.info("Application has stopped") } }
models.Library.scala
package models import org.squeryl.Schema class Book(val id: Long, val title: String) object Library extends Schema { val books = table[Book]("books") }
controllers.Application.scala
package controllers import play.api._ import play.api.mvc._ import views._ import models._ object Application extends Controller { import org.squeryl.PrimitiveTypeMode._ def TxAction(f: Request[AnyContent] => Result) = { Action {request => inTransaction { Logger.info("Calling action in squery transation manager.") f(request) } } } def index = TxAction { request => val books = Library.books.filter(_ => true) Ok(html.index(books.toList)) } }
views.index.scala.html
@(books: List[Book]) @main("How to use squeryl with play2") { <div> @books.map { book => <p> @book.title </p> } </div> }