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