由于对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>
}