libro
www.tuyano.com
初心者のためのPlay Framework入門

Model(モデル)を使ってデータベースアクセスする[Scala編] (4/7)

作成:2013-02-10 10:09
更新:2013-02-10 10:09

■モデルを作成する

では、いよいよモデルの作成を行いましょう。モデルは、「app」内に「models」というフォルダを用意し、この中にスクリプトファイルを配置します。今回は、「mydata.scala」という名前でファイルを作成しておきます。

下のリスト欄に、ソースコードを掲載しておきました。今回は、データを保存するための「addData」メソッドと、データの一覧を取得する「getAll」という2つのメソッドを用意しておきました。

ファイルは「models」フォルダに配置していますから、package modelsとしてmodelsパッケージにあることを指定します。また、その下に以下の4つのimport文があります。
import play.api.db._
import anorm._
import play.api.Play.current
import anorm.SqlParser._
play.api.dbパッケージは、データベース関連のクラスを提供するものです。またanormは、文字通りanorm関連のクラスがまとめてあります。この他、コード内で必要となるものとしてplay.api.Play.currentanorm.SqlParserimportしてあります。これらは、まぁ必須のimportと考えていいでしょう。

ここでは、Mydataというcase classが用意されています。これは、よく見るとこんな形になっています。
case class クラス名(……引数……){
    ……メソッドの定義……
}
object クラス名 {
    ……メソッドの定義……
}
case classでは、「addData」メソッドが定義されていますね。そしてobjectには、dataという変数と、「getAll」メソッドが定義されています。これらは何が違うのでしょう? なぜ、どっちか1つにまとめないのでしょうね?

case classでは、コンパニオンメソッド(toStringなどの必須メソッドのこと)を自動生成してくれるなどの処理が追加されました。これはインスタンスを作成し、利用できました。つまり、このcase classにあるのは、作成したインスタンスから利用できるメソッド(インスタンスメソッド)であることはわかるでしょう。

これに対し、objectは、たった1つだけのオブジェクト(インスタンス)を作成するためのものでした。シングルトン作成のためのもの、と先に説明をしましたね。しかし、オブジェクトで「これ1つしか存在できないインスタンス」というって、一体どういうものでしょうか。シングルトンがそうだとはいいましたが、もっと一般的なものでそういうものあったでしょう?

それは、「クラス」です。クラスはオブジェクトであり、しかも1つだけしか存在しません。つまり、このobjectを使ってcase calssと同じ名前のクラスを定義すると、このobject内のメソッドはいわゆる「クラスメソッド」として実装されるのです。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※models/mydata.scalaのソースコード

package models

import play.api.db._
import anorm._
import play.api.Play.current
import anorm.SqlParser._ 

case class Mydata(
    name: String,
    mail: String,
    tel: String) {

    def addData {
        DB.withConnection { implicit c =>
            val id: Int = SQL("insert into mydatas (name, mail, tel) values ({name}, {mail}, {tel})").
                on('name->this.name, 'mail -> this.mail, 'tel -> this.tel).executeUpdate()
        }
    }
}

object Mydata {
    val data = {
        get[String]("name") ~
        get[String]("mail") ~
        get[String]("tel") map {
            case name ~ mail ~ tel => Mydata(name, mail, tel)
        }
    }
    
    def getAll: List[Mydata] = {
        DB.withConnection { implicit c =>
            val datas = SQL("Select * from mydatas").as(Mydata.data *)
            return datas
        }
    }
}
※関連コンテンツ

「初心者のためのPlay Framework入門」に戻る