SELECT/DELETE/UPDATE/INSERTを実行
続いてLiftのマッパークラスを利用して、SELECT/DELETE/UPDATE/INSERTを実行してみます。まず、HTMLを編集しておきましょう。
¥todo¥src¥main¥webapp¥index.htmlの4行目に、次を追記します。
<lift:TestSelectInsert.doSelect /> <lift:TestSelectInsert.doInsert />
これは、「TestSelectInsertクラスのdoSelect関数とdoInsert関数を呼び出す」という意味を持つLift固有の表記法です。
このクラスと関数を作成してみましょう。¥todo¥src¥main¥scala¥com¥liftworkshop¥snippetフォルダにTestSelectInsert.scalaファイルを新規作成し、LIST37のコードを記述します。最後にLIST36と同様にWebサーバを起動します。なお、前提として、test1テーブルに5行以上のデータを入れておくことが必要です。
package com.liftworkshop.snippet
import com.liftworkshop.model._
class TestSelectInsert {
/** SELECT DELETE UPDATE のテスト関数*/
def doSelect = {
//全ての行をSELECTする
val rows = Test1Table.findAll
<div>
{
var count = 0
rows.flatMap{ row =>
count += 1
if(count == 1){
//UPDATEする
row.name("!" + row.name).price(row.price + 1000).save()
<p>{row.id + " : " + row.name + " is " + row.price + "円"}</p>
}else if(count == 3){
//DELETEする
if(Test1Table.delete_!(row)){
println("Delete OK")
}else{
println("Delete Error")
}
scala.xml.NodeSeq.Empty
}else{
<p>{row.id + " : " + row.name + " is " + row.price + "円"}</p>
}
}
}
</div>
}
/** INSERTのテスト関数 */
def doInsert = {
import java.util.Date
//空の行を用意する
val newRow = Test1Table.create
//テスト用に現在時刻を付加している
//INSERTする
newRow.name("japaneseWine | " + new Date().toString + " | ").price(3000).save()
<span>test</span>
}
}
ソースコード中に、findAllやflatMapなどJavaではなじみの少ない表記が登場してきましたね。Scalaでは、関数型言語の特徴を活かし、データ全体を扱うためのコードを簡単に記述できます(いわゆる高階操作というテクニックです。高階操作の詳細は、次回解説したいと思います)。画面3はWebブラウザで、http://localhost:8080/にアクセスした直後の画面です。
さらに、Webブラウザの[更新]ボタンを押すと、画面4のようにデータが更新されていることが分かります。
LIST37を見ると、doSelect関数では、全データをSELECTして表示しています。その際に、1件目のデータをUPDATEし、3件目のデータをDELETEしています。doInsert関数では、新しい行をINSERTしています。このように、すべての操作を1、2行で終わらせることが特徴です。詳しくはnet.lift.mapperパッケージ内を参照ください。
まとめ
今回の連載では、一部の機能しか説明できませんでしたが、読者の方にScalaを知ってもらい、実際に動作させて試してもらうところまでは解説できたと思います。
これまで実務的なプログラミング言語の世界では、動的言語の手軽さをとるか、静的言語の厳密さをとるかという二者択一の選択肢となりがちでした。Scalaは、「型を推論する(型推論)」・「データ集合を集合全体として操作する(高階操作)」といった、関数型言語の成果を上手に取り込み、両者を同時に実現することができています。また、言語として新しい機能を多く実装しながらも、Javaなど既存言語のプログラマにとって違和感の少ない表記法が採用されていることも特徴です。Scalaを選択することによって得られる生産性/スケーラビリティの向上などは、新しい言語を覚えるコストを払うに値するものだと考えています。
ぜひScalaに触れることで、その良さを感じてください。なお、本稿で説明しきれなかったScalaの個性的なプログラミング手法(高階操作、パターンマッチなど)については、近日中に簡単な解説記事を公開する予定です。こちらもぜひ、楽しみにお待ちください。


