8
votes

How do you use Anorm outside of play in Scala? In the Anorm document for play, it simply uses something like:

DB.withConnection { implicit c =>
  val result: Boolean = SQL("Select 1").execute()    
} 

The DB object is only for Play. How do you use Anorm alone without using Play?

3
The c that you are supplying is the database connection object, which is a java.sql.Connection. You can supply a real connection and provide it as an implicit.Bob Dalgleish

3 Answers

14
votes

There is no need of DB object (part of Play JDBC not Anorm). Anorm works as along as you provide it connection as implicit:

implicit val con: java.sql.Connection = ??? // whatever you want to resolve connection

SQL"SELECT * FROM Table".as(...)

You can resolve JDBC connection in many way: basic DriverManager.getConnection, JNDI, ...

As for dependency, it's easy to add it in SBT: How to declare dependency on Play's Anorm for a standalone application? .

1
votes

You could also emulate the DB object as follows (i haven't tried this though)

 object DB {
    def withConnection[A](block: Connection => A): A = {
      val connection: Connection = ConnectionPool.borrow()

      try {
        block(connection)
      } finally {
        connection.close()
      }
    }
  }

Taken from https://github.com/TimothyKlim/anorm-without-play/blob/master/src/main/scala/Main.scala

0
votes

Documenting the code that works for me below:

Entry to include in dependencies in build.sbt:

// https://mvnrepository.com/artifact/org.playframework.anorm/anorm
libraryDependencies += "org.playframework.anorm" %% "anorm" % "2.6.7"

Write helper classes:

    @Singleton
    class DBUtils {
    
      val schema = AppConfig.defaultSchema
    
      def withDefaultConnection(sqlQuery: SqlQuery) = {
// could replace with DBCP, not got a chance yet
        val conn = DriverManager.getConnection(AppConfig.dbUrl,AppConfig.dbUser, AppConfig.dbPassword)
        val result = Try(sqlQuery.execute()(conn))
        conn.close()
        result
      }
    }
    object DBUtils extends DBUtils

Next, any query can use the withDefaultConnection method to execute:

  def saveReviews(listOfReviews: List[Review]):Try[Boolean]= {
    val query = SQL(
      s"""insert into aws.reviews
         | (                 reviewerId,
         |                 asin,
         |                 overall,
         |                 summary,
         |                 unixReviewTime,
         |                 reviewTime
         | )
         |values ${listOfReviews.mkString(",")}""".stripMargin)
    //println(query.toString())
    DBUtils.withDefaultConnection(query)
  }