• 検索結果がありません。

Javaアプリケーション開発ガイド入門編

N/A
N/A
Protected

Academic year: 2021

シェア "Javaアプリケーション開発ガイド入門編"

Copied!
56
0
0

読み込み中.... (全文を見る)

全文

(1)

Javaアプリケーション開発ガイド

入門編

第2版 2011年9月

(2)

まえがき

■本書の目的 本書は、JavaアプリケーションからSymfoware Serverを利用する方法について、説明しています。 以下の内容が理解できることを目標としています。 ・ JDBCを用いてJavaアプリケーションからSymfoware Serverに接続する方法 (DriverManagerを用いてSymfoware Serverに接続する方法) ・ JavaアプリケーションからSymfoware Serverにアクセスして、SQLを実行する方法 (Statementを用いてSQLを実行し、ResultSetからデータを取り出す方法) ■本書の読者 本書は、Symfoware ServerにアクセスするJavaアプリケーションを開発される方に読んでいただくよう に書かれています。 本書を読むには、以下の知識が必要です。 ・ Symfoware Serverに関する知識 ・ SQLに関する知識(SELECT、INSERT、UPDATE、DELETE、COMMIT、ROLLBACK) ・ Javaに関する一般知識(クラス、メソッド、オブジェクト)

(3)

目次

第1 章 アプリケーションの処理の流れ ... 1 1.1 Javaアプリケーションからデータベースを利用する方法 ... 2 1.2 アプリケーションの処理の流れ ... 3 第2 章 JDBCドライバのインストール... 5 2.1 JDBCドライバ ... 6 2.2 JDBCドライバのインストール ... 7 2.3 JDBCドライバのセットアップ ... 8 第3 章 データベースへの接続 ... 9 3.1 データベースへの接続とは何をすることか ... 10 3.2 Connectionオブジェクトを作成する方法 ... 12 3.3 リモート接続とローカル接続 ... 15 3.4 リモート接続の場合のURL記述形式 ... 16 3.5 ローカル接続の場合のURL記述形式 ... 17 3.6 自動コミットの解除 ... 18 第4 章 SQL文の準備 ... 19 4.1 データベースに処理を依頼する方法 ... 20 4.2 Statementクラス ... 21 第5 章 データの挿入、更新、削除 ... 23 5.1 データを挿入、更新、削除する方法 ... 24 第6 章 データの検索 ... 26 6.1 データを検索する方法 ... 27 第7 章 検索結果の取り出し ... 30 7.1 ResultSetクラス ... 31 7.2 ResultSetオブジェクトのカーソル ... 32 7.3 ResultSetオブジェクトから値を取り出す方法 ... 34 第8 章 後始末 ... 35 8.1 オブジェクトのクローズ ... 36 8.2 データベースからの切断 ... 37 第9 章 例外処理 ... 38 9.1 SQLException ... 39

(4)

A.2 データを検索するプログラム ... 46 . 50 A.3 データを更新するプログラム ...

(5)

第1章

アプリケーションの処理の流れ

Javaのアプリケーションからデータベースを利用する場合、アプリケーションの処理の 流れには、決まった手順があります。

具体的なアプリケーションの説明に入る前に、本章ではアプリケーションの全体的な流 れについて説明します。

(6)

1.1 Javaアプリケーションからデータベースを利

用する方法

Java のアプリケーションから一般的なデータベースを利用するには、JDBC という API を用 います。JDBC は、Java の標準 API の一部です。 アプリケーションは JDBC の API を用いて、データベースに SQL 文の実行を依頼し、結果を 受け取ります。 データベース JDBCドライバ Javaアプリケーション SQL 検索結果 クライアントコンピュータ データベースサーバ

(7)

1.2 アプリケーションの処理の流れ

アプリケーションは、JDBC の API を利用して、JDBC の様々なオブジェクトを作成します。 そして、JDBC のオブジェクトのメソッドを使用することで、データベースにアクセスしま す。 JDBC の API は、特定のデータベースソフトに依存しません。そのため、どのデータベース ソフトを使っていても、共通の方法でデータベースにアクセスすることができます。 データベースを検索する処理を行う場合、処理の流れは以下のようになります。 データベースに接続する。(Connectionオブジェクトを作成する) SQL文を準備する。(Statementオブジェクトを作成する) 検索を実行する。(ResultSetオブジェクトを作成する) 検索結果を取り出す。 作成したオブジェクトをクローズする。

(8)

データベースを更新する処理を行う場合、処理の流れは以下のようになります。

データベースに接続する。(Connectionオブジェクトを作成する)

SQL文を準備する。(Statementオブジェクトを作成する)

更新を実行する。

(9)

第2章

JDBCドライバのインストール

Javaのアプリケーションからデータベースを利用するには、JDBCのAPIを使用します。 JDBCのAPIを使用するためには、JDBCドライバが必要です。

JDBCドライバは、データベース製品ごとに専用のものが付属しています。本章ではJDBC ドライバを使用できるようにする方法について説明します。

(10)

2.1 JDBCドライバ

JDBC の API を用いてデータベースを利用するには、JDBC の機能を実装した JDBC ドライバ が必要です。JDBC ドライバは、データベースソフトのベンダから提供されています。 JDBC の API はデータベースソフトに依存しませんが、データベースを利用するための方法 (SQL 文を送ったり、結果を受け取ったりする方法)は、データベースソフトごとに異なっ ています。その差を、JDBC ドライバが吸収しています。 すなわち、JDBC を用いてデータベースを利用する Java のアプリケーションの処理手順はど のデータベースでも共通ですが、JDBC ドライバは利用するデータベースソフト専用のもの を使用する必要があります。アプリケーションは、JDBC の API を利用して、JDBC の様々な オブジェクトを作成します。そして、JDBC のオブジェクトのメソッドを使用することで、 データベースにアクセスします。 [補足]JDBC の API がすべて使用可能とは限らない。 Java の API は容易に拡張することが可能なため、データベースソフトのベンダによって、JDBC の API が拡張されている場合があります。また、JDBC の規格で決まっている API が、JDBC ドライバで すべて実装されているとは限りません。 そのため、JDBC を用いた Java アプリケーションが、どのデータベースソフトでも完全に共通に動 作するわけではありません。

(11)

2.2 JDBCドライバのインストール

Symfoware Server の製品には、Symfoware Server 専用の JDBC ドライバが付属しています。

JDBC ドライバは、Symfoware Server クライアント機能をインストールすることでインスト ールされます。また、Symfoware Server サーバ機能をインストールすると、同時にクライ アント機能もインストールされます。

インストール方法の詳細は、それぞれ以下を参照してください。

Symfoware Server Standard Edition、Symfoware Server Enterprise Edition、または、 Symfoware Server Enterprise Extended Edition の場合、マニュアル“インストールガイ ド(クライアント編)”および“インストールガイド(サーバ編)”。

Symfoware Server Lite Edition の場合、マニュアル“インストールガイド(クライアント 編)”および“データベース簡単運用ガイド”。

(12)

2.3 JDBCドライバのセットアップ

JDBC ドライバを使用するには、JDBC ドライバの実行環境を設定しておく必要があります。 実行環境の設定とは、各種のモジュールへのパスを環境変数に設定することです。 CLASSPATH、PATH、LD_LIBRARY_PATH 等の環境変数に、必要なモジュールのパスを設定しま す。 Symfoware Server V10 では、3 種類の JDBC ドライバのモジュールが付属しています。それ ぞれ対応している JDBC の規約のバージョンが異なっています。通常は、最新版である JDBC4.x 対応のモジュールを使用してください。 詳細は、マニュアル“アプリケーション開発ガイド(JDBC 編)”の“アプリケーションの実 行”を参照してください。 [補足]

(13)

第3章

データベースへの接続

Javaのアプリケーションからデータベースを利用するには、まずデータベースに接続す る必要があります。 データベースに接続するとは、JDBCのAPIを使用してConnectionオブジェクトを作成する ことです。 本章では、Connectionオブジェクトを作成する方法を説明します。

(14)

3.1 データベースへの接続とは何をすることか

■接続とは、通信を確立すること

アプリケーションがデータベースを利用するためにまず行うべきことは、アプリケーショ ンからデータベースに接続することです。

データベースを管理している Symfoware Server と、データベースを利用する Java アプリ ケーションは、別々のプログラムです。Java アプリケーションが Symfoware Server に処理 を依頼して結果を受け取るためには、二つのプログラムが通信を行う必要があります。

Java アプリケーションが Symfoware Server との通信ができるようにすることを、「データ ベースに接続する」と言います。 ■通信の確立は JDBC ドライバで行う JDBC には、データベースに接続する処理を行うための API が用意されています。アプリケ ーションは、この API を用いてデータベースに接続します。 アプリケーションは、JDBC の API を通じて、どのデータベースに接続したいのか、接続し ようとしているユーザーは誰なのか、といった情報を、JDBC ドライバに伝えます。 通信の確立や実際のデータベースサーバとの通信は、JDBC ドライバが行います。 ■通信の確立とは、Connection オブジェクトを作成すること Java アプリケーションにおいてデータベースに接続するということは、Connection オブジ ェクトを作成することと同義です。Connection クラスは JDBC で定義されている、データベ ースへの接続を表すクラスです。

(15)

JDBC の API を用いてデータベースに接続すると、Connection オブジェクトが作成されます。

アプリケーションは、その後のデータベースに関する様々な処理を、Connection オブジェ クトを用いて実行します。

(16)

3.2 Connectionオブジェクトを作成する方法

Connection オブジェクトを作成する方法は 2 種類ありますが、ここでは簡単な方の方法を 説明します。

Java アプリケーションから Symfoware Server に接続するためには、DriverManager クラス を用いて、以下のようにします。

(例)

Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver");

Connection con = DriverManager.getConnection(

"jdbc:symford://myhost:26551/COMPANY", "UID","PWD");

2

3

1

この処理の流れは、どのデータベースソフトでも共通のおまじないです。このおまじない の中で、以下を指定しています。 ① どの JDBC ドライバを使用するのか。

Symfoware Server を利用する場合は、常に“com.fujitsu.symfoware.jdbc.SYMDriver” を指定します。

(17)

② どのデータベースに接続するのか。 接続先のデータベースに関する情報を決められたフォーマットで指定します。この情 報を URL と呼びます。URL の書き方はデータベースソフトによって異なります。 ③ 誰がデータベースを利用するのか。 データベースを利用するユーザーのユーザー名とパスワードを指定します。 この例では、データベースに接続するのは「UID」という名前のユーザーで、そのパス ワードは「PWD」であることを意味しています。 URL の書き方の詳細は、次節以降で説明します。 上記の例の「jdbc:symford://myhost:26551/COMPANY」という URL は、以下のことを示して います。 z 接続するデータベースがあるのは、myhost というマシンである。 z 接続するためのポート番号は 26551 である。 z 接続するデータベースの名前は COMPANY である。 z アプリケーションが動作するマシンから、myhost というマシンにリモート接続する。 [補足] Connection オブジェクトを作成するためのもう一つの方法

DataSource オブジェクトの getConnection メソッドを用いることで Connection オブジェクトを作 成することもできます。具体的な方法は、“Java アプリケーション開発ガイド 一般編”で説明し ます。

[補足] おまじないの意味

DriverManager は JDBC の管理を行っています。JDBC ドライバを使用するためには、その JDBC ドラ イバが DriverManager に登録されている必要があります。

(18)

Class.forName メソッドを実行することによって、指定した JDBC ドライバがロードされます。クラ スをロードしただけでは DriverManager には登録されません。しかし、Java には STATIC イニシャ ライザという仕組みがあります。クラスをロードしたとき、そのクラスの中の static で宣言された コードが 1 回だけ実行されます。 クラスのロード時に 1 回だけ実行される部分で、JDBC ドライバを DriverManager に登録するように なっています。 そのため、Class.forName メソッドで JDBC ドライバのクラスをロードするだけで、JDBC ドライバの 機能を使用できるようになります。 [補足] DriverManager オブジェクトはいつ作られたのか

DriverManager のメソッドは static であり、DriverManager クラスのインスタンスを作成しなくて も、いつでも呼び出すことができます。

getConnection メソッドを利用するために DriverManager オブジェクトを作成する必要はありませ ん。

実は DriverManager のコンストラクタは private になっているので、DriverManager オブジェクト をアプリケーションが作成することはできません。

(19)

3.3 リモート接続とローカル接続

DriverManager クラスの getConnection メソッドで Connection オブジェクトを作成する際、 接続先のデータベースを指定するために記述する文字列を URL と呼びます。

URL の書き方は、データベースへの接続方式によって異なります。Symfoware Server には、 リモート接続とローカル接続の 2 種類の接続方式があります。

z リモート接続

Java アプリケーションと Symfoware Server が別々のコンピュータ上で動作している場 合の接続方式です。2 台のコンピュータ間で通信を行う必要があるため、TCP/IP を用 いて通信を行います。Symfoware Server では、これを RDB2_TCP 連携と呼びます。 z ローカル接続

Java アプリケーションと Symfoware Server が同一のコンピュータ上で動作している場 合の接続方式です。プログラム同士の通信は 1 台のコンピュータ内で行われます。

[補足] RDA-SV 連携

Symfoware Server V9 までは、2 台のコンピュータ間で通信を行うときに RDA-SV というソフトウェ アを使用する方式も使われていました。しかし、これは古い方式であるため、Symfoware Server V10 からは RDA-SV 連携は廃止されました。

(20)

3.4 リモート接続の場合のURL記述形式

リモート接続の場合は、以下の形式で記述します。 jdbc:symford://<host>:<port_no>/<db_env>[;<options>] リモート接続の場合、接続先のコンピュータを指定する必要があります。別のコンピュー タと通信を行うには、接続先のコンピュータを特定する情報としてホスト名または IP アド レス(<host>の部分)と、通信を行うためのポート番号(<port_no>の部分)を指定する必 要があります。 コンピュータを特定する情報に続けて、データベースを特定する情報としてデータベース 名(<db_env>)を指定します。 接続先のコンピュータで複数の Symfoware/RDB を動作させている場合もありますが、リモ ート接続の場合には RDB システム名を指定する必要はありません。なぜなら、RDB システム ごとにポート番号が異なっているからです。ポート番号を指定することで、接続先の RDB システムは特定されます。 URL に指定できるオプション(<options>の部分)は、ローカル接続の場合と同じです。 URL の書き方、指定できるオプションの詳細については、マニュアル“アプリケーション開 発ガイド(JDBC 編)”の“DriverManager クラスからの接続”を参照してください。

(21)

3.5 ローカル接続の場合のURL記述形式

ローカル接続の場合は、以下の形式で記述します。 jdbc:symfold:///[<db_sys>.]<db_env>[;<options>] ローカル接続であれば、接続先のコンピュータを指定する必要はありません。指定する必 要があるのは、接続先のデータベース名(<db_env>の部分)です。 もし、1 台のコンピュータで複数の Symfoware/RDB を動作させているなら(RDB システム名 を付ける運用をしているなら)、接続先の RDB システム名(<db_sys>の部分)も指定する 必要があります。 接続先以外の情報をオプションとして追加することもできます(<options>の部分)。ここ には、アプリケーションの動作環境をチューニングするためのパラメーターや、接続する ユーザー名やパスワードなどを指定できます。 URL の書き方、指定できるオプションの詳細については、マニュアル“アプリケーション開 発ガイド(JDBC 編)”の“DriverManager クラスからの接続”を参照してください。 [補足] 接続するユーザー名やパスワードは、getConnection メソッドの引数としても指定できますが、URL 内に指定しておくこともできます。 Java ではオーバーロードという仕組みを用いて、引数の型や個数が異なるメソッドを同じ名前で複 数定義することができます。そのため、同じメソッドであっても、状況によって引数の設定方法を 変えることができます。

(22)

3.6 自動コミットの解除

Connection オブジェクトを作成したら、データベースに対して様々な処理を依頼すること ができます。 しかし、データベースにアクセスする前に、まず自動コミットの解除を行っておきます。 JDBC のデフォルトでは、SQL 文を 1 個実行するたびに自動的にコミット処理が行われるよ うになっています。つまり、複数の SQL 文を 1 個のトランザクションとして扱うことがで きません。 そこで、Connection オブジェクトを作成したら、最初に自動コミットを解除します。 自動コミットを解除するには、Connection オブジェクトの setAutoCommit メソッドを用い ます。 (例) // データベースに接続する。 Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver");

String url = "jdbc:symfold:///COMPANY";

Connection con = DriverManager.getConnection(url,"UID","PWD");

// 自動コミットを解除する。

con.setAutoCommit(false);

[補足]

(23)

第4章

SQL文の準備

Connectionオブジェクトを作成したら、データベースにデータの検索やデータの更新を 依頼することができます。データベースへの処理の依頼は、SQL文を用います。

JavaのアプリケーションでSQL文を扱うには、SQL文を表すオブジェクトを作成する必要 があります。本章では実行したいSQL文のオブジェクトを作成する方法について説明します。

(24)

4.1 データベースに処理を依頼する方法

データベースのデータを検索したり更新したりするためには、SQL を用います。

Java アプリケーションからデータベースサーバに SQL 文を送信するためには、まず SQL 文 を表すオブジェクトを作成する必要があります。

(25)

4.2 Statementクラス

Statement オブジェクトは、Connection オブジェクトの createStatement メソッドを用い て作成します。 (例) // Statement オブジェクトを作成する。 Statement stmt = con.createStatement(); Statement オブジェクトを作成した段階では、まだ SQL 文自体は設定しません。SQL 文を指 定するのは、SQL 文を実行するときです。 (例) // Statement オブジェクトを作成する。 Statement stmt = con.createStatement(); // SELECT 文を実行して、検索結果を受け取る。 ResultSet rs = stmt.executeQuery(

"SELECT ID,NAME FROM GENERAL.EMPLOYEE");

(26)

Statement stmt = con.createStatement();

// DELETE 文を実行する。

stmt.executeUpdate("DELETE FROM GENERAL.EMPLOYEE WHERE ID=1");

例えばデータを更新する SQL 文を実行する場合、Statement オブジェクトの executeUpdate メソッドを用います。また、データを検索する SQL 文を実行する場合、Statement オブジェ クトの executeQuery メソッドを用います。SQL 文は executeUpdate メソッドや executeQuery メソッドを実行する際、メソッドの引数として指定します。

すなわち、Statement オブジェクトには SQL 文をデータベースに送信して実行させるための メソッドが用意されており、そのメソッドに SQL 文を文字列(String オブジェクト)として 渡すことで、SQL 文を実行することができます。

(27)

第5章

データの挿入、更新、削除

SQL文を表すStatementオブジェクトには、SQL文を実行するためのメソッドが用意されて います。INSERT文、UPDATE文、DELETE文といった、データベースを更新するSQL文を実行す る場合には、executeUpdateメソッドを用います。

(28)

5.1 データを挿入、更新、削除する方法

データベースの更新は、SQL 文の INSERT 文、DELETE 文、UPDATE 文を用います。これらの SQL 文を実行するには、executeUpdate メソッドを利用します。 手順は以下のようになります。 表にデータを INSERT するには、以下のようにします。 (例) // データベースに接続する。 Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver");

String url = "jdbc:symfold:///COMPANY";

Connection con = DriverManager.getConnection(url,"UID","PWD");

Connectionオブジェクトを作成する。

ConnectionオブジェクトからStatementオブジェクトを作成する。

(29)

// 自動コミットを解除する。 con.setAutoCommit(false); // Statement オブジェクトを作成する。 Statement stmt = con.createStatement(); // INSERT 文を実行する。 stmt.executeUpdate(

"INSERT INTO GENERAL.EMPLOYEE(ID,NAME) VALUES(1,'tiger')");

// Statement オブジェクトを破棄する。 stmt.close(); // INSERT 文をコミットする。 con.commit(); // データベースから切断する。 con.close();

UPDATE 文や DELETE 文を実行したい場合は、INSERT 文の場合と同様に、Statement オブジェ クトの executeUpdate メソッドの引数で、SQL 文を指定します。

(30)

第6章

データの検索

SQL文を表すStatementオブジェクトには、SQL文を実行するためのメソッドが用意されて います。SELECT文を実行する場合には、executeQueryメソッドを用います。

(31)

6.1 データを検索する方法

データベースの検索は、SQL 文の SELECT 文を用います。SELECT 文を実行するには、 executeQuery メソッドを利用します。

executeQuery メソッドを実行すると、ResultSet オブジェクトが作成されます。ResultSet オブジェクトは、検索結果を表すオブジェクトです。ResultSet オブジェクトについては、 次章で説明します。 検索結果を参照するには、ResultSet オブジェクトのメソッドを用いて値を取り出します。 手順は以下のようになります。 Connectionオブジェクトを作成する。 ConnectionオブジェクトからStatementオブジェクトを作成する。 StatementオブジェクトのexecuteQueryメソッドを実行する。 ResultSetオブジェクトが作成される。 ResultSetオブジェクトから検索結果を取り出す。

(32)

SELECT 文を実行して検索結果を得るには、以下のようにします。

(例)

// データベースに接続する。

Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver");

String url = "jdbc:symfold:///COMPANY";

Connection con = DriverManager.getConnection(url,"UID","PWD");

// 自動コミットを解除する。 con.setAutoCommit(false); // Statement オブジェクトを作成する。 Statement stmt = con.createStatement(); // SELECT 文を実行して、ResultSet オブジェクトを得る。 ResultSet rs = stmt.executeQuery(

"SELECT ID,NAME FROM GENERAL.EMPLOYEE WHERE ID=1");

// ResultSet から 1 行ずつデータを取り出す。

while (rs.next())

{

// ID と NAME の値を取り出す。

(33)

String sName = rs.getString(2); // 取り出した値を表示させる。 System.out.println("ID = " + iID); System.out.println("NAME = " + sName); } // ResultSet オブジェクトを破棄する。 rs.close(); // Statement オブジェクトを破棄する。 stmt.close(); // SELECT 文をコミットする。 con.commit(); // データベースから切断する。 con.close();

(34)

第7章

検索結果の取り出し

SELECT文を実行すると、検索結果がデータベースから返却されます。検索結果は ResultSetオブジェクトとして作成されています。

(35)

7.1 ResultSetクラス

executeQuery メソッドを用いてデータベースの検索を行うと、検索結果を表す ResultSet オブジェクトが作成されます。

SELECT 文を実行して得られる検索結果は、1 個の表の形をしています。例えば「SELECT ID,NAME FROM GENERAL.EMPLOYEE WHERE ID=1」という SELECT 文を実行した結果は、ID 列と NAME 列で構成される 1 個の表になります。ResultSet は、この表を表すオブジェクトです。

ResultSet オブジェクトを用いて、検索結果の表を行単位で操作することができます。

検索結果の値を得るには、検索結果の特定の行に位置づけ、ResultSet オブジェクトのメソ ッドを用いて ResultSet オブジェクトから値を取り出します。

(36)

7.2 ResultSetオブジェクトのカーソル

検索結果の表のデータは、1 度に 1 行ずつ参照することができます。そのためには、どの行 を参照するのかを指定する必要があります。参照する行を指定するためにカーソルという 仕組みを用います。 ResultSet オブジェクトには 1 個のカーソルが用意されています。カーソルを 1 行ずつ進め ながら、検索結果を 1 行ずつ参照します。カーソルを 1 行進めるためには、ResultSet オブ ジェクトの next メソッドを実行します。 ResultSet オブジェクトが作成された時点では、カーソルは第 0 行に位置づけられています。 したがって、検索結果の最初の行を参照するには、まず最初に next メソッドを呼び出す必 要があります。

1

tiger

3

cat

4

monkey

7

snake

9

beaver

ResultSet

第1行

第2行

カーソル

第1列

nextで1行進む

SELECT ID,NAME FROM GENERAL.EMPLOYEE WHERE SECTION=’A’の検索結果

(37)

(例)

// next メソッドでカーソルを 1 行ずつ進める。

while (rs.next())

{

// ID と NAME の値を取り出す。

int iID = rs.getInt(1);

String sName = rs.getString(2);

// 取り出した値を表示させる。 System.out.println("ID = " + iID); System.out.println("NAME = " + sName); } 結果の行があればtrue、 なければfalseが返る。 nextメソッドを実行。 検索結果の最終行まで達した状態で、さらに next メソッドを実行すると、next メソッドは false を返します。これによって、アプリケーションはすべての検索結果を参照し終わった ことを知ることができます。 もしも SELECT 文による検索の結果、条件に合うレコードが 1 行も存在しなかったらどうな るでしょうか。その場合、結果が 1 行もない ResultSet オブジェクトが作成されます。そ して、最初の next メソッドの呼び出しで false が返却されます。

(38)

7.3 ResultSetオブジェクトから値を取り出す方法

カーソルである行に位置づけたら、ResultSet オブジェクトからデータを取り出すことがで きます。データを取り出すメソッドはデータの型ごとに用意されています。それらのメソ ッドは getXXXX という形の名前になっており、getter メソッドと呼ばれます。

データを取り出す列は、先頭から何番目かという順番で指定します。前節の例では、「SELECT ID,NAME FROM GENERAL.EMPLOYEE WHERE SECTION='A'」の結果を想定しています。検索結果 の表は、1 番目の列が ID、2 番目の列が NAME になっています。 「getString(2)」という操作は、2 番目の列にあるデータを文字列として取り出すことを意 味しています。これによって、Java アプリケーションの中で利用できる String オブジェク トとして、NAME の値が取り出されます。 [補足] ResultSet から列の値を取り出す方法には、列の番号を指定する方法のほかに、列名を指定する方 法もあります。列名を指定すると結果表の列の並び順を考慮する必要がないため、プログラムが柔 軟になります。一方、列の番号を指定する方が処理は効率的に行えます。

(39)

第8章

後始末

Javaのアプリケーションからデータベースを利用するために、様々なオブジェクトを作 成します。処理が終了したら、それらのオブジェクトを削除します。

(40)

8.1 オブジェクトのクローズ

Java のアプリケーションでは、使用しなくなったオブジェクトは JavaVM のガベージコレク タによって、自動的に破棄されます。 しかし、データベースをアクセスするアプリケーションでは、使用しなくなったオブジェ クトは close メソッドを実行して、明示的にオブジェクトを破棄するようにしてください。 例えば、Connection オブジェクトを作成するということは、データベースに接続すること を意味します。処理が終わった後も Connection オブジェクトをそのままにしておくと、ず っとデータベースに接続したままになっています。 データベースは多数のユーザーが共同で使用するものです。データベースに同時に接続で きるユーザー数は限られています。そのため、用が済んだのにデータベースに接続したま まにしておくと、データベースを使用したい別のユーザーが接続できなくなってしまいま す。

(41)

8.2 データベースからの切断

データベースを利用する処理が終了したら、データベースへの接続を切断する必要があり ます。切断は、Connection オブジェクトの close メソッドを呼び出すことで行います。 (例) // データベースに接続する。 Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver");

String url = "jdbc:symfold:///COMPANY";

Connection con = DriverManager.getConnection(url,"UID","PWD");

// データベースから切断する。 con.close(); 同時にデータベースに接続できる個数は、データベースサーバの設定によって制限されて います。自分の処理が済んだのにデータベースからの切断を行わないと、他のユーザーが データベースに接続できなくなることがあります。そのため、処理が終了したらデータベ ースから切断するようにしてください。

(42)

第9章

例外処理

Javaのアプリケーションでは、エラー事象を例外という仕組みで扱います。

本章ではデータベースを利用する処理で発生した例外を処理する方法について説明しま す。

(43)

9.1 SQLException

Java のアプリケーションでは、例外という仕組みを用いてエラーを扱います。例外は Exception クラスで表されます。 JDBC を用いたデータベースの操作でエラーが発生した場合も、例外が発生します。データ ベースに関する例外は、Exception クラスを継承した SQLException クラスで表します。 JDBC のオブジェクトは、エラーを検出すると SQLException クラスの例外をスローします。 アプリケーションはこの例外をキャッチして、SQLEexception オブジェクトから SQLSTATE やエラーメッセージなどの情報を取り出すことができます。 SQLSTATE やエラーメッセージの意味については、マニュアル“アプリケーション開発ガイ ド(JDBC 編)”を参照してください。 (例) try { // データベースに接続する。 Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver");

String url = "jdbc:symfold:///COMPANY";

Connection con = DriverManager.getConnection(url,"UID","PWD");

// 自動コミットを解除する。

(44)

Statement stmt = con.createStatement();

// SELECT 文を実行して、ResultSet オブジェクトを得る。

ResultSet rs = stmt.executeQuery(

"SELECT ID,NAME FROM GENERAL.EMPLOYEE WHERE ID=1");

// ResultSet から 1 行ずつデータを取り出す。

while (rs.next())

{

// ID と NAME の値を取り出す。

int iID = rs.getInt(1);

String sName = rs.getString(2);

// 取り出した値を表示させる。 System.out.println("ID = " + iID); System.out.println("NAME = " + sName); } // ResultSet オブジェクトを破棄する。 rs.close(); // Statement オブジェクトを破棄する。 stmt.close();

(45)

// INSERT 文をコミットする。 con.commit(); // データベースから切断する。 con.close(); } // データベースに関する例外をキャッチする。 catch (SQLException e) { // 例外オブジェクトからエラー情報を取り出す。

System.out.println("ERROR MESSAGE : " + e.getMessage());

System.out.println("SQLSTATE : " + e.getSQLState());

System.out.println("ERROR CODE : " + e.getErrorCode());

e.printStackTrace(); } // データベース以外のエラーが発生した場合の例外をキャッチする。 catch (Exception e) { // エラー情報を取り出す。

System.out.println("ERROR MESSAGE : " + e.getMessage());

(46)

付録A

サンプルプログラム

(47)

A.1 サンプルで扱う表

■表の構成 本章のサンプルプログラムでは、以下のデータベースにアクセスするとします。 データベース名 COMPANY スキーマ名 GENERAL 表名 EMPLOYEE 表の構成は以下のとおりとします。 列名 データ型 ID INT NAME CHARACTER(10) データベースは Windows 上に作成し、ローカル接続でアクセスするものとします。 ■表の作成

Symfoware Server Standard Edition、Symfoware Server Enterprise Edition、または、 Symfoware Server Enterprise Extended Edition では、表を作成する際、表定義の他に表 に対応する DSI と DSO を定義し、データの格納先となるデータベーススペースを定義する 必要があります。Symfoware Server Lite Edition では、デフォルトデータベーススペース に作成されます。各種の資源の定義操作は、Symfoware Server に付属している WebDBtools という Web ブラウザベースのツールを用いて、対話的に行うことができます。

定義操作を DDL 文を直接実行することによって行うこともできます。その場合は、以下の DDL 文を rdbddlex コマンドで実行してください。

Symfoware Server Standard Edition、Symfoware Server Enterprise Edition、または、 Symfoware Server Enterprise Extended Edition の場合

(48)

CREATE DATABASE COMPANY;

CREATE DBSPACE MYDBSP_1 ALLOCATE FILE C:¥COMPANY.dbs ATTRIBUTE SPACE (1M);

CREATE SCHEMA GENERAL;

CREATE TABLE GENERAL.EMPLOYEE (ID INT,NAME CHARACTER(10));

CREATE DSO DSO01 FROM GENERAL.EMPLOYEE TYPE SEQUENTIAL (PAGESIZE(4));

CREATE DSI DSI01 DSO DSO01 ALLOCATE DATA ON MYDBSP_1 SIZE 100K;

GRANT ALL PRIVILEGES ON GENERAL.EMPLOYEE TO PUBLIC; GRANT ALL PRIVILEGES ON SCHEMA GENERAL TO PUBLIC; GRANT ALL PRIVILEGES ON DBSPACE MYDBSP_1 TO PUBLIC;

Symfoware Server Lite Edition の場合

CREATE DATABASE COMPANY;

CREATE SCHEMA GENERAL;

CREATE TABLE GENERAL.EMPLOYEE (ID INT,NAME CHARACTER(10));

GRANT ALL PRIVILEGES ON GENERAL.EMPLOYEE TO PUBLIC; GRANT ALL PRIVILEGES ON SCHEMA GENERAL TO PUBLIC; GRANT ALL PRIVILEGES ON DBSPACE MYDBSP_1 TO PUBLIC;

(49)

表を作成したら、初期データを格納しておきます。

Symfoware Server Standard Edition、Symfoware Server Enterprise Edition、または、 Symfoware Server Enterprise Extended Edition の場合、データを投入するには、rdbsloader コマンドを使用します。

rdbsloader -mi -i COMPANY.DSI01 -t C:¥TABLE01.dat

ここで、TABLE01.dat は、以下のような内容のテキストファイルです。これが初期投入する データとなります。

1,”dog” 2,”cat” 3,”lion”

Symfoware Server Lite Edition の場合、データを投入するには、rdbupt コマンドを使用 します。

(50)

A.2 データを検索するプログラム

データを検索する Java アプリケーションです。

Symfoware Server に接続するユーザーのユーザー名を“UID”、パスワードを“PWD”とし ています。環境に合わせて変更してください。

import java.sql.*;

import java.io.*;

public class test01

{

public static void main(String args[])

{

try

{

// データベースに接続する。

Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver");

String url = "jdbc:symfold:///COMPANY";

Connection con = DriverManager.getConnection(url,"UID","PWD");

(51)

con.setAutoCommit(false);

// Statement オブジェクトを作成する。

Statement stmt = con.createStatement();

// SELECT 文を実行して、ResultSet オブジェクトを得る。

ResultSet rs = stmt.executeQuery(

"SELECT ID,NAME FROM GENERAL.EMPLOYEE WHERE ID=1 OR ID=3");

// ResultSet から 1 行ずつデータを取り出す。

while (rs.next())

{

// ID と NAME の値を取り出す。

int iID = rs.getInt(1);

String sName = rs.getString(2);

// 取り出した値を表示させる。

System.out.println("ID = " + iID);

System.out.println("NAME = " + sName);

}

(52)

// Statement オブジェクトを破棄する。 stmt.close(); // INSERT 文をコミットする。 con.commit(); // データベースから切断する。 con.close(); } // データベースに関する例外をキャッチする。 catch (SQLException e) { // 例外オブジェクトからエラー情報を取り出す。

System.out.println("ERROR MESSAGE : " + e.getMessage());

System.out.println("SQLSTATE : " + e.getSQLState());

System.out.println("ERROR CODE : " + e.getErrorCode());

e.printStackTrace();

}

// データベース以外のエラーが発生した場合の例外をキャッチする。

catch (Exception e)

(53)

// エラー情報を取り出す。

System.out.println("ERROR MESSAGE : " + e.getMessage());

e.printStackTrace();

}

}

(54)

A.3 データを更新するプログラム

データを更新する Java アプリケーションです。

Symfoware Server に接続するユーザーのユーザー名を“UID”、パスワードを“PWD”とし ています。環境に合わせて変更してください。

import java.sql.*;

import java.io.*;

public class test02

{

public static void main(String args[])

{

try

{

// データベースに接続する。

Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver");

String url = "jdbc:symfold:///COMPANY";

Connection con = DriverManager.getConnection(url,"UID","PWD");

// 自動コミットを解除する。

(55)

// Statement オブジェクトを作成する。

Statement stmt = con.createStatement();

// INSERT 文を実行する。

stmt.executeUpdate(

"INSERT INTO GENERAL.EMPLOYEE(ID,NAME) VALUES(4,'tiger')");

stmt.executeUpdate(

"INSERT INTO GENERAL.EMPLOYEE(ID,NAME) VALUES(5,'monkey')");

stmt.executeUpdate(

"INSERT INTO GENERAL.EMPLOYEE(ID,NAME) VALUES(6,'rat')");

// UPDATE 文を実行する。

stmt.executeUpdate(

"UPDATE GENERAL.EMPLOYEE SET NAME = 'gorilla' WHERE ID=5");

// DELETE 文を実行する。

stmt.executeUpdate(

"DELETE FROM GENERAL.EMPLOYEE WHERE id=6");

// 更新をコミットする。

con.commit();

(56)

// データベースから切断する。 con.close(); } // データベースに関する例外をキャッチする。 catch (SQLException e) { // 例外オブジェクトからエラー情報を取り出す。

System.out.println("ERROR MESSAGE : " + e.getMessage());

System.out.println("SQLSTATE : " + e.getSQLState());

System.out.println("ERROR CODE : " + e.getErrorCode());

e.printStackTrace(); } // データベース以外のエラーが発生した場合の例外をキャッチする。 catch (Exception e) { // エラー情報を取り出す。

System.out.println("ERROR MESSAGE : " + e.getMessage());

e.printStackTrace();

}

}

参照

関連したドキュメント

SUSE® Linux Enterprise Server 15 for AMD64 &amp; Intel64 15S SLES SUSE® Linux Enterprise Server 12 for AMD64 &amp; Intel64 12S. VMware vSphere® 7

MPIO サポートを選択すると、 Windows Unified Host Utilities によって、 Windows Server 2016 に含まれている MPIO 機能が有効になります。.

ESET Server Security for Windows Server、ESET Mail/File/Gateway Security for Linux は

Another new aspect of our proof lies in Section 9, where a certain uniform integrability is used to prove convergence of normalized cost functions associated with the sequence

回転に対応したアプリを表示中に本機の向きを変えると、 が表 示されます。 をタップすると、縦画面/横画面に切り替わりま

・M.2 Flash モジュール専用RAID設定サービス[PYBAS1SM2]とWindows Server 2022 Standard(16コア/Hyper-V)[PYBWPS5H]インストール/Windows Server 2019

(1) テンプレート編集画面で、 Radius サーバ及び group server に関する設定をコマンドで追加して「保存」を選択..

* Windows 8.1 (32bit / 64bit)、Windows Server 2012、Windows 10 (32bit / 64bit) 、 Windows Server 2016、Windows Server 2019 / Windows 11.. 1.6.2