18.3.10 JDBCとの相互運用
JDBCとSQLJを併用するときの運用について説明します。
- 〈この項の構成〉
(1) SQLJの反復子からの,JDBCの結果セットの取得
SQLJの反復子を,JDBCの結果セット(ResultSetオブジェクト)に変換して,JDBCのAPIを利用して検索結果を取得できます。なお,ネイティブインタフェース版の場合,JDBCの結果セットを取得できません。
JDBCの結果セットを取得するには,反復子クラス(ResultSetIterator)のgetResultSetメソッドを使用します。返り値として,getResultSetメソッドはJDBCの結果セットを返します。反復子でnextメソッドを実行した後は,getResultSetメソッドを呼び出さないでください。
getResultSetメソッドでJDBCの結果セットに変換した後は,元の反復子を使用して検索結果を受け取ってはいけません。
例を次に示します。
public void showEmployeeName() throws SQLException { sqlj.runtime.ResultSetIterator iter; #sql iter = { SELECT ename FROM rmp } ; ResultSet rs = iter.getResultSet(); while(rs.next()){ System.out.println("employee name: " + rs.getString(1)); } iter.close(); }
(2) JDBCの結果セットを,SQLJの反復子の結果セットとして読み出す方法(スタンダードインタフェース版限定)
JDBCのAPIを使用して作成した,JDBCの結果セット(ResultSet)をCAST文で変換し,SQLJのカーソルの結果セットとして読み出せます。
コーディング例を次に示します。
#sql iterator Employees(String ename, double sal); Statement stmt=conn.createStatement(); String query=”SELECT sname, scode FROM zaiko WHERE scode > 1000”; ResultSet rs=stmt.executeQuery(query); Employees emps; #sql emps ={CAST :rs };
(3) JDBCの接続の,SQLJの接続コンテキストへの変換
SQLJの接続コンテキストには,JDBCの接続からオブジェクトを生成するコンストラクタが定義されています。このコンストラクタを使用することで,JDBCの接続からSQLJの接続コンテキストに変換できます。なお,コンストラクタの引数としてJDBCの接続を渡します。また,両方の接続は併用できます。
例を次に示します。
java.sql.Connection jdbcConCtx =java.sql.DriverManager.getConnection(…); #sql context Inventory; Inventory sljConCtx = new Inventory(jdbcConCtx);
(4) SQLJの接続の,JDBCの接続への変換
SQLJの接続コンテキストは,getConnectionメソッドでJDBCの接続を取得できます。両方の接続は併用できます。
ネイティブインタフェース版の場合,SQLJの接続をJDBCに変換することはできません。JDBCと同一の接続を使用したい場合は,あらかじめJDBC側で接続を作成し,SQLJの接続コンテキストに変換する必要があります。
例を次に示します。
#sql context Inventory; Inventory sljConCtx = new Inventory(url); java.sql.Connection jdbcConCtx = sqljConCtx.getConnection();
(5) 動的SQL
SQLJでは静的SQLだけ記述できるため,動的SQLを実行する場合はJDBCのAPIを使用する必要があります。
(a) 動的SQLの実行
動的SQLは,JDBCのPreparedStatementオブジェクトを使用して実行します。
接続コンテキストのprepareStatementメソッドを,SQLを引数にして実行すると,返り値としてPreparedStatementオブジェクトが返ります。
動的SQLへのパラメタの設定には,PreparedStatementのsetメソッドを使用します。また,SQLの実行には,PreparedStatementオブジェクトのexecuteメソッドを使用します。
動的SQLの実行例を次に示します。
java.sql.PreparedStatement pstmt = con.prepareStatement( "INSERT INTO FOO_TABLE VALUES(?, ?)"); pstmt.setInt(1, 100); pstmt.setString(2, "テスト"); pstmt.execute();
(b) 動的カーソルの検索
SQLJでは静的カーソルだけ使用できるため,動的カーソルを実行するにはJDBCのAPIを使用する必要があります。
接続コンテキストのprepareStatementメソッドを,SELECT文を示す文字列で実行すると,返り値としてPreparedStatementオブジェクトが返ります。
パラメタの設定には,PreparedStatementのsetメソッドを使用します。また,SQLの実行には,PreparedStatementオブジェクトのexecuteQueryメソッドを使用します。このexecuteQueryメソッドは,JDBCの結果セットを返します。
検索結果の受け取りには,結果セットのgetメソッドを使用します。
動的カーソルの検索例を次に示します。
java.sql.PreparedStatement pstmt = con.prepareStatement( "SELECT NAME, POINT FROM FOO_TABLE WHERE BAR=100"); ResultSet rs = pstmt.executeQuery(); String name; Integer point; rs.next(); name = pstmt.getString(1); point = pstmt.getInteger(2);
(c) DESCRIBE文の実行
動的カーソルの各検索項目の列名及びデータ型を求めるためには,ResultSetMetaDataオブジェクトを使用します。
ResultSetMetaDataオブジェクトは,結果セットのgetMetaDataオブジェクトから取得できます。また,ResultSetMetaDataオブジェクトのgetColumnClassNameメソッドで,各検索項目のデータ型を示す文字列を取得できます。
列名はgetColumnNameメソッドで取得できます。
対象とする検索項目は,番号(1〜)で指定します。また,列数はgetColumnCountメソッドで取得できます。
DESCRIBE文の実行例を次に示します。
java.sql.PreparedStatement pstmt = con.prepareStatement( "SELECT * FROM FOO_TABLE"); java.sql.ResultSetMetaData aMeta = pstmt.getMetaData(); int columCount = aMeta.getColumnCount(); Vector nameList = new Vector(); Vector classList = new Vector(); for(int i = 1; i <= columnCount; i++){ nameList.addElement(aMeta.getColumnName(i)); classList.addElement(a.Meta.getColumnClassName(i)); } Vector dataList = new Vector(); rs.next(); for(int i = 1; i <= columnCount; i++){ dataList.addElement(rs.getObject(i)); }