As a quick example, if you need to see some code for a Play Framework Anorm method that inserts an object into a relational database table and returns the auto-into (MySQL auto_increment) ID field on success, here you go:
/**
* This method returns the value of the auto_increment field from the MySQL `stocks` table
* when the stock is inserted into the table.
*/
def insert(stock: Stock): Option[Long] = {
val id: Option[Long] = DB.withConnection { implicit c =>
SQL("insert into stocks (symbol, company) values ({symbol}, {companyName})")
.on("symbol" -> stock.symbol.toUpperCase,
"companyName" -> stock.companyName)
.executeInsert()
}
id
}
I just got this code working with Scala 2.10.x, Play 2.2.x, and MySQL 5.something, so I know it works with those versions.
Necessary import statements
I don’t remember which Scala import statements are necessary for this code to work, but in my Stock model object I have these import statements:
import anorm._ import anorm.SqlParser._ import play.api.db._ import play.api.Play.current
The complete Play Framework model class
Okay, what the heck, here’s the complete Stock model class and object from my Play Framework project:
package models
case class Stock (val id: Long,
var symbol: String,
var companyName: String)
object Stock {
import anorm._
import anorm.SqlParser._
import play.api.db._
import play.api.Play.current
// a parser that will transform a JDBC ResultSet row to a Stock value
// uses the Parser API
// http://www.playframework.org/documentation/2.0/ScalaAnorm
// these names need to match the field names in the 'stocks' database table
val stock = {
get[Long]("id") ~
get[String]("symbol") ~
get[String]("company") map {
case id~symbol~company => Stock(id, symbol, company)
}
}
def selectAll(): List[Stock] = DB.withConnection { implicit c =>
SQL("select * from stocks order by symbol asc").as(stock *)
}
/**
* This method returns the value of the auto_increment field when the stock is inserted
* into the database table.
*/
def insert(stock: Stock): Option[Long] = {
val id: Option[Long] = DB.withConnection { implicit c =>
SQL("insert into stocks (symbol, company) values ({symbol}, {companyName})")
.on("symbol" -> stock.symbol.toUpperCase,
"companyName" -> stock.companyName)
.executeInsert()
}
id
}
def delete(id: Long): Int = {
DB.withConnection { implicit c =>
val nRowsDeleted = SQL("DELETE FROM stocks WHERE id = {id}")
.on('id -> id)
.executeUpdate()
nRowsDeleted
}
}
def delete(symbol: String): Int = {
DB.withConnection { implicit c =>
val nRowsDeleted = SQL("DELETE FROM stocks WHERE symbol = {symbol}")
.on('symbol -> symbol)
.executeUpdate()
nRowsDeleted
}
}
/**
* JSON Serializer Code
* --------------------
*/
import play.api.libs.json.Json
import play.api.libs.json._
implicit object StockFormat extends Format[Stock] {
// convert from Stock object to JSON (serializing to JSON)
def writes(stock: Stock): JsValue = {
val stockSeq = Seq(
"id" -> JsNumber(stock.id),
"symbol" -> JsString(stock.symbol),
"companyName" -> JsString(stock.companyName))
JsObject(stockSeq)
}
// convert from a JSON string to a Stock object (de-serializing from JSON)
def reads(json: JsValue): JsResult[Stock] = {
val id = (json \ "id").as[Long]
val symbol = (json \ "symbol").as[String]
val companyName = (json \ "companyName").as[String]
JsSuccess(Stock(id, symbol, companyName))
}
}
}
Summary
The primary purpose for this article was to share that insert method, so I won’t guarantee that the other methods work, but I’m pretty sure they do, especially the selectAll method, and the JSON serializing/de-serializing code.
If you needed to see a Play Framework Anorm “insert” method, I hope this has been helpful.

