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が起動しているか、接続文字列に間違いがないかを確認してください。
コメントを残す
コメントを投稿するにはログインしてください。