Seedo Scala FrameworkでSELECT

Posted 2011年1月2日 by

Seedo Scala Framework によってSELECT文を書いてみます。

Dbクラスがデータベースを操作するためのクラスです。
Oracle DB に接続します。


package test

import seedo.database._

object sample01 {
	val drivrName = "oracle.jdbc.driver.OracleDriver"
	val jdbcURL = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL"
	val user ="scott"
	val passwd ="tiger"
	var dbx:Db = null

	def scala1 :Unit = {
		try {
			dbx = new Db(drivrName, jdbcURL, user, passwd)
			dbx.select("EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO").from("EMP").where("empno >= ?",7000).orderBy("ename")
			println(dbx.toString)
			println(dbx.getSql)
			println(" ------------- ")
			val q = dbx.executeQuery
			q.foreach(record => {
				record.foreach(col => {
					print(" " + col)
				})
				println
			})
			println
			println(" --- ColumnNameList")
			val list = dbx.getColumnNameList
			list.foreach( field => {
					print(" " + field)
			})
			println
		} catch {
			case e:Exception => {println(e.getMessage)}
		} finally {
			dbx.close
		}
	}
	def main(args : Array[String]) : Unit = {
		scala1
	}
}


コンストラクタには、JDBCドライバでデータベースに接続するために定義を引数にしています。引数を省略することもできます。

var dbx = new Db



この場合、データベースへの接続は、env.properties ファイルに記述された接続定義によって行われます。
Sevletの中で使った場合は、コネクションプールからDB接続を得ます。

# for JDBC
driver = oracle.jdbc.driver.OracleDriver
jdbc = jdbc:oracle:thin:@127.0.0.1:1521:ORCL
user = scott
password = tiger

# for Session
connection-jndi = on
jndi-name = jdbc/mysql
driver-session = com.mysql.jdbc.Driver
jdbc-session = jdbc:mysql://192.168.0.100:3306/seedo?useUnicode=true&characterEncoding=UTF-8
user-session = scott
password-session = tiger



次のように書くとすでに接続しているコネクションを使うこともできます。


var dbx = new Db(con)


scala.dbc では、Venderクラスによってデータベースベンダーを指定するようになっていますが、Seedo Scala Framework ではその必要はありません。
以下が実行した結果です。
1行目にJDBCのドライバ名、2行目に接続したデータベースとバージョンが表示されています。
最初にデータベースに接続したときにこの情報をJDBCドライバを使って入手しています。


JDBC Driver:Oracle JDBC driver Version:11.1.0.6.0-Production
Database:Oracle Version:11.1
select EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO from EMP where empno >= ? order by ename [7000]
select EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO from EMP where empno >= ? order by ename
 ------------- 
 7876 ADAMS CLERK 7788 1987-05-23 00:00:00.0 1100 null 20
 7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00.0 1600 300 30
 7698 BLAKE MANAGER 7839 1981-05-01 00:00:00.0 2850 null 30
 7782 CLARK MANAGER 7839 1981-06-09 00:00:00.0 2450 null 10
 7902 FORD ANALYST 7566 1981-12-03 00:00:00.0 3000 null 20
 7900 JAMES CLERK 7698 1981-12-03 00:00:00.0 950 null 30
 7566 JONES MANAGER 7839 1981-04-02 00:00:00.0 2975 null 20
 7839 KING PRESIDENT null 1981-11-17 00:00:00.0 5000 null 10
 7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00.0 1250 1400 30
 7934 MILLER CLERK 7782 1982-01-23 00:00:00.0 1300 null 10
 7788 SCOTT ANALYST 7566 1987-04-19 00:00:00.0 3000 null 20
 7369 SMITH CLERK 7902 1980-12-17 00:00:00.0 800 null 20
 7844 TURNER SALESMAN 7698 1981-09-08 00:00:00.0 1500 0 30
 7521 WARD SALESMAN 7698 1981-02-22 00:00:00.0 1250 500 30

 --- ColumnNameList
 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


SQL文は、ドットで関数をつなぎます。
where句の ‘?’ によってprepared statement(プリペアードステートメント:準備済みSQL)を使うことができます。
where関数は可変長引数として定義されています。


dbx.select("EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO").from("EMP").where("empno >= ?",7000).orderBy("ename")



SQL文は、Dlクラスによって実装されいます。
Dbクラスは、Dlクラスを継承して定義されています。
select句、from句、where句、orderBy句はDlクラスのメソッドです。
返り値は、Dlクラスとしてthis を返します。

Dlクラスによって次のように書くこともできます。


var dl = new Dl //SQL statement
dl.select("EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO").from("EMP").where("empno >= ?",7000).orderBy("ename")


SQL文は以下の2つの関数で見ることができます。
toString 関数はSQL文とprepared statement で与えられる引数を表示します。
getSql 関数はSQL文のみを表示します。このSQL文がデータベースに送られます。


dbx.toString
dbx.getSql


toString関数 と getSql関数を実行した結果です。

select EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO from EMP where empno >= ? order by ename [7000]
select EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO from EMP where empno >= ? order by ename


クエリーの実行は次のように記述します。
executeQuery関数の返り値は、Array[Array[Any]]として定義されています。
そのため、結果はforeach を使って結果を表示しています。


val q = dbx.executeQuery


getColumnNameList 関数はSELECTしたときのフィールド名をArray[String]で返します。


val list = dbx.getColumnNameList


close関数は、DB接続を明示的にクローズします。


} finally {
	dbx.close
}



現在のバージョンでは、このclose関数は必須です。


「ドットでSQL文を作るなんて」という方には次の記述をお勧めします。


package test

import seedo.database._

object sample02 {
	val drivrName = "oracle.jdbc.driver.OracleDriver"
	val jdbcURL = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL"
	val user ="scott"
	val passwd ="tiger"
	var dbx:Db = null

	def scala1 :Unit = {
		try {
			dbx = new Db(drivrName, jdbcURL, user, passwd)
	        println(" ------------- ")
	        val q = dbx.executeQuery("select * from EMP where empno >= ? order by ename",7000)
	        q.foreach(record => {
	        	record.foreach(col => {
	        		print(" " + col)
	        	})
	        	println
	        })
	        println
		} catch {
			case e:Exception => {println(e.getMessage)}
		} finally {
			dbx.close
		}
	}
	def main(args : Array[String]) : Unit = {
		scala1
	}
}


お試しください。

最後に、DBに接続できなかった場合は以下のようにメッセージされます。

java.sql.SQLException: I/O例外です。: The Network Adapter could not establish the connection



DBが起動しているか、接続文字列に間違いがないかを確認してください。

Post Details

  • Post Title: Seedo Scala FrameworkでSELECT
  • Author: admin
  • Filed As: Scala
  • Tags:
  • You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

コメントを残す