Model(モデル)を使ってデータベースアクセスする[Scala編] (5/7)
作成:2013-02-10 10:14
更新:2013-02-10 10:14
更新:2013-02-10 10:14
■データベースアクセス処理について
では、mydata.scalaに記述されている内容について、その役割ごとに整理して説明をしていきましょう。
●データベースアクセスを開始する
DB.withConnection
データベースを扱う場合、まず最初にデータベースに接続を開始する必要があります。これを行なっているのが以下の文です。
implicit c(変数c)には、データベースへの接続を管理するConnectionクラスのインスタンスが設定されます。この{}内で、データベースへのアクセス処理を用意します。
●executeUpdateメソッド
データの追加は、addDataメソッドで行なっています。ここではDB.withConnectionで以下のような文を実行しています。
このexecuteUpdateは、データベースの更新を行うためのクエリーを実行するためのものです。insert文やdelete文などのはすべてこれで実行します。
●レコードの取得
getAllでは、保存されているレコードの取得をします。これを行なっているのが以下の文です。
●モデルクラスへのレコードのマッピング
このMydata.dataというのは、Mydataクラスにあるdataプロパティのことです。以下のような文が記述されていますね。
なんだかよくわからないでしょうが、このような形で記述したプロパティを用意し、これをasすることで、取得されたデータを指定のモデルクラスのインスタンスに変換したものが得られるようになる、と考えると良いでしょう。
●データベースアクセスを開始する
DB.withConnection
データベースを扱う場合、まず最初にデータベースに接続を開始する必要があります。これを行なっているのが以下の文です。
DB.withConnection { implicit c =>
……実行する処理……
}
implicit c(変数c)には、データベースへの接続を管理するConnectionクラスのインスタンスが設定されます。この{}内で、データベースへのアクセス処理を用意します。
●executeUpdateメソッド
データの追加は、addDataメソッドで行なっています。ここではDB.withConnectionで以下のような文を実行しています。
val id: Int = SQL( 実行する文 ).SQLが、クエリーを実行するためのものです。この()内に、実行するSQLのクエリー文を用意します。その後のonでは、クエリー分のテキストに用意されている変数(?)に値を代入する働きをします。ここでの例を見ると、
on( 値の指定 ).executeUpdate()
"…… values ({name}, {mail}, {tel})").こんな具合に書かれていますね? クエリーのテキストにある{name}, {mail}, {tel}という部分に、その後のon内に記述した値をそれぞれはめ込んでいくわけです。例えば'name->this.nameでは、{name}の部分にthis.nameの値を設定する、という意味になります。こうしてテキストに必要な値をはめ込んでクエリー文を完成させ、完成したそれをexecuteUpdateで実行する、という流れになります。
on('name->this.name, 'mail -> this.mail, 'tel -> this.tel
このexecuteUpdateは、データベースの更新を行うためのクエリーを実行するためのものです。insert文やdelete文などのはすべてこれで実行します。
●レコードの取得
getAllでは、保存されているレコードの取得をします。これを行なっているのが以下の文です。
val datas = SQL("Select * from mydatas").as(Mydata.data *)クエリーには"Select * from mydatas"と指定していますね。これでmydatasの全レコードを取得することができます。注意したいのは、その後にある「as」です。これは、取得したデータを、Mydata.dataの形で取り出すことを示すものです。
●モデルクラスへのレコードのマッピング
このMydata.dataというのは、Mydataクラスにあるdataプロパティのことです。以下のような文が記述されていますね。
val data = {なんだかよくわからない感じがしますが、これを整理するとこんなかんじで書かれていることがわかるでしょう。
get[String]("name") ~
get[String]("mail") ~
get[String]("tel") map {
case name ~ mail ~ tel =>
Mydata(name, mail, tel)
}
}
{get○○~get○○~…… map{case ○○~○○…… => モデルクラス(……)}ここでの「~」という記号は、Anorm特有の機能で、値をリスト化する働きをします。例えば、A~B~Cとすると、((A, B), C)というようにまとめられます。こうしてまとめたものを元にMydataオブジェクトを生成するのが、その後のmap部分です。
なんだかよくわからないでしょうが、このような形で記述したプロパティを用意し、これをasすることで、取得されたデータを指定のモデルクラスのインスタンスに変換したものが得られるようになる、と考えると良いでしょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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 } } }
※関連コンテンツ