Scala Web framework !! DB select

Posted 2011年8月25日 by

HelloWorldDb2 クラスに引数を渡して、引数の値をSELECT文の条件にします。

引数の渡し方には2通りあります。
最初の方式は、HTMLファイルのDIVタグのクラス属性に整数値の2500を記述します。

class=”seedo:ews.HelloWorldDb2:tb:2500″

これを、where(“SAL > ?”,sal)としてwhere関数の可変長引数として渡します。
セキュリティ上、SQLインジェクションされないように上記のように記述します。

このようにHTMLファイルの中の固定値で引数が書けます。

JDBCアクセスなので、try と catch で例外処理を捉えます。
finally でsql.close 関数を呼び出すことで、SQLコネクションをコネクションプールに返します。
close関数がないと、コネクションプールを消費し続け、最後にMAX値まで達するとSQLエラーの例外が発生します。

scalaだと、明示的にclose関数を記述しないでも内部でclose関数を呼ぶコードも書けます。
トライしてみてください。

package ews
import java.util.{HashMap,Date}
import scala.collection.JavaConversions._
import scala.collection.immutable._
import scala.xml._
import seedo.database._

class HelloWorldDb2 {
  var tag:String = null // Replaced original tag
  def setTag(tg:String): Unit = {tag = tg}
  var parameterMap:HashMap[String,Array[String]] = null // Parameter from request of servlet
  def setParameterMap(pm:HashMap[String,Array[String]]) : Unit =  {parameterMap = pm}

  def recx(record:Array[Any]) :Node =  {
            var nodes  = Queue.empty[Node]
            record.foreach{(fx) => nodes += <TD>{fx}</TD>}
            return <TR>{nodes}</TR>
        }
  // Function one argument
  def tb(sal:Int) : String = {
    val deptno = 30
    var sql:Db = null
    try {
		sql = new Db
		sql.select("EMPNO,ENAME,SAL,DEPTNO,JOB,MGR")
			.from("EMP")
			.where("SAL > ?",sal)
			.or("DEPTNO = ?",deptno)
			.orderBy("EMPNO")
		val re = sql.executeQuery
		var nodes  = Queue.empty[Node]
		re.foreach{(rec) => nodes += recx(rec)}
		val xml = <table border="1">{nodes}</table>
	    return "HelloWorldDb2 " + new Date + xml.toString
	} catch {
      case e:Exception =>{
        throw e
      }
    } finally {
    	if(sql != null)sql.close
    }
  }
}

HTLMファイルの中身です。

<!doctype html>
<HTML>
<HEAD>
<title>Home</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</HEAD>
<BODY>
<h2>Example5</h2>
The current time is
<div class="seedo:ews.HelloWorldDb2:tb:2500">emp</div>.
</BODY>
</HTML>

結果

結果は以下のとおり

Post Details

コメントを残す