play2.0 集成 squeryl

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

扫描二维码关注公众号,回复: 681525 查看本文章

主要是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>
}
 

猜你喜欢

转载自tomorrow009.iteye.com/blog/1546253