Oracle® Database

2日でJava開発者ガイド

12cリリース1 (12.1)

B71331-02(原本部品番号:E17944-10)

2014年2月

Oracle Database 2日でJava開発者ガイド, 12c リリース1 (12.1)

B71331-02

Copyright © 2007, 2014, Oracle and/or its affiliates.All rights reserved.

原本著者: Tulika Das、Maitreyee Chaliha、Deepa Aswani、Rosslynne Hefferan

原本協力者: Kathleen Heap、Simon Law

原本協力者:  Oracle Database 12cのドキュメントを、本リリースに携わった全員にとって創造の源となったMark Townsendに捧げます。

協力者: Kuassi Mensah、Chris Schalk、Christian Bauwens、Mark Townsend、Paul Lo、Venkatasubramaniam Iyer、Yuri Dolgov

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

目次

例一覧

図一覧

表一覧

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

1 Oracle DatabaseでのJavaの使用

- 1.1 Javaを使用したOracle Database 12c リリース1 (12.1)への接続

- 1.1.1 Oracle JDBC Thinドライバ

- 1.1.2 Oracle JDBCパッケージ

- 1.2 JDeveloperを使用したJDBCアプリケーションの作成

- 1.2.1 JDeveloperユーザー・インタフェース

- 1.2.2 JDeveloperツール

- 1.3 サンプルJavaアプリケーションの概要

- 1.4 リソース

2 アプリケーション開発の開始

- 2.1 インストールする必要があるもの

- 2.1.1 Oracle Database 12c リリース1 (12.1)

- 2.1.1.1 JDBCアプリケーションのHRスキーマのロック解除

- 2.1.2 J2SEまたはJDK

- 2.1.3 統合開発環境

- 2.1.4 Webサーバー

- 2.2 Oracle Database 12c リリース1 (12.1)のインストールの検証

- 2.2.1 インストールされたディレクトリおよびファイルのチェック

- 2.2.2 環境変数のチェック

- 2.2.3 JDBCドライバ・バージョンの確認

- 2.3 Oracle JDeveloperのインストール

3 Oracle Database 12c リリース1 (12.1)への接続

- 3.1 JDeveloperからのOracle Databaseへの接続

- 3.1.1 JDeveloperのデータベース・ナビゲータ

- 3.1.2 データベース接続の作成

- 3.1.3 データベース・ナビゲータを使用したデータの表示

- 3.2 JDeveloperでのアプリケーションおよびプロジェクトの設定

- 3.2.1 JDeveloperのアプリケーション・ナビゲータの使用

- 3.2.2 アプリケーションおよびプロジェクトの作成

- 3.2.3 プロジェクトの範囲で利用可能なJavadocおよびソース・コードの表示

- 3.3 JavaアプリケーションからのOracle Databaseへの接続

- 3.3.1 Oracle Databaseへの接続の概要

- 3.3.2 データベースURLの指定

- 3.3.2.1 Oracle Databaseのデフォルト・サービス機能の使用

- 3.3.3 JDeveloperでのJavaクラスの作成

- 3.3.4 Javaライブラリ

- 3.3.4.1 Oracle JDBCライブラリの概要

- 3.3.4.2 JSPランタイム・ライブラリの概要

- 3.3.5 JDBCおよびJSPライブラリの追加

- 3.3.6 JDBCパッケージのインポート

- 3.3.7 接続関連の変数の宣言

- 3.3.8 接続メソッドの作成

4 データの問合せおよび表示

- 4.1 Oracle Database内のデータの問合せの概要

- 4.1.1 SQL文

- 4.1.2 Statementオブジェクトの問合せメソッド

- 4.1.3 結果セット

- 4.1.3.1 ResultSetオブジェクトの機能

- 4.1.3.2 結果セットのオブジェクト・タイプのまとめ

- 4.2 Javaアプリケーションからのデータの問合せ

- 4.2.1 JDeveloperでのデータを問い合せるメソッドの作成

- 4.2.2 接続メソッドおよび問合せメソッドのテスト

- 4.3 JSPページの作成

- 4.3.1 ページ表示の概要

- 4.3.1.1 JSPタグ

- 4.3.1.2 スクリプトレット

- 4.3.1.3 HTMLタグ

- 4.3.1.4 HTMLフォーム

- 4.3.2 簡単なJSPページの作成

- 4.3.3 JSPページへの静的コンテンツの追加

- 4.3.4 JSPページへのスタイルシートの追加

- 4.4 JSPページへの動的コンテンツの追加: データベースの問合せ結果

- 4.4.1 DataHandlerクラスを初期化するJSP useBeanタグの追加

- 4.4.2 結果セットの作成

- 4.4.3 結果セットを表示する表のJSPページへの追加

- 4.5 問合せの結果セットのフィルタ

- 4.5.1 結果をフィルタするJavaメソッドの作成

- 4.5.2 問合せフィルタ・メソッドのテスト

- 4.5.3 JSPページへのフィルタ・コントロールの追加

- 4.5.4 JSPページでのフィルタされたデータの表示

- 4.6 アプリケーションへのログイン機能の追加

- 4.6.1 ユーザーを認証するメソッドの作成

- 4.6.2 ログイン・ページの作成

- 4.6.3 失敗したログインのエラー・レポートの準備

- 4.6.4 ログイン・インタフェースの作成

- 4.6.5 ログイン操作を処理するJSPページの作成

- 4.7 JSPページのテスト

5 データの更新

- 5.1 JavaBeanの作成

- 5.1.1 JDeveloperでのJavaBeanの作成

- 5.1.2 JavaBeanのプロパティおよびメソッドの定義

- 5.2 Javaクラスからのデータの更新

- 5.2.1 従業員レコードを識別するメソッドの作成

- 5.2.2 従業員データを更新するメソッドの作成

- 5.2.3 更新ページにナビゲートするリンクの追加

- 5.2.4 従業員データを編集するJSPページの作成

- 5.2.5 更新アクションを処理するJSPページの作成

- 5.3 従業員レコードの挿入

- 5.3.1 データを挿入するメソッドの作成

- 5.3.2 挿入ページにナビゲートするリンクの追加

- 5.3.3 新規データを入力するJSPページの作成

- 5.3.4 挿入アクションを処理するJSPページの作成

- 5.4 従業員レコードの削除

- 5.4.1 データを削除するメソッドの作成

- 5.4.2 従業員を削除するリンクの追加

- 5.4.3 削除アクションを処理するJSPページの作成

- 5.5 例外処理

- 5.5.1 Javaメソッドへの例外処理の追加

- 5.5.2 SQLExceptionを処理するメソッドの作成

- 5.6 サンプル・アプリケーションのナビゲーション

- 5.6.1 アプリケーションの開始ページの作成

6 アプリケーションの拡張: 拡張JDBC機能

- 6.1 動的SQLの使用

- 6.1.1 OraclePreparedStatementの使用

- 6.1.2 OracleCallableStatementの使用

- 6.1.3 バインド変数の使用

- 6.2 ストアド・プロシージャのコール

- 6.2.1 JDeveloperでのPL/SQLストアド・プロシージャの作成

- 6.2.2 ストアド・プロシージャを使用するためのメソッドの作成

- 6.2.3 ユーザーによるストアド・プロシージャの選択の許可

- 6.2.4 アプリケーションからのストアド・プロシージャのコール

- 6.3 カーソル変数の使用

- 6.3.1 OracleのREF CURSOR型のカテゴリ

- 6.3.2 REF CURSORデータへのアクセス

- 6.3.3 サンプル・アプリケーションでのREF CURSORの使用

- 6.3.3.1 データベースでのパッケージの作成

- 6.3.3.2 データベース・ファンクションの作成

- 6.3.3.3 メソッドからのREF CURSORのコール

- 6.3.3.4 動的に生成されたリストの表示

7 Oracle Database 12c リリース1 (12.1)からの切断

- 7.1 オープンしたすべてのオブジェクトをクローズするメソッドの作成

- 7.2 アプリケーションでのオープンしたオブジェクトのクローズ

8 ユニバーサル接続プールの作成

- 8.1 JDeveloperプロジェクト・プロパティの設定

- 8.2 株価表示機アプリケーションの作成

- 8.3 出力の監視

9 グローバル・アプリケーションの構築

- 9.1 ロケール認識の開発

- 9.1.1 OracleとJavaロケール間のマッピング

- 9.2 ユーザー・ロケールの判別

- 9.2.1 Javaアプリケーションでのロケール認識

- 9.3 HTMLページのエンコーディング

- 9.3.1 HTMLページのページ・エンコーディングの指定

- 9.3.2 JavaサーブレットおよびJSPページでのページ・エンコーディングの指定

- 9.4 HTMLページのコンテンツを翻訳するための構成

- 9.4.1 JavaサーブレットおよびJSPページの文字列

- 9.4.2 静的ファイル

- 9.4.3 データベースからのデータ

- 9.5 ユーザー・ロケールの表記規則によるデータの表示

- 9.5.1 Oracleの日付書式

- 9.5.2 Oracleの数値書式

- 9.5.3 Oracleの言語ソート

- 9.5.4 Oracleのエラー・メッセージ

- 9.6 JDeveloperでのJSPページのテキストのローカライズ

- 9.6.1 リソース・バンドルの作成

- 9.6.2 JSPページでのリソース・バンドル・テキストの使用

索引

例一覧

- 2-1 JDBCドライバ・バージョンの確認

- 3-1 DataSourceオブジェクトのurlプロパティの指定

- 3-2 listener.oraのデフォルト・サービス構成

- 3-3 Javaアプリケーションでのパッケージのインポート

- 3-4 接続変数と接続オブジェクトの宣言

- 3-5 データベースに接続するメソッドの追加

- 4-1 Statementオブジェクトの作成

- 4-2 スクロール-更新検出、読取り専用のResultSetオブジェクトの宣言

- 4-3 Connection、Statement、QueryおよびResultSetオブジェクトの使用

- 4-4 ユーザー検証の実装

- 5-1 基本的なJava Beanとアクセッサ・メソッドのスケルトン・コード

- 5-2 データベース・レコードの更新のメソッド

- 5-3 新規従業員レコードの追加のメソッド

- 5-4 従業員レコードを削除するメソッド

- 5-5 アプリケーションのSQLExceptionを処理するメソッドの追加

- 6-1 PreparedStatementの作成

- 6-2 CallableStatementの作成

- 6-3 ストアド・プロシージャのコール

- 6-4 ストアド・ファンクションの作成

- 6-5 Javaのストアド・ファンクションのコール

- 6-6 従業員データを挿入するためのPL/SQLストアド・プロシージャの作成

- 6-7 JavaでのPL/SQLストアド・プロシージャの使用

- 6-8 REF CURSOR型の宣言

- 6-9 JavaでのREF CURSORデータへのアクセス

- 6-10 データベースでのパッケージの作成

- 6-11 ストアド・ファンクションの作成

- 7-1 オープンしたすべてのオブジェクトをクローズするメソッドの作成

- 9-1 JavaロケールからOracleの言語および地域へのマッピング

- 9-2 JavaでのAccept-Languageヘッダーを使用したユーザー・ロケールの判別

- 9-3 Javaでのユーザー・ロケールの明示的な指定

- 9-4 HTTP指定でのページ・エンコーディングの指定

- 9-5 HTMLページでのページ・エンコーディングの指定

- 9-6 setContentTypeを使用したサーブレットでのページ・エンコーディングの指定

- 9-7 ロケールによる日付書式の違い(アメリカ合衆国とドイツ)

- 9-8 ロケールによる数値書式の違い(アメリカ合衆国とドイツ)

- 9-9 言語ソートの違い(バイナリとスペイン語)

- 9-10 リソース・バンドル・クラスの作成

図一覧

- 1-1 JDeveloperユーザー・インタフェース

- 1-2 サンプル・アプリケーションのWebページ

- 3-1 接続詳細の指定

- 3-2 表の構造およびデータの表示

- 3-3 JDeveloperでJavadocを表示するクラスの選択

- 3-4 Javaクラスの作成

- 3-5 Javaソース・エディタ

- 3-6 ライブラリのインポート

- 3-7 Javaコード・インサイト

- 4-1 ログ・ウィンドウでの問合せメソッドのテスト出力

- 4-2 JSPページの作成

- 4-3 JDeveloperのビジュアル・ソース・エディタでのJSPページへのコンテンツの追加

- 4-4 JSPの書式設定

- 4-5 JSPのCSSファイルの選択

- 4-6 JSPページへの静的コンテンツの追加

- 4-7 employees.jspファイルでのuseBeanの表示

- 4-8 JSP/HTMLのビジュアル・エディタ・オプションを選択するための「プリファレンス」ウィンドウ

- 4-9 JSPページでのスクリプトレットの表示

- 4-10 構造ウィンドウでのエラーの表示

- 4-11 JDeveloperでのパッケージのインポート

- 4-12 コンポーネント・パレット内の一般的なHTMLコンポーネント

- 4-13 JSPページでの表

- 4-14 JSPページ内のHTMLフォーム・コンポーネント

- 4-15 「スクリプトレットのプロパティ」ダイアログ・ボックスの使用

- 4-16 「プロジェクトのCSSファイル」パネル

- 4-17 ログイン・ページ

- 4-18 ブラウザでのサンプル・アプリケーションのログイン・ページ

- 4-19 employee.jspでのフィルタされていない従業員データ

- 4-20 employee.jspでのフィルタされている従業員データ

- 5-1 Java Beanの作成

- 5-2 「アクセッサの生成」ダイアログ・ボックス

- 5-3 employees.jspの従業員の編集へのリンク

- 5-4 従業員の詳細を編集するJSPページの作成

- 5-5 従業員データの編集

- 5-6 従業員データを挿入するフォーム

- 5-7 新規従業員データの挿入

- 5-8 従業員データの挿入

- 5-9 employees.jspから従業員を削除するためのリンク

- 6-1 ストアド・プロシージャ・オプションのためのリンクの追加

- 6-2 レコードを入力するためのストアド・プロシージャの使用

- 6-3 ListBoxオプションの構造の表示

- 6-4 ブラウザで動的に生成されたリスト

- 8-1 デフォルト・プロジェクト・プロパティの設定

- 8-2 「ライブラリとクラスパス」の設定

- 8-3 「アーカイブまたはディレクトリの追加」画面

- 8-4 「アプリケーション・ナビゲータ」パネルのオプション

- 8-5 コード・エディタ内のDbConfig.propertiesファイル

- 8-6 プロジェクトへのソース・ファイルの追加

- 8-7 「プロジェクト・コンテンツに追加」

- 8-8 「実行」メニューのオプション

- 8-9 StockTickerProjプロジェクトの「プロジェクト・プロパティ」画面

- 8-10 「実行構成の編集」画面

- 8-11 JDeveloperログ内の株価表示機アプリケーションの出力

- 8-12 ブラウザを使用したユニバーサル接続プールからの情報取得

- 8-13 UCPプロパティ・ページ

- 8-14 ブラウザ上の株価表示機ページ

- 8-15 ブラウザ上のUCP統計ページ

- 8-16 ブラウザ上のUCPプロパティ更新ページ

- 8-17 ブラウザ上のクライアント・シミュレータ・ページ

表一覧

- 2-1 ORACLE_HOMEディレクトリ内のディレクトリおよびファイル

- 3-1 標準的なデータソース・プロパティ

- 4-1 java.sql.Statementの主要な問合せ実行メソッド

- 9-1 Java、SQLおよびPL/SQLプログラミング環境でのロケール表記

はじめに

この章では、『Oracle Database 2日でJava開発者ガイド』の概要、対象読者、および表記規則について説明します。また、詳細情報が記載されているオラクル社の関連ドキュメントのリストも示します。

対象読者

このマニュアルは、Javaを使用してOracle Databaseデータへのアクセスおよび変更を行うアプリケーション開発者を対象としています。このマニュアルでは、これらのタスクを簡単なJava Database Connectivity (JDBC)アプリケーションを使用して実行する方法を説明します。このマニュアルでは、Oracle JDeveloper統合開発環境(IDE)を使用してアプリケーションを作成します。このマニュアルは、Javaプログラミングに関心のあるすべての読者を対象にしていますが、次に関するいくらかの予備知識があることを前提にしています。

- Java

- Oracle PL/SQL

- Oracle Database

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)を参照してください。

Oracle Supportへのアクセス

Oracleサポート・サービスでは、My Oracle Supportを通して電子支援サービスを提供しています。詳細情報は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info)か、聴覚に障害のあるお客様は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs)を参照してください。

関連ドキュメント

詳細は、Oracle Databaseドキュメント・セットの次のマニュアルを参照してください。

- 『Oracle® Fusion Middleware Oracle JDeveloperインストレーション・ガイド 11g リリース1 (11.1.1)』およびOracle Technology Networkの次の場所にあるJDeveloperオンライン・ドキュメント
http://www.oracle.com/technology/documentation/jdev.html

- 『Oracle Database JDBC開発者ガイド』

- 『Oracle Database Java開発者ガイド』

- 『Oracle Universal Connection Pool for JDBC開発者ガイド』

表記規則

このマニュアルでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック体

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

1 Oracle DatabaseでのJavaの使用

Oracle Databaseは、データの格納、使用および変更に使用できるリレーショナル・データベースです。Javaアプリケーションでは、リレーショナル・データベースのデータのアクセスおよび操作に、Java Database Connectivity(JDBC)標準が使用されます。

業界標準のアプリケーション・プログラミング・インタフェース(API)であるJDBCを使用すると、JavaからSQLを使用してRDBMSにアクセスできます。JDBCはX/Open SQL Call Level Interface (CLI)に基づき、JDBCエスケープ標準のエントリ・レベルに準拠しています。ベンダー各社はそれぞれ独自の拡張を含めたJDBC仕様を実装しています。

関連項目:

http://www.oracle.com/technetwork/java/overview-141217.html

このマニュアルでは、簡単なJavaアプリケーションを使用し、Oracle Database 12c リリース1 (12.1)に接続してデータベースのデータにアクセスおよび変更する方法について説明します。

この章では、このマニュアルで作成されるJavaアプリケーションの概要、およびJavaアプリケーションの開発に使用できるツールについて説明します。この章の内容は、次のとおりです。

- Javaを使用したOracle Database 12c リリース1 (12.1)への接続

- JDeveloperを使用したJDBCアプリケーションの作成

- サンプルJavaアプリケーションの概要

1.1 Javaを使用したOracle Database 12c リリース1 (12.1)への接続

JDBCは、ユーザーがデータベースに接続してSQL文を実行し、データベースに問合せできるようにするデータベース・アクセス・プロトコルです。コアJavaクラス・ライブラリには、JDBC APIのjava.sqlとjavax.sqlが用意されています。ただし、JDBCは、ベンダーが特定のデータベースを必要に応じて特化するためのドライバを提供できるように設計されています。

注意:
Oracle Database 12c リリース1 (12.1)ではJDK 6およびJDK 7をサポートしています。

次の項では、JDBC標準に対するOracleサポートについて説明します。

- Oracle JDBC Thinドライバ

- Oracle JDBCパッケージ

1.1.1 Oracle JDBC Thinドライバ

ほとんどの場合、JDBC Thinドライバを使用することをお薦めします。JDBC-OCIは、OCI固有の機能の場合にのみ必要となります。Thinドライバは、適切なJava仮想マシン(Java Virtual Machine: JVM)があるシステムであれば、どのシステム上でも機能します。

JDBC Thinドライバは、Pure JavaのType IVドライバです。これは、JavaTM 2 Platform Standard Edition 5.0(Java Development Kit(JDK)5とも呼ばれる)をサポートしています。また、JDK 6もサポートしています。このドライバはプラットフォームに依存していないため、クライアント側アプリケーションの開発にその他のOracleソフトウェアを必要としません。JDBC Thinドライバは、SQL*Netを使用してサーバーと通信し、Oracle Database 12c リリース1 (12.1)にアクセスします。

Oracle固有のJDBC機能および標準機能にアクセスするには、oracle.jdbcパッケージを使用します。

1.1.2 Oracle JDBCパッケージ

JDBC APIに対するOracleサポートは、oracle.jdbcパッケージおよびoracle.sqlパッケージによって提供されています。これらのパッケージでは、Java Development Kit(JDK)リリース1.5から1.6がすべてサポートされています。

oracle.sql

oracle.sqlパッケージは、SQL形式でデータへの直接アクセスをサポートしています。このパッケージは、主に、SQLデータへのJavaマッピングを提供するクラスとそれらのサポート・クラスによって構成されます。実質的に、このクラスはSQLデータのJavaラッパーとして機能します。文字はJava charsに変換され、さらにUCS-2キャラクタ・セット内のバイトに変換されます。oracle.sql.*データ型の各クラスは、全データ型共通のファンクションおよび機能が含まれているスーパークラスoracle.sql.Datumを拡張します。その中には、JDBC 2.0準拠のデータ型に対応したクラスもあります。データ型クラスだけでなく、oracle.sqlパッケージは、オブジェクトやコレクションで使用するクラスやインタフェースもサポートしています。

oracle.jdbc

oracle.jdbcパッケージのインタフェースでは、java.sqlパッケージのインタフェースに対するOracleの拡張機能が定義されます。これらの拡張機能によって、Oracle SQL形式のデータにアクセスできるようになります。また、その他のOracle固有の機能(Oracleのパフォーマンス拡張など)にアクセスできるようにもなります。

このパッケージの主要なクラスとインタフェースでは、標準のJDBC機能をサポートし、次のような処理を実行するメソッドがあります。

- OracleのStatementオブジェクトを返します。

- すべての文のOracleパフォーマンス拡張を設定します。

- oracle.sql.*型を準備済のコール可能文にバインドします。

- oracle.sql形式でデータを取得します。

- データベースおよび結果セットに関するメタ情報を取得します。

- SQLの型の識別に使用される整定数を定義します。

1.2 JDeveloperを使用したJDBCアプリケーションの作成

このマニュアルのJavaアプリケーション・チュートリアルでは、Oracle JDeveloper 11.1.1を統合開発環境(IDE)として使用し、Javaアプリケーションの開発、およびユーザーがデータを表示して変更するためのWebページの作成を行います。

Oracle JDeveloperは、JavaアプリケーションおよびWebサービスのモデリング、開発、デバッグ、最適化およびデプロイをサポートするIDEです。

JDeveloperには、Javaプログラムに埋め込まれたSQL文を使用してデータベースにアクセスするJavaプログラムを作成し、テストするための機能が備えられています。JDeveloperには、データベースに関して次の処理を行うファンクションおよび機能が備えられています。

- データベース接続の作成

- データベース・オブジェクトの表示

- データベース・オブジェクトの作成、編集または削除

- PL/SQLファンクション、プロシージャおよびパッケージの作成および編集

1.2.1 JDeveloperユーザー・インタフェース

Oracle JDeveloperは、様々なアプリケーション開発ツール用のウィンドウを使用するIDEです。ウィンドウの表示/非表示を切り替えたり、ウィンドウをドッキング/ドッキング解除して、作業方法に合ったデスクトップを作成できます。

これらのツール以外に、JDeveloperには、プロジェクトの内容を分類し表示できる多くのナビゲータが備えられています。アプリケーション・ナビゲータおよびシステム・ナビゲータには、プロジェクトのファイルが表示され、構造ウィンドウには、個別の項目の構造が表示されます。

必要に応じてウィンドウの位置を変更し、「表示」メニューから閉じたり開いたりすることができます。図1-1に、JDeveloperユーザー・インタフェース(GUI)で使用可能ないくつかのナビゲータ、パレット、作業領域のデフォルトのレイアウトを示します。

図1-1 JDeveloperユーザー・インタフェース

関連項目:
JDeveloperオンライン・ヘルプのIDEでのウィンドウの処理に関する項を参照してください。

1.2.2 JDeveloperツール

JDeveloperでは、次のツールを使用してJavaアプリケーションを簡単に作成できます。

- 構造ウィンドウ: ツリー・ビューに、現在編集中(Java、XMLまたはJSP/HTML)のアプリケーションのすべての要素が表示されます。

- Javaビジュアル・エディタ: ユーザー・インタフェースの要素を迅速かつ簡単に組み合せて配置できます。

- JSP/HTMLビジュアル・エディタ: HTMLおよびJSPページを視覚的に編集する場合に使用できます。

- Javaソース・エディタ: Javaコードを作成する場合に役立つ豊富な機能があります。このような機能には、構文およびセマンティック・エラーをわかりやすくするハイライト、インポート文を追加およびソートする場合の支援、Javaコード・インサイト機能、コード・テンプレートがあります。

注意:
Javaコード・インサイト機能は、Javaソース・エディタでコードを作成する場合にコンテキスト固有のインテリジェント入力を提供する機能です。このマニュアルでは、Javaコード・インサイトを使用したコードの挿入方法が数多く記載されています。

- コンポーネント・パレット: ページ上に表示するボタンやテキスト領域など、ユーザー・インタフェース・コンポーネントを選択します。

- プロパティ・インスペクタ: ユーザー・インタフェース・コンポーネントなどの項目のプロパティを簡単に設定できます。

これらのツールについて理解するには、図1-1を参照してください。

1.3 サンプルJavaアプリケーションの概要

このマニュアルでは、Java、JDBCおよびOracle ADFを使用してアプリケーションを作成する方法について説明します。このアプリケーションには、次のファンクションおよび機能を組み込みます。

1. ユーザーがログインしたり、ユーザー名およびパスワードを検証できるようにします。

2. データベース接続を確立します。

3. データベースでデータを問い合せ、JavaBeanを使用してデータを取得します。

4. JavaServer Pages (JSP)テクノロジを使用して、データを表示します。

5. ユーザーがレコードを挿入、更新または削除できるようにします。

6. マスター・ディテール・アプリケーションの情報にアクセスし、変更します。

7. 例外を処理します。

注意:
アプリケーションは、Oracle Database 12c リリース1 (12.1)に付属のHRスキーマに接続します。

アプリケーションWebページ(JSPページ)の概要

図1-2に、このアプリケーションに対して開発されるページ間の関係を示します。

図1-2 サンプル・アプリケーションのWebページ

サンプル・アプリケーションのWebページの概要は、次のとおりです。

- index.jsp
アプリケーションの開始ページです。アプリケーションのログイン・ページlogin.jspが自動的に表示されます。

- login.jsp
このページで、ユーザーはアプリケーションにログインできます。ユーザー名、パスワードおよびホスト情報は、検証され、データベースにログインするための接続記述子の作成に使用されます。

- login_action.jsp
login.jspでユーザーが入力したログイン情報の認証を処理する非表示のページです。認証が成功すると、ユーザーにemployees.jspが表示されます。それ以外の場合は、メッセージが含まれるlogin.jspページが表示されます。

- employees.jsp
これはアプリケーションのメイン・ページです。AnyCo CorporationのHRスキーマ内の全従業員リストが表示され、ユーザーは任意の文字列で従業員リストをフィルタできます。ユーザー・データの追加、編集および削除用の各リンクも含まれています。しかし、これらのアクションは、これらの個々のタスク専用に作成された別のJSPページで処理されます。

- insert.jsp
employees.jspページ上にある従業員データを挿入するリンクを選択すると、このページが表示されます。このページには、新しい従業員レコードのすべての詳細が入力されるフォームが含まれています。このフォームで入力された詳細は、insert_action.jspページによって処理されます。

- insert_action.jsp
insert.jspページで入力された新しい従業員のデータの挿入を処理する非表示のページです。

- edit.jsp
employees.jspページ上にある従業員データを編集するリンクを選択すると、このページが表示されます。このフォームのテキスト・フィールドには、1人の従業員の現在のデータが表示され、ユーザーはこの情報を編集することができます。

- update_action.jsp
edit.jspページでの送信アクションによって、データがこの非表示のページに送信されます。このページによって、編集済データがデータベースに挿入されます。

- delete_action.jsp
employees.jspページ上にある従業員レコードを削除するリンクは、この非表示のページによって処理されます。このページでは、従業員データが削除され、再度employees.jspページが表示されます。

クラス

サンプル・アプリケーションには、次のクラスが含まれています。

- DataHandler.java
このクラスには、サンプル・アプリケーションの重要なファンクションの実装に使用されるメソッドがすべて含まれています。このクラスには、ユーザー資格証明の検証、データベースへの接続、従業員データの取得(フィルタあり/なし)、データの挿入、データの更新、例外の処理などを行うメソッドが含まれています。

- Employees.java
このクラスは、単一の従業員レコードを保持するJavaBeanです。このクラスには、各レコード・フィールドの値を取得して設定するアクセッサ・メソッドが含まれています。また、従業員レコードを取得して変更するアクセッサ・メソッドも含まれています。

- JavaClient.java
このクラスは、DataHandlerクラスをテストする場合にのみ使用されます。

注意:
このアプリケーションは、このマニュアル全体をとおしてチュートリアルの形式で開発していきます。そのため、このマニュアルは、章の順番に読むことをお薦めします。

1.4 リソース

Oracle Database 12c リリース1の詳細は、次のものを参照してください。

- Oracle Technology Networkページを参照します。
http://www.oracle.com/technetwork/index.html

- 次の手順を実行して、Oracle Database 12c リリース1オンライン・ドキュメント・ライブラリにアクセスします。

- 「スタート」をクリックした後、「プログラム」をクリックします。

- 「Oracle Database 12c Release 1」、「ヘルプを表示」、「ドキュメントを参照」の順に選択します。

- 次の手順を実行して、Oracle Database 12c リリース1オンライン・ディスカッション・フォーラムにアクセスします。

- 「スタート」をクリックした後、「プログラム」をクリックします。

- 「Oracle Database 12c Release 1」、「ヘルプを表示」、「オンライン・フォーラムに移動」の順に選択します。

2 アプリケーション開発の開始

Oracle Database 12c リリース1 (12.1)に接続するJavaアプリケーションを開発するには、必要に応じていくつかのコンポーネントをインストールしておく必要があります。この章では、次の項目について説明します。

- インストールする必要があるもの

- Oracle Database 12c リリース1 (12.1)のインストールの検証

- Oracle JDeveloperのインストール

2.1インストールする必要があるもの

サンプル・アプリケーションを開発するには、次の製品およびコンポーネントをインストールする必要があります。

- Oracle Database 12c リリース1(12.1)

- J2SEまたはJDK

- 統合開発環境

- Webサーバー

次の項目では、これらの要件について詳細に説明します。

2.1.1 Oracle Database 12c リリース1 (12.1)

Javaアプリケーションを作成するには、Oracle Database 12c リリース1 (12.1) ServerをHRスキーマ(データベースに付属)とともに有効にインストールする必要があります。インストールにより、Oracle Database 12c リリース1 (12.1)インスタンスが作成され、このデータベースを管理するためのツールが提供されます。詳細は、次のOracle Database 12c リリース1 (12.1)のインストレーション・ガイドおよびリリース・ノートを参照してください。

- 『Oracle Databaseインストレーション・ガイドfor Linux』

- Oracle Databaseのインストレーション・ガイド

2.1.1.1 JDBCアプリケーションのHRスキーマのロック解除

HRユーザー・アカウント(このマニュアルのJavaアプリケーションで使用するサンプルHRスキーマの所有者)は、最初はロックされています。HRとしてログインするには、まず管理権限を持つユーザー(SYS)としてログインし、アカウントのロックを解除する必要があります。

データベースがローカルにインストールされている場合は、SQLコマンドラインの実行を使用して、次のようにアカウントのロックを解除します。

1. 「SQLコマンドラインの実行」にアクセスするには、「スタート」メニューから「プログラム」(または「すべてのプログラム」)→「Oracle Database 12c Release 1 (12.1)」を選択し、「SQLコマンドラインの実行」をクリックします。DBA権限を持つユーザーとしてログインします。次に例を示します。

> CONNECT SYS AS SYSDBA;
Enter password: password

2. 次のコマンドを実行します。

> ALTER USER HR ACCOUNT UNLOCK;

または

> ALTER USER HR IDENTIFIED BY HR;

3. 次のように接続をテストします。

> CONNECT HR
Enter password: password

データベースに接続したことを示すメッセージが表示されます。

注意:
Oracle Database 12c リリース1 (12.1)でのセキュアなパスワードの作成および使用の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。

また、HRスキーマにある制約およびトリガーの一部は、このマニュアルで作成するJavaアプリケーションの目的に合っていません。次のSQL文を使用して、これらの制約およびトリガーを削除する必要があります。

DROP TRIGGER HR.UPDATE_JOB_HISTORY;
DROP TRIGGER HR.SECURE_EMPLOYEES;
DELETE FROM JOB_HISTORY;

2.1.2 J2SEまたはJDK

Javaアプリケーションを作成およびコンパイルするには、Java 2 Platform, Standard Edition, Software Development Kit(J2SE SDK)(以前のJava Development Kit(JDK))がすべて必要です。また、Javaランタイム環境(JRE)も必要です。

注意:
Oracle Database 12c リリース1 (12.1)ではJDK 6およびJDK 7をサポートしています。

関連項目:

- Javaのインストールの詳細は、http://www.oracle.com/technetwork/java/javase/downloads/index.htmlを参照してください。

- JDBC APIの詳細は、http://www.oracle.com/technetwork/java/overview-141217.htmlを参照してください。

2.1.3 統合開発環境

アプリケーションの開発を簡単にするため、統合開発環境(IDE)でアプリケーションを開発することができます。このマニュアルでは、Oracle JDeveloperを使用して、このアプリケーションのファイルを作成します。JDeveloperのインストールの詳細は、「Oracle JDeveloperのインストール」を参照してください。

2.1.4 Webサーバー

このマニュアルで開発するサンプル・アプリケーションは、JavaServer Pages (JSP)テクノロジを使用して情報を表示し、ユーザーからの入力を受け入れます。これらのページをデプロイするには、サーブレットおよびJSPコンテナを使用するWebサーバー(Apache Tomcatアプリケーション・サーバーなど)が必要です。

このマニュアルでは、JSPページのデプロイに、JDeveloperの Oracle WebLogicサーバーという埋込みサーバーを使用します。Oracle JDeveloperをインストールしない場合でも、任意のWebサーバーを使用してJSPページをデプロイできます。

JDeveloperでは、次の本番アプリケーション・サーバーへの直接デプロイメントがサポートされています。

- Oracle WebLogicサーバー

- Oracle Application Server

- Apache Tomcat

- IBM WebSphere

- JBoss

これらのサーバーの詳細は、ベンダー固有のドキュメントを参照してください。

2.2 Oracle Database 12c リリース1 (12.1)のインストールの検証

Oracle Database 12c リリース1 (12.1)のインストールはプラットフォーム固有です。サンプル・アプリケーションの作成に進む前に、インストールが成功したことを検証する必要があります。この項では、Oracle Database 12c リリース1 (12.1)のインストールを検証する手順について説明します。

インストールの検証には、次の作業があります。

- インストールされたディレクトリおよびファイルのチェック

- 環境変数のチェック

- JDBCドライバ・バージョンの確認

2.2.1 インストールされたディレクトリおよびファイルのチェック

Oracle Java製品をインストールすると、次のディレクトリが作成されます。

- ORACLE_HOME/jdbc

- ORACLE_HOME /jlib

表2-1に示すディレクトリがORACLE_HOMEディレクトリ内に作成されているどうかを確認します。

表2-1 ORACLE_HOMEディレクトリ内のディレクトリおよびファイル

ディレクトリ

説明

$OH/jdbc/lib

libディレクトリには、必須Javaクラスのojdbc6.jarおよびojdbc7.jarが含まれています。これらには、JDK 6およびJDK 7で使用するJDBCドライバ・クラスが含まれています。

$OH/jdbc/Readme.txt

このファイルには、ドライバに関する最新情報およびリリース固有の情報が含まれています。これらの情報は、製品の他のドキュメントには含まれていない場合があります。

$OH/jlib

このディレクトリには、orai18n.jarファイルが含まれています。このファイルには、グローバリゼーションおよびマルチバイト・キャラクタ・セットをサポートするためのクラスが含まれています。

注意:
『Oracle Databaseインストレーション・ガイド』または『Oracle Database Clientインストレーション・ガイド』で説明されているojdbcn.jarファイル(「n」はリリース番号)を使用してください。

2.2.2 環境変数のチェック

この項では、JDBC Thinドライバに対して設定する必要がある環境変数について説明します。インストールされているJDBC Thinドライバをクラスパスに設定する必要があります。JDK 6の場合、次の値をCLASSPATH変数に設定する必要があります。

ORACLE_HOME/jdbc/lib/ojdbc6.jar
ORACLE_HOME/jlib/orai18n.jar

JDK 7の場合、次の値をCLASSPATH変数に設定する必要があります。

ORACLE_HOME/jdbc/lib/ojdbc7.jar
ORACLE_HOME/jlib/orai18n.jar

CLASSPATH 変数に設定したJDBCクラス・ファイル(ojdbc6.jarなど)とグローバリゼーション・クラス・ファイル(orai18n.jar)は1つのみであることを確認します。

2.2.3 JDBCドライバ・バージョンの確認

Oracle Database 12c リリース1 (12.1)以上では、次のように、データベースでのJDBCサポートの詳細を取得できます。

> java -jar ojdbc6.jar
Oracle 12.1.0.0. JDBC 4.0 compiled with JDK6

また、OracleDatabaseMetaDataクラスのgetDriverVersionメソッドをコールすることによって、インストールしたJDBCドライバのバージョンを確認できます。

注意:
JDBC Thinドライバでは、データベースがインストールされているコンピュータでTCP/IPリスナーが実行されていることが必要です。

例2-1に、ドライバ・バージョンを確認する方法を示します。

例2-1 JDBCドライバ・バージョンの確認

import java.sql.*;
import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;

class JDBCVersion
{
public static void main (String args[]) throws SQLException
{
OracleDataSource ods = new OracleDataSource();
ods.setURL("jdbc:oracle:thin:hr/hr@localhost:1521/oracle");
Connection conn = ods.getConnection();

// Create Oracle DatabaseMetaData object
DatabaseMetaData meta = conn.getMetaData();

// gets driver info:
System.out.println("JDBC driver version is " + meta.getDriverVersion());
}
}

2.3 Oracle JDeveloperのインストール

このマニュアルでは、JDBCを使用するサンプルJavaアプリケーションを作成するための統合開発環境(IDE)として、Oracle JDeveloperリリース11.1.1を使用します。このリリースのJDeveloperは、Microsoft Windows Vista、Windows XP、Windows 2003、Windows 2000、LinuxおよびMac OS Xオペレーティング・システムでサポートされています。JDeveloperの最新バージョンのインストールの詳細は、Oracle Technology Networkの次の場所からオンラインで入手できるOracle JDeveloperインストレーション・ガイドに記載されています。

http://download.oracle.com/docs/cd/E12839_01/install.1111/e13666/toc.htm

また、Oracle Technology Networkの次の場所からオンラインで入手できるJDeveloper 11gリリース・ノートも参照してください。

http://www.oracle.com/technetwork/developer-tools/jdev/overview/index.html

3 Oracle Database 12c リリース1 (12.1)への接続

この章から5章にわたって、Oracle Database 12c リリース1 (12.1)にアクセスし、データベース上のデータを表示、変更、削除および更新するJavaアプリケーションの作成方法を説明します。このJavaアプリケーションのパーツの作成方法を各章で説明します。Javaアプリケーションからデータベースにアクセスするには、java.sql.Connectionオブジェクトを使用してデータベースに接続する必要があります。

この章は次の項で構成されています。

- JDeveloperからのOracle Databaseへの接続

- JDeveloperでのアプリケーションおよびプロジェクトの設定

- JavaアプリケーションからのOracle Databaseへの接続

3.1 JDeveloperからのOracle Databaseへの接続

JDeveloperでデータベース接続を設定および管理して、アプリケーションをOracle Database 12c リリース1 (12.1)やオフライン・データベース・オブジェクトなどの外部データソースと通信可能にすることができます。これは、データベース・ナビゲータを使用して行います。アプリケーション・サーバーへの接続など、アプリケーションが必要とする他の接続の管理にも同じナビゲータを使用します。次の項目では、データベース・ナビゲータを使用してデータベースとそのオブジェクトを表示し、データベースへの接続を作成する方法について説明します。

- JDeveloperのデータベース・ナビゲータ

- データベース接続の作成

- データベース・ナビゲータを使用したデータの表示

3.1.1 JDeveloperのデータベース・ナビゲータ

データベース・ナビゲータには、現在定義されている接続がすべて表示されます。データベース・ナビゲータを表示するには、JDeveloperの画面左上にあるナビゲータ・パネルで「データベース・ナビゲータ」タブ(表示されている場合)を選択するか、「表示」メニューを使用します。JDeveloper IDEのデフォルトのレイアウトは、図1-1を参照してください。

データベース・ナビゲータを使用して、表示されている接続を参照できます。特に、データベース・スキーマについては、データベース・オブジェクト、表、ビューおよびそれらの内容を表示することもできます。

データベース接続は、「IDE接続」ノードの下に表示されます。データベース内のオブジェクトを表示するには、接続を開きます。スキーマを開くと、そのスキーマ内のオブジェクト・タイプのノードが表示されます。オブジェクト・タイプのノードを開くと、個々のオブジェクトが表示されます。表のノードを開くと、表の構造および表内のデータを表示できます。

3.1.2 データベース接続の作成

接続の詳細がわかっている任意のデータベースに接続できます。データベース接続を作成するときは、ユーザー名とパスワードを指定する必要があります。デフォルトでは、接続で指定したユーザーのスキーマのみを表示できます。

接続を作成するには、次の手順を実行します。

1. JDeveloperを起動します。

2. 「表示」メニューから「データベース」に移動し、「データベース・ナビゲータ」を選択します。データベース・ナビゲータが表示され、選択可能な接続のリストが表示されます。

3. 「IDE接続」を右クリックし、ショートカット・メニューで「新規接続」を選択します。「データベース接続の作成」画面が表示されます。

4. 「データベース接続の作成」画面で、接続名のデフォルト値を変更しないで、Connection1およびOracle (JDBC)と入力します。「ユーザー名」フィールドと「パスワード」フィールドの両方にHRと入力します。「ロール」の値は入力せず、「パスワードを配布」を選択します。データベースが配置されているコンピュータに関する情報を入力する必要があります。この情報は、データベース管理者から入手します。
次の情報を入力します。

- ドライバ: thin

- ホスト名: Oracle Database 12c リリース1 (12.1)がインストールされているコンピュータのホスト名
データベースが同じコンピュータ上にある場合は、「ホスト名」パラメータにはlocalhostと入力します。

- JDBCポート: 1521

- SID: oracle

「接続のテスト」をクリックします。接続が成功すると、「ステータス」フィールドに「成功」と表示されます。

図3–1に、これらの詳細を入力する「接続」画面を示します。

図3-1 接続詳細の指定

5. 「終了」をクリックして接続を作成し、画面を閉じます。

JDeveloperでのOracle Databaseからの切断と再接続

JDeveloperでデータベースから切断するには、データベース・ナビゲータで、接続名を右クリックして「切断」を選択します。データベース・ナビゲータの表示には接続名のみが表示され、ノードを開くためのプラス(+)記号は表示されなくなります。データベースに再接続するには、接続名を右クリックして「接続」を選択します。

3.1.3 データベース・ナビゲータを使用したデータの表示

データベースへの接続を正常に確立した後で、その内容をデータベース・ナビゲータで表示できます。データベース・ナビゲータには、データベース、そのオブジェクト、それらのインスタンスおよびそれぞれの内容について、ナビゲーション可能な階層ツリー構造が表示されます。作成したデータベース接続の階層の各レベルで内容を表示するには、次の手順を実行します。

1. データベース・ナビゲータの「IDE接続」ノードには、接続名が付いたノードが表示されています。接続名の左にあるプラス記号(+)をクリックして、ナビゲーション・ツリーを開きます。あるオブジェクト・タイプ(たとえば表)についてインスタンスのリストを表示するには、「表」ナビゲーション・ツリーを開きます。

2. ナビゲータの下の構造ウィンドウには、ナビゲータで選択したオブジェクトの詳細な構造が表示されます。ナビゲータで表(Employeesなど)を選択して、構造ウィンドウにその表の列を表示します。

3. 図3-2 表の構造およびデータの表示

4. ナビゲータで表をダブルクリックすると、その表の構造がウィンドウのメインの編集領域に表示されます。すべての列(名前、タイプ、サイズなど)の詳細が含まれているため、表の定義を調べることができます。
表のデータを表示するには、表の構造の下にある「データ」タブを選択します。表のデータを表示して参照できます。

5. データベース・ナビゲータでオブジェクトを編集することもできます。表を編集するには、表を右クリックし、ショートカット・メニューで「編集」を選択します。ダイアログ・ボックスを使用して、選択した表に変更を加えることができます。

3.2 JDeveloperでのアプリケーションおよびプロジェクトの設定

JDeveloperでは、アプリケーション内で作業を行い、アプリケーション内で、多数のプロジェクトに編成できます。JDeveloperには多数のアプリケーション・テンプレートがあり、標準的なタイプのアプリケーションに合うプロジェクト構造を、比較的迅速かつ簡単に作成するために役立ちます。JDeveloperでアプリケーションを作成する際は、構築するアプリケーションのタイプに合ったアプリケーション・テンプレートを選択します。

選択するアプリケーション・テンプレートによって、初期プロジェクト構造(アプリケーション内の名前付きプロジェクト・フォルダ)および含められるアプリケーション・テクノロジが決まります。特定のアプリケーションで必要となるライブラリまたはテクノロジをさらに追加して、必要であればプロジェクトを追加で作成できます。

3.2.1 JDeveloperのアプリケーション・ナビゲータの使用

アプリケーション・ナビゲータには、アプリケーションとプロジェクトがすべて表示されます。JDeveloperを初めて起動すると、JDeveloper IDEの左側にデフォルトでアプリケーション・ナビゲータが表示されます。

アプリケーション・ナビゲータを表示するには(表示されていない場合)、JDeveloper画面の左上にあるナビゲータ・パネルで「アプリケーション」タブをクリックするか、「表示」メニューで「アプリケーション・ナビゲータ」を選択します。

アプリケーション・ナビゲータには、プロジェクト内の項目の論理的なグループが表示されます。個々の項目の構造を表示するには、項目を選択して、その構造を構造ウィンドウに表示できます。

アプリケーション・ナビゲータから、項目を適切なデフォルト・エディタで表示できます。たとえば、JavaファイルをダブルクリックするとファイルはJavaソース・エディタで開き、JavaServer Pages (JSP)ファイルをダブルクリックするとファイルはJSP/HTMLビジュアル・エディタで開きます。

3.2.2 アプリケーションおよびプロジェクトの作成

JDeveloperの使用を開始するには、アプリケーションを作成する必要があります。また、作業を格納するためのプロジェクトを少なくとも1つ作成する必要があります。手順は次のとおりです。

1. 「アプリケーション・ナビゲータ」で「新規アプリケーション」をクリックします。

2. 「汎用アプリケーションの作成」ウィザードが表示されます。「アプリケーションの名前付け」画面で、「アプリケーション名」フィールドにHRAppと入力し、「アプリケーション・テンプレート」リストから「汎用アプリケーション」を選択します。「次へ」をクリックします。

3. 「プロジェクトの名前付け」で、プロジェクト名としてViewと入力します。「終了」をクリックします。

4. 新しいHRAppアプリケーションがアプリケーション・ナビゲータに表示されます。

5. アプリケーションを保存します。このことを行うには、「ファイル」メニューで、「すべて保存」を選択します。

3.2.3 プロジェクトの範囲で利用可能なJavadocおよびソース・コードの表示

プロジェクトのテクノロジ範囲内で利用可能なクラスのJavadocまたはコードをJDeveloperで表示できます。また、それらのクラスに対して利用可能なすべてのメソッドの詳細を表示できます。

たとえば、ConnectionクラスのコードまたはJavadocを表示するには、次の手順を実行します。

1. アプリケーション・ナビゲータでプロジェクトが選択されている状態で、「ナビゲート」メニューで「Javaタイプに移動」を選択します。この操作は、プロジェクト内の特定のファイルに対して行うこともできます。

2. 「Javaタイプに移動」ダイアログ・ボックスで、Javaクラスの名前を入力します。

3. 表示するクラスの名前を「名前」フィールドに入力するか、「参照」をクリックしてクラスを検索します。Connectionクラスの場合、まずConnectionと入力し、表示されるリストで「Connection (java.sql)」を選択します。

図3-3 JDeveloperでJavadocを表示するクラスの選択

4. 「OK」をクリックします。

3.3 JavaアプリケーションからのOracle Databaseへの接続

ここまでは、JDeveloperからデータベースに接続する方法を見てきました。Javaアプリケーションから接続を起動するには、JDBC Application Program Interface(API)のConnectionオブジェクトを使用します。

この項では、Javaアプリケーションからのデータベースへの接続について、次の項目で説明します。

- Oracle Databaseへの接続の概要

- データベースURLの指定

- JDeveloperでのJavaクラスの作成

- Javaライブラリ

- JDBCおよびJSPライブラリの追加

- JDBCパッケージのインポート

- 接続関連の変数の宣言

- 接続メソッドの作成

3.3.1 Oracle Databaseへの接続の概要

Javaでは、DataSourceオブジェクトのインスタンスを使用してデータベースへの接続を取得します。DataSourceインタフェースは、以前のJDBC DriverManagerクラスに完全に置き換わるものです。oracle.jdbc.poolパッケージのOracleDataSourceクラスにより、javax.sql.DataSourceインタフェースが実装されました。オーバーロードされたgetConnectionメソッドによって、データベースへの物理接続が返されます。

注意:
データベースへの接続を確立するためのDriverManagerクラスの使用は非推奨です。

そのDataSourceオブジェクトに適したsetxxxメソッドを使用してプロパティを設定することも、これらのプロパティを入力パラメータとして受け入れるgetConnectionメソッドを使用することもできます。

表3-1に、DataSourceの主要なプロパティを示します。

表3-1 標準的なデータソース・プロパティ

名前

型

説明

databaseName

String

サーバー上の特定のデータベースの名前。Oracleの用語では、サービス名(またはSID)とも呼ばれます。

dataSourceName

String

基礎となるデータソース・クラスの名前。

description

String

データソースの説明。

networkProtocol

String

サーバーとの通信のためのネットワーク・プロトコル。Oracleでは、JDBC Oracle Call Interface(OCI)ドライバにのみ該当し、デフォルトはtcpです。

password

String

接続するユーザーのパスワード。

portNumber

int

サーバーがリクエストをリスニングするポートの番号。

serverName

String

データベース・サーバーの名前。

user

String

ログインに使用されるユーザー名

driverType

String

Oracle JDBCドライバのタイプ。ociまたはthinです。

これは、Oracle固有のプロパティです。

url

String

データベース接続文字列のURLを指定します。標準のportNumber、networkProtocol、serverNameおよびdatabaseNameプロパティのかわりに、このプロパティを使用できます。

これは、Oracle固有のプロパティです。

DataSourceオブジェクトのurlプロパティを必要なすべてのパラメータとともに設定すると、他のプロパティを設定したり、getDBConnectionメソッドに追加パラメータを指定しなくても、データベースに接続できます。データベースURLの設定の詳細は、「データベースURLの指定」の項を参照してください。

注意:
getConnectionメソッドで指定したパラメータは、それまでにアプリケーションで指定されたすべてのプロパティおよびurlパラメータの設定よりも優先されます。

3.3.2 データベースURLの指定

このリリースのOracle JVMでは、URLのInternet Protocol Version 6(IPv6)アドレスと、IPv6アドレスに解決されるデータベース内のJavaコードのシステム名をサポートしています。

データベースURLは、DataSourceオブジェクトのurlプロパティの値に指定する文字列です。完全なURLの構文は次のとおりです。

jdbc:oracle:driver_type:[username/password]@database_specifier

URLの最初の部分には、使用するJDBCドライバを指定します。クライアント側アプリケーションでサポートされているdriver_typeの値は、thinおよびociです。大カッコは、ユーザー名とパスワードの組合せがオプションであることを示します。database_specifierの値は、アプリケーションが接続されるデータベースを示します。

次に示すのは、ThinドライバによってサポートされるThinスタイルのサービス名の構文です。

jdbc:oracle:driver_type:[username/password]@//host_name:port_number:SID

例3-1に、このマニュアルで作成するサンプル・アプリケーションで、ユーザー名とパスワードを指定し、さらにデータベースがローカルに格納されている場合のデータベース接続URLを示します。

例3-1 DataSourceオブジェクトのurlプロパティの指定

jdbc:oracle:thin:hr/hr@localhost:1521:oracle

3.3.2.1 Oracle Databaseのデフォルト・サービス機能の使用

Oracle Databaseサーバーのインストールを「標準」モードで実行した場合、Oracleインスタンスで使用されるデフォルトのサービス名はORCLであり、次の簡易接続構文を使用してそのインスタンスに接続できます。

sqlplus /nolog
SQL> CONNECT username@"host/ORCL"
SQL> Enter password: password

Oracle Database 11gリリース1 (11.1)で導入された簡易接続機能により、従来のJDBC接続URL構文の次の各部分がオプションになりました。

jdbc:oracle:driver_type:[username/password]@[//]host_name[:port][:oracle]

このURLでは、次のようになります。

- //はオプションです。

- :portはオプションです。
デフォルトのOracle Netリスナー・ポート(1521)が使用されない場合にのみ、ポートを指定します。

- :oracle (またはサービス名)はオプションです。
Oracle Databaseの接続アダプタは、ホスト上のデフォルトのサービスに接続します。これは、ホストのlistener.oraファイルで、ORACLEに設定されています。

関連項目:
簡易接続機能の詳細は、『Oracle Database Net Services管理者ガイド』を参照してください。

例3-2に、listener.oraファイルの基本構成を示します。ここでは、デフォルトのサービスが定義されています。

例3-2 listener.oraのデフォルト・サービス構成

MYLISTENER = (ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=test555)(PORT=1521))
)
DEFAULT_SERVICE_MYLISTENER=dbjf.regress.rdbms.dev.testserver.com

SID_LIST_MYLISTENER = (SID_LIST=
(SID_DESC=(SID_NAME=dbjf)(GLOBAL_DBNAME=dbjf.regress.rdbms.dev.testserver.com)(ORACLE_HOME=/test/oracle))
)

listener.oraファイルを変更した後で、次のコマンドを使用してリスナーを再起動する必要があります。

> lsnrctl start mylistener

この構成では、次のURLになります。

jdbc:oracle:thin:@//test555.testserver.com
jdbc:oracle:thin:@//test555.testserver.com:1521
jdbc:oracle:thin:@test555.testserver.com
jdbc:oracle:thin:@test555.testserver.com:1521
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test555.testserver.com)(PORT=1521)))
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test555.testserver.com)))
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test555.testserver.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=)))

注意:
デフォルト・サービスは、Oracle Database 12c リリース1 (12.1)の新機能です。他のバージョンのOracle Databaseを使用してデータベースに接続する場合は、SIDおよびポート番号を指定する必要があります。

3.3.3 JDeveloperでのJavaクラスの作成

Javaアプリケーションを作成するための最初の手順は、Javaクラスを作成することです。次の手順では、DataHandlerという名前のクラスの作成方法を説明します。このクラスには、データベースに問合せを行いデータベース内のデータを変更するメソッドが含まれています。

1. アプリケーション・ナビゲータで、Viewプロジェクトを右クリックし、ショートカット・メニューで「新規」を選択します。

2. 「新規ギャラリ」ダイアログ・ボックスで、「カテゴリ」リストから「一般」を選択します。「項目」リストで、「Javaクラス」を選択し、「OK」をクリックします。「Javaクラスの作成」ダイアログ・ボックスが表示されます。

3. Javaクラス作成ダイアログ・ボックスで、「名前」テキスト・ボックスにDataHandlerと入力し、「パッケージ」テキスト・ボックスにhrと入力します。「オプション属性」のデフォルト値は変更せず、「OK」をクリックします。図3-4に、適切な値が指定された「Javaクラスの作成」ダイアログ・ボックスを示します。

図3-4 Javaクラスの作成

4. スケルトンDataHandlerクラスが作成され、Javaソース・エディタに表示されます。デフォルトで、パッケージ宣言、クラス宣言およびデフォルト・コンストラクタが作成されます。図3-5は、Javaソース・エディタに表示された、Javaコードを追加できる状態のクラスを示しています。

図3-5 Javaソース・エディタ

3.3.4 Javaライブラリ

Oracle JDeveloperには、Javaアプリケーション・プログラミングに役立つ標準ライブラリがあります。これらのライブラリには、Application Development Framework(ADF)、JDBC用のOracleライブラリ、JSPなどのAPIサポートが含まれています。

プロジェクトでJDBCを使用するには、Oracle JDBCライブラリをプロジェクトにインポートします。同様に、JSPテクノロジを使用するには、JSPランタイム・ライブラリをインポートします。

3.3.4.1 Oracle JDBCライブラリの概要

Oracle JDBCライブラリの主要なパッケージは、次のとおりです。

- oracle.jdbc: oracle.jdbcパッケージのインタフェースは、java.sqlパッケージのインタフェースに対するOracleの拡張機能を定義します。これらの拡張機能によって、Oracle SQL形式のデータおよびその他のOracle固有の機能(Oracleのパフォーマンス拡張など)にアクセスできます。

- oracle.sql: oracle.sqlパッケージは、SQL形式のデータへの直接アクセスをサポートします。このパッケージは、主に、SQLデータへのJavaマッピングを提供するクラスとそれらのサポート・クラスによって構成されます。

- oracle.jdbc.pool: このパッケージには、データベースへの接続を取得するために使用されるOracleDataSourceクラスが含まれています。オーバーロードされたgetConnectionメソッドによって、データベースへの物理接続が返されます。

3.3.4.2 JSPランタイム・ライブラリの概要

このライブラリには、JDeveloperに付属のOracle WebLogicサーバーでJSPファイルを解析して実行するために必要なクラスおよびタグ・ライブラリが含まれています。

3.3.5 JDBCおよびJSPライブラリの追加

プロジェクトにライブラリを含めるには、次の手順を実行します。

1. アプリケーション・ナビゲータでViewプロジェクトをダブルクリックして、「プロジェクト・プロパティ」ダイアログ・ボックスを表示します。

2. 「ライブラリとクラスパス」をクリックし、「ライブラリの追加」をクリックします。「ライブラリの追加」 ダイアログ・ボックスが表示され、Java 2 Platform, Standard Edition(J2SE)バージョンの選択可能なライブラリのリストが表示されます。

3. 「ライブラリの追加」ダイアログ・ボックスで、Extensionフォルダ内のライブラリのリストをスクロールします。「JSP Runtime」ライブラリを選択し、「OK」をクリックして、プロジェクトの選択されたライブラリのリストに追加します。同様に、Oracle JDBCライブラリを追加します。図3-6に、Viewプロジェクトに追加したOracle JDBCライブラリを示します。

図3-6 ライブラリのインポート

4. 「OK」をクリックします。

3.3.6 JDBCパッケージのインポート

JavaアプリケーションでJDBCを使用するには、次のJDBCパッケージをインポートします。

1. DataHandler.javaクラスがJavaソース・エディタで開かれていない場合は、アプリケーション・ナビゲータで、Viewプロジェクト、「アプリケーション・ソース」および自分のパッケージ(「hr」)を開き、「DataHandler.java」をダブルクリックします。

2. 生成されたパッケージ宣言の最後で、新しい行に、例3-3に示すとおりimport文を入力します。

例3-3 Javaアプリケーションでのパッケージのインポート

package hr;
import java.sql.Connection;
import oracle.jdbc.pool.OracleDataSource;

3.3.7 接続関連の変数の宣言

接続情報は、接続変数(接続URL、ユーザー名および対応するパスワード)を使用して接続メソッドに渡されます。

JDeveloperのJavaソース・エディタを使用して、DataHandler.javaクラスを次のように編集します。

1. DataHandlerコンストラクタの後に行を追加し、3つの接続変数を次のように宣言します。

String jdbcUrl = null;
String userid = null;
String password = null;

これらの変数は、ユーザーがログイン時に入力した値をアプリケーションで保持し、ユーザーを認証してデータベースへの接続を作成するために使用されます。jdbcUrl変数は、接続するデータベースのURLを保持するために使用されます。useridおよびpassword変数は、ユーザーを認証し、セッションで使用されるスキーマを識別するために使用されます。

注意:
ログイン変数は、アプリケーションを保護するためにnullに設定されています。この時点では、アプリケーション・ログイン機能はまだアプリケーションに組み込まれていません。そのため、ログイン機能が組み込まれるまでの間にアプリケーションをテストするため、ログイン変数の値を次のように設定できます。
データベースの接続文字列に、jdbcUrl変数を設定します。

String jdbcUrl = "jdbc:oracle:thin:@localhost:1521:ORACLE";

変数useridおよびpasswordを次のようにhrに設定します。

String userid = "hr";
String password = "hr";

テストが終了したらすぐに、これらをnullにリセットします。

セキュリティ機能およびプラクティスの詳細は、『Oracle Databaseセキュリティ・ガイド』および使用する開発環境についてベンダーが提供するドキュメントを参照してください。

2. 新しい行で、次のように接続インスタンスを宣言します。

Connection conn;

これで、Javaクラスには例3-4のコードが含まれます。

例3-4 接続変数と接続オブジェクトの宣言

package hr;
import java.sql.Connection;
import oracle.jdbc.pool.OracleDataSource;

public class DataHandler {
public DataHandler() {
}
String jdbcUrl = null;
String userid = null;
String password = null;
Connection conn;
}

3.3.8 接続メソッドの作成

データベースに接続するには、次のようにメソッドを作成します。

1. 接続宣言の後に次のメソッド宣言を追加します。

public void getDBConnection() throws SQLException

Javaコード・インサイト機能によって、SQLExceptionエラー処理パッケージのインポートを促すメッセージが表示されます。[Alt]キーを押しながら[Enter]キーを押してインポートします。import java.sql.SQLException文がインポート・パッケージのリストに追加されます。

2. 同じ行の最後で、開きカッコ({)を追加し、[Enter]キーを押します。JDeveloperによって自動的に閉じカッコが作成され、カッコの間の新しい空の行にカーソルが置かれます。

3. 新しい行で、次のようにOracleDataSourceインスタンスを宣言します。

OracleDataSource ds;

4. 次のように入力して、新しいOracleDataSourceオブジェクトを追加します。

ds = new OracleDataSource();

5. 次のように入力を開始して、DataSourceオブジェクトのURLを設定します。

ds.setURL(jdbcUrl);

Javaコード・インサイトによって、選択可能なOracleDataSourceメソッドのリストが表示されます。リストをスクロールしてsetURL(String)メソッドを選択し、[Enter]キーを押してコードに挿入します。このファンクションのカッコ内で、arg0のかわりにjdbcUrlと入力します。

図3-7に、JDeveloperのJavaコード・インサイト機能がコードの挿入にどのように役立つかを示します。

図3-7 Javaコード・インサイト

6. 次の行で、次のように入力します。

conn = ds.getConnection(userid,password);

通常、Javaコード・インサイトによってdsのメソッドのリストが表示されます。今回は、getConnection(String,String)を選択します。カッコ内に、userid,passwordと入力します。行の最後にセミコロン(;)を付けます。

コードは、例3-5のコードのようになります。

例3-5 データベースに接続するメソッドの追加

package hr;
import java.sql.Connection;
import java.sql.SQLException;

import oracle.jdbc.pool.OracleDataSource;

public class DataHandler {
public DataHandler() {
}
String jdbcUrl = null;
String userid = null;
String password = null;
Connection conn;
public void getDBConnection() throws SQLException{
OracleDataSource ds;
ds = new OracleDataSource();
ds.setURL(jdbcUrl);
conn=ds.getConnection(userid,password);

}
}

7. クラスをコンパイルして、構文エラーがないことを確認します。このことを行うには、Javaソース・エディタで右クリックし、ショートカット・メニューで「メイク」を選択します。Javaソース・エディタ・ウィンドウの下のログ・ウィンドウに、「コンパイルが成功しました」メッセージが表示されます。

4 データの問合せおよび表示

この章では、データベースを問い合せる機能およびコードをDataHandler.javaファイルに追加します。この章は次の項で構成されています。

- Oracle Database内のデータの問合せの概要

- Javaアプリケーションからのデータの問合せ

- JSPページの作成

- JSPページへの動的コンテンツの追加: データベースの問合せ結果

- 問合せの結果セットのフィルタ

- アプリケーションへのログイン機能の追加

- JSPページのテスト

4.1 Oracle Database内のデータの問合せの概要

JavaクラスからOracle Database 12c リリース1 (12.1)を問い合せてデータを取得する手順の概要は、次のとおりです。

1. OracleDataSource.getConnectionメソッドを使用して、接続を作成します。これについては、第3章「Oracle Database 12c リリース1 (12.1)への接続」で説明しています。

2. 接続オブジェクトに対して使用可能なメソッドを使用して、SQL文を定義します。SQL問合せ文の定義には、createStatementメソッドを使用します。

3. 文に対して使用可能なメソッドを使用して、問合せを実行します。executeQueryメソッドを使用してデータベースの問合せを実行し、問合せ条件に一致する行のセットを生成します。これらの結果は、ResultSetオブジェクトに含まれます。

4. ResultSetオブジェクトを使用して、データをアプリケーション・ページに表示します。

次の項では、Javaアプリケーションからのデータベースの問合せに関する主要なJava Database Connectivity(JDBC)の概念について説明します。

- SQL文

- Statementオブジェクトの問合せメソッド

- 結果セット

4.1.1 SQL文

データベースに接続し、そのプロセスでConnectionオブジェクトを作成した後、次に、Statementオブジェクトを作成します。JDBC ConnectionオブジェクトのcreateStatementメソッドは、JDBC Statement型のオブジェクトを返します。例4-1に、Statementオブジェクトの作成方法を示します。

例4-1 Statementオブジェクトの作成

Statement stmt = conn.createStatement();

Statementオブジェクトは、アプリケーション内にコーディングできる静的なSQL問合せを実行するために使用します。

また、更新値を変更しながら、数多くの類似の問合せをデータベースに対して実行する必要がある場合は、Statementオブジェクトを拡張するOraclePreparedStatementオブジェクトを使用します。Oracle Database 12c リリース1 (12.1)でストアド・プロシージャにアクセスするには、OracleCallableStatementオブジェクトを使用します。

関連項目:

- OraclePreparedStatementの使用

- OracleCallableStatementの使用

4.1.2 Statementオブジェクトの問合せメソッド

Statementオブジェクトに埋め込まれた問合せを実行するには、executeメソッドのバリアントを使用します。このメソッドの主要なバリアントを表4-1に示します。

表4-1 java.sql.Statementの主要な問合せ実行メソッド

メソッド名

戻り型

説明

execute(String sql)

Boolean

指定されたSQL文を実行します。ブール・レスポンス(問合せが正常に実行された場合はtrue、それ以外はfalse)が戻されます。

addBatch()

void

コマンドのPreparedStatementオブジェクト・バッチにパラメータのセットを追加します。

executeBatch()

int[]

コマンドのバッチをデータベースに送信して実行し、すべてのコマンドが正常に実行された場合は、更新件数の配列を戻します。

executeQuery(String sql)

ResultSet

指定されたSQL文を実行します。単一のResultSetオブジェクトが戻されます。

executeUpdate(String sql)

int

指定されたSQL文を実行します。INSERT、UPDATEまたはDELETE文あるいは何も戻さないSQL文(SQL DDL文など)の場合があります。

関連項目:
http://www.oracle.com/technetwork/java/javase/documentation/api-jsp-136079.html

4.1.3 結果セット

ResultSetオブジェクトには、データベースの結果セットを表すデータの表が含まれます。この表は、データベースを問い合せる文を実行することによって生成されます。

カーソルが、ResultSetオブジェクト内のデータの現在の行を示します。最初、カーソルは最初の行の前に置かれています。ResultSetオブジェクトのnextメソッドを使用して、カーソルを結果セット内の次の行に移動します。ResultSetオブジェクト内に行がなくなると、falseが戻されます。通常、ResultSetオブジェクトの内容は、ループ内でfalseが戻されるまでnextメソッドを使用して読み取られます。

ResultSetインタフェースには、現在の行から列の値を取得するためのアクセッサ・メソッド(getBoolean、getLong、getIntなど)があります。値は、列の索引番号または列の名前を使用して取得できます。

デフォルトでは、同時に開くことができるのは、Statementオブジェクトごとに1つのResultSetオブジェクトのみです。そのため、複数のResultSetオブジェクトからデータを読み取るには、複数のStatementオブジェクトを使用する必要があります。ResultSetオブジェクトを生成したStatementオブジェクトが閉じられた場合、再実行された場合または複数の一連の結果から次の結果を取得するために使用された場合、そのResultSetオブジェクトは自動的に閉じられます。

関連項目:

- 結果セットとその機能の詳細は、『Oracle Database JDBC開発者ガイド』を参照してください。

4.1.3.1 ResultSetオブジェクトの機能

スクロール可能性とは、結果セット内を前後に移動できることをいいます。また、相対位置指定や絶対位置指定によって、結果セット内の任意の位置に移動することもできます。相対位置指定では、現在の行から、指定した行数を前後に移動できます。絶対位置指定では、結果セットの最初または最後から数えて、指定した行番号に移動できます。

スクロール可能または位置指定可能な結果セットを作成するときに、更新検出も指定する必要があります。この機能は、結果セットの外部から基礎となるデータベースに対して行われた変更を検出して示す結果セットの機能のことです。更新検出結果セットでは、結果セットが開かれているときにデータベースに対して行われた変更を知ることができ、基礎となるデータの動的ビューを利用できます。結果セット内の行の基礎となる列の値に対する変更を把握できます。更新可能性とは、結果セット内のデータを更新し、変更をデータベースにコピーできることをいいます。これには、結果セットへの新しい行の挿入や既存の行の削除も含まれます。結果セットは更新可能、または読取り専用です。

4.1.3.2 結果セットのオブジェクト・タイプのまとめ

スクロール可能性と更新検出は、更新可能性とは無関係であり、3つの結果セット・タイプと2つの同時実行性タイプの組合せで、次の6つの結果セット・カテゴリができます。

- 転送専用/読取り専用

- 転送専用/更新可能

- スクロール-更新検出/読取り専用

- スクロール-更新検出/更新可能

- スクロール-非更新検出/読取り専用

- スクロール-非更新検出/更新可能

例4-2に、スクロール-更新検出および読取り専用のResultSetオブジェクトを宣言する方法を示します。

例4-2 スクロール-更新検出、読取り専用のResultSetオブジェクトの宣言

stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

注意:
転送専用の更新可能結果セットでは、ResultSetオブジェクト内の特定の行に位置指定することを想定していません。nextメソッドの使用による行の反復中にのみ、それらの行を更新できます。

4.2 Javaアプリケーションからのデータの問合せ

この項では、JDeveloperを使用してOracle Database 12c リリース1 (12.1)内のデータを問い合せるJavaクラスを作成する方法について、次の項で説明します。

- JDeveloperでのデータを問い合せるメソッドの作成

- 接続メソッドおよび問合せメソッドのテスト

4.2.1 JDeveloperでのデータを問い合せるメソッドの作成

次の手順では、簡単な問合せメソッドをDataHandler.javaクラスに追加する方法について説明します。JDeveloper統合開発環境(IDE)でDataHandler.javaが開かれていない場合は、アプリケーション・ナビゲータでDataHandler.javaファイルをダブルクリックして、Javaソース・エディタに表示します。

1. DataHandlerクラスで、StatementおよびResultSet JDBCクラスを使用するために、次のimport文を既存のimport文の後に追加します。

import java.sql.Statement;
import java.sql.ResultSet;

2. connection宣言の後、次のようにStatement、ResultSetおよびStringオブジェクトの変数を宣言します。

Statement stmt;
ResultSet rset;
String query;
String sqlString;

3. データベースから従業員情報を取得するgetAllEmployeesという名前のメソッドを作成します。メソッドのシグネチャを入力します。

public ResultSet getAllEmployees() throws SQLException{

4. [Enter]キーを押して、メソッドの閉じカッコ、およびメソッド・コードの入力を開始する新しい行を挿入します。

5. 以前に作成したgetDBConnectionメソッドをコールします。

getDBConnection();

6. getDBConnectionメソッドのコール後、ConnectionインスタンスのcreateStatementメソッドを使用して、SQL文を実行するコンテキストを指定し、ResultSet型を定義します。次のコードのとおり、読取り専用、スクロール-更新検出ResultSet型を指定します。

stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

Javaコード・インサイト機能によって、文の構文が正しいことを確認できます。

7. 問合せを定義し、トレース・メッセージを出力します。次のコードは、Employees表内のすべての行と列を返す簡単な問合せを使用しています。この表では、データが従業員IDで順序付けされています。

query = "SELECT * FROM Employees ORDER BY employee_id";
System.out.println("\nExecuting query: " + query);

8. 次のように、問合せを実行して結果をResultSetインスタンスに取得します。

rset = stmt.executeQuery(query);

9. ResultSetオブジェクトを戻します。

return rset;

10. 作業内容を保存します。「ファイル」メニューで、「すべて保存」を選択します。

getAllEmployeesメソッドのコードは、例4-3に示すようになります。

例4-3 Connection、Statement、QueryおよびResultSetオブジェクトの使用

public ResultSet getAllEmployees() throws SQLException{
getDBConnection();
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
query = "SELECT * FROM Employees ORDER BY employee_id";
System.out.println("\nExecuting query: " + query);
rset = stmt.executeQuery(query);
return rset;
}

4.2.2 接続メソッドおよび問合せメソッドのテスト

次の手順では、簡単なJavaクラスを作成し、DataHandler.javaクラスのメソッドをテストします。この段階でアプリケーションをテストするため、一時的にjdbcUrl変数の値をデータベースの接続文字列に設定し、useridおよびpassword変数の値をHRスキーマへのアクセスに必要な値に設定します。

1. アプリケーション・ナビゲータから、Javaビジュアル・エディタでDataHandler.javaクラスを開きます。

2. 次のように、HRスキーマに必要な値を含むように、jdbcUrl、 useridおよびpassword変数を変更します。

String jdbcUrl = "connect-string";
String userid = "HR";
String password = "hr";

connect-stringの例は、次のとおりです。

jdbc:oracle:thin:@localhost:1521:ORACLE

関連項目:
第3章の接続関連の変数の宣言

3. hrパッケージ内にJavaClientという名前の新しいJavaクラスを作成します。これをpublicクラスにし、デフォルトのコンストラクタおよびmainメソッドを生成します。mainメソッドを生成するには、「オプション属性」パネルで「mainメソッド」チェック・ボックスを選択する必要があります。
スケルトンJavaClient.javaクラスが作成され、Javaソース・エディタに表示されます。

関連項目:
Javaクラス・ファイルの作成の詳細は、第3章の「JDeveloperでのJavaクラスの作成」を参照してください。

4. ResultSetパッケージをインポートします。

import java.sql.ResultSet;

5. mainメソッド宣言で、次のように例外処理を追加します。

public static void main(String[] args) throws Exception{

6. デフォルトで作成されたJavaClientオブジェクトをDataHandlerオブジェクトで置き換えます。mainメソッド内で次の行を探します。

JavaClient javaClient = new JavaClient();

これを次のように置き換えます。

DataHandler datahandler = new DataHandler();

7. getAllEmployees問合せの結果を保持するようにResultSetオブジェクトを定義し、結果セットの行を反復して最初の4つの列Employee Id、First Name、Last NameおよびEmailを表示します。このことを行うには、次のコードをmainメソッドに追加します。

ResultSet rset = datahandler.getAllEmployees();

while (rset.next()) {
System.out.println(rset.getInt(1) + " " +
rset.getString(2) + " " +
rset.getString(3) + " " +
rset.getString(4));
}

8. JavaClient.javaファイルをコンパイルし、コンパイル・エラーをチェックします。このことを行うには、Javaソース・エディタで右クリックし、ショートカット・メニューで「メイク」を選択します。
コンパイルでエラーがない場合は、次のメッセージがログ・ウィンドウに表示されます。

コンパイルが成功しました: 0件のエラー、0件の警告

9. JavaClient.javaファイルを実行します。このことを行うには、Javaソース・エディタのウィンドウで右クリックし、ショートカット・メニューで「実行」を選択します。

10. ログ・ウィンドウで出力を確認します。図4-1に示すようトレース・メッセージが表示され、その後、Employees表からの4つの列が表示されます。

図4-1 ログ・ウィンドウでの問合せメソッドのテスト出力

11. アプリケーションのテストが終了したら、DataHandler.javaのjdbcUrl、useridおよびpassword変数をnullに戻します。

関連項目:
接続関連の変数の宣言

4.3 JSPページの作成

HRAppアプリケーションでは、JavaServer Pages (JSP)テクノロジを使用してデータを表示します。JSPテクノロジによって、サーバーおよびプラットフォームに依存しない動的なWebコンテンツを簡単かつ迅速に作成できます。JSPページには、.jsp拡張子が付きます。この拡張子によって、ページをJSPコンテナで処理する必要があることがWebサーバーに指定されます。JSPコンテナによって、JSPタグおよびスクリプトレットが解析され、必要なコンテンツが生成され、結果がHTMLまたはXMLページとしてクライアントに戻されます。

JSPページを開発するには、次の項目の一部またはすべてを使用します。

- HTMLタグ。動的に生成されるWebページを設計および書式設定します。

- 標準JSPタグまたはJavaベースのスクリプトレット。ページ上に動的なコンテンツを生成する他のコンポーネントを呼び出します。

- カスタム・タグ・ライブラリのJSPタグ。ページ上に動的なコンテンツを生成します。

関連項目:

http://www.oracle.com/technetwork/java/javaee/jsp/index.html

この項では、このマニュアルのアプリケーションのJSPページを作成する方法について説明します。

- ページ表示の概要

- 簡単なJSPページの作成

- JSPページへの静的コンテンツの追加

- JSPページへのスタイルシートの追加

4.3.1 ページ表示の概要

JSPページでは、次の操作を実行できます。

- データを表示します。

- 従業員の追加および従業員データの編集を行うユーザーが入力した入力データを保持します。

- ユーザー資格証明の検証およびデータベース内の従業員レコードの追加、更新および削除のアクションを処理するために必要なコードを保持します。

JSPページはユーザーに対してHTMLまたはXMLとして表示されます。そのため、静的HTMLまたはXMLページの場合と同じようにデータの表示を制御できます。ページのタイトルを表示するときにヘッダーで指定するtitleタグなど、標準のHTMLタグを使用してページの書式を設定できます。

ページ上の見出し、表、リストなどの項目にHTMLタグを使用します。スタイルシートを使用して項目の表示を定義することもできます。JDeveloperを使用してアプリケーションを開発する場合、リストからスタイルを選択できます。

次の項では、サンプル・アプリケーションのJSPページで使用される主な要素について説明します。

- JSPタグ

- スクリプトレット

- HTMLタグ

- HTMLフォーム

4.3.1.1 JSPタグ

このマニュアルのサンプル・アプリケーションでは、JSPタグが使用されています。単一の従業員レコードを保持するために使用されるアプリケーション・メソッドとJavaBeanを保持するJavaクラスを初期化するため、およびアプリケーション内の同じページまたは別のページにユーザーを転送するためです。

ページでは、jsp:useBeanタグを使用して、アプリケーションに必要なすべてのメソッドを含むクラスを初期化し、jsp:forwardタグを使用して、指定されたページにユーザーを転送します。JSPタグのコンポーネント・パレットから必要なタグをドラッグし、表示された対応するダイアログ・ボックスでタグのプロパティを入力できます。

4.3.1.2 スクリプトレット

スクリプトレットは、データベースに対して作用するJavaメソッドを実行する場合や、JSPページでその他の処理を実行する場合に使用します。scriptletタグ・コンポーネントをコンポーネント・パレットからページにドラッグ・アンド・ドロップすると、スクリプトレット・コードを入力する準備が整います。JDeveloperでは、スクリプトレットのコードはスクリプトレット・ソース・エディタ・ダイアログ・ボックスに入力します。

このアプリケーションでは、様々なタスクでスクリプトレットを使用します。たとえば、あるスクリプトレットがコールするDataHandlerメソッドは、Employees表内のすべての従業員が含まれているResultSetオブジェクトを返します。このオブジェクトを使用してJSPページにデータを表示できます。同じResultSetオブジェクトを反復処理して表の行の各項目を表示するためにスクリプトレットを使用する例もあります。

4.3.1.3 HTMLタグ

通常HTMLタグは、見出しや表など、ユーザー・インタフェースの非動的部分のレイアウトや表示に使用されます。JDeveloperでは、「表」コンポーネントをコンポーネント・パレットからページにドラッグ・アンド・ドロップできます。表の列数と行数を指定すると、すべてのtableタグが自動的に作成されます。

4.3.1.4 HTMLフォーム

HTMLフォームは、Webページ上で、ユーザーとの相互作用またはユーザーからの情報の収集に使用されます。FORM要素は、ページ上のコントロールのコンテナとして機能し、フォーム入力の処理に使用されるメソッドを指定します。

表示する従業員を選択するフィルタ・コントロールの場合、employees.jspページ自体がフォームを処理します。ログイン、挿入、編集および削除処理の場合、これらのフォームを処理するために追加のJSPページが作成されます。このアプリケーションのJSPページの相互関係については、図1-2を参照してください。

JSPページでフォームを追加するには、HTMLタグのコンポーネント・パレットからフォームを選択します。ページのフォーム・コンポーネントの外側またはフォームが含まれていないページでコントロールを追加しようとすると、JDeveloperによって、そのコントロールを格納するフォーム・コンポーネントを追加するように求められます。

4.3.2 簡単なJSPページの作成

次の手順では、簡単なJSPページを作成する方法について説明します。

1. アプリケーション・ナビゲータで、Viewプロジェクトを右クリックし、ショートカット・メニューで「新規」を選択します。

2. 「新規ギャラリ」で、「すべてのテクノロジ」タブを選択します。

3. 「カテゴリ」リストで「Web層」ノードを開き、「JSP」を選択します。

4. 「項目」リストで、「JSP」を選択し、「OK」をクリックします。

図4-2 JSPページの作成

「JSPの作成」ダイアログ・ボックスが表示されます。

5. 「JSPの作成」ダイアログ・ボックスで、「ファイル名」テキスト・ボックスにemployees.jspと入力し、「OK」をクリックします。JSP/HTMLビジュアル・エディタに新しいページが開き、テキストおよびコンポーネントをWebページに追加できるようになります。

4.3.3 JSPページへの静的コンテンツの追加

JDeveloperには、JSP/HTMLビジュアル・エディタの右側に、コンポーネント・パレットとプロパティ・インスペクタがあります。ページ下部の「設計」タブの隣にあるソース・エディタタブをクリックして、JSPソース・エディタを使用することもできます。コンポーネント・パレットではコンポーネントをページに追加でき、プロパティ・インスペクタではコンポーネントのプロパティを設定できます。図4-3に、ビジュアル・エディタの空白ページを示します。

図4-3 JDeveloperのビジュアル・ソース・エディタでのJSPページへのコンテンツの追加

次の手順では、employees.jspページにテキストを追加する方法について説明します。ビジュアル・エディタを使用してJSPを変更します。ビジュアル・エディタはWYSIWYGエディタのようなものであり、これを使用してコンテンツを変更できます。

1. employees.jspがビジュアル・エディタで開かれている状態で、ページの一番上の行に、AnyCo Corporation: HR Applicationと入力します。ページの一番上にある左側のスタイルのリストから、Heading 2を選択します。

図4-4 JSPの書式設定

2. 追加した見出しにカーソルを置いたまま、「設計」メニューから「位置」を選択し、次に、「中央揃え」を選択します。

3. 同様に、新しい行でEmployee Dataと入力し、Heading 3スタイルで書式設定します。ページの左側に配置します。

4.3.4 JSPページへのスタイルシートの追加

見出し、テキストなどの要素がWebページで使用されるフォントや色などの表示特性と調和して書式設定されるように、スタイルシート参照をページに追加できます。次のように、スタイルシートをページに追加できます。

1. employees.jspがビジュアル・エディタで開かれている状態で、コンポーネント・パレットの右上にあるリスト矢印をクリックして、「CSS」を選択します。

図4-5 JSPのCSSファイルの選択

2. 「CSS」リストから、「JDeveloper」をページにドラッグします。「JDeveloper」をページにドラッグ・アンド・ドロップすると、jdeveloper.cssファイルを保存するよう要求されます。ファイルをJSPファイルと同じ場所に保存します。CSSファイルを保存すると、ページがJDeveloperスタイルで書式設定されます。図4-6に、前述の項でコンテンツが追加されたJSPページと、そのページに適用されたJDeveloperスタイルシートを示します。

図4-6 JSPページへの静的コンテンツの追加

注意:
JDeveloperバージョン10.1.3では、JSPの作成ウィザードでのJSPページの作成中に、スタイルシートをJSPページに関連付けることができます。ただし、ページにドラッグ・アンド・ドロップするのではなく、JSPページに適用するスタイルシートを参照して見つける必要がある点のみ異なります。

4.4 JSPページへの動的コンテンツの追加: データベースの問合せ結果

この項では、次の項目について説明します。

- DataHandlerクラスを初期化するJSP useBeanタグの追加

- 結果セットの作成

- 結果セットを表示する表のJSPページへの追加

4.4.1 DataHandlerクラスを初期化するJSP useBeanタグの追加

jsp:useBeanタグによって、ページで実行されるメソッドを保持するクラスが識別および初期化されます。jsp:useBeanタグを追加するには、次の手順を実行します。

1. ビジュアル・エディタでemployees.jspを開きます。

2. コンポーネント・パレットで、コンポーネントの「JSP」セットを選択します。リストをスクロールし、「UseBean」をページにドラッグ・アンド・ドロップします。「UseBeanの挿入」ダイアログ・ボックスが表示されます。

3. 「UseBeanの挿入」ダイアログ・ボックスで、「ID」にempsbeanと入力します。「クラス」で、「参照」をクリックします。「クラス・ブラウザ」ダイアログ・ボックスが表示されます。「クラス名を一致」テキスト・ボックスにhr.DataHandlerと入力します。「OK」をクリックします。「タイプ」と「Bean名」フィールドは空白にしたまま、「有効範囲」を「セッション」に変更します。

4. 「OK」をクリックして、ページにタグを作成します。

図4-7に、employees.jspページのuseBeanタグの表示を示します。

図4-7 employees.jspファイルでのuseBeanの表示

JSPの設計ビューにUseBeanタグが表示されない場合は、「ツール」メニューから「プリファレンス」に移動し、図4-8のように「非表示JSP要素を表示」オプションを選択します。

図4-8 JSP/HTMLのビジュアル・エディタ・オプションを選択するための「プリファレンス」ウィンドウ

4.4.2 結果セットの作成

次の手順では、スクリプト要素をページに追加してgetAllEmployeesメソッドをコールし、戻された結果セット・データを保持する方法について説明します。この問合せは、DataHandlerクラスで定義され、jsp:useBeanタグを使用してページで初期化されます。

1. ビジュアル・エディタでemployees.jspページを開きます。コンポーネント・パレットの「JSP」部分で、「スクリプトレット」を選択して、JSPページのUseBeanの表示の横にドラッグ・アンド・ドロップします。

2. 「スクリプトレットの挿入」ダイアログ・ボックスで、次のコード行を入力します。このコード行はgetAllEmployeesメソッドをコールし、ResultSetオブジェクトを生成します。

ResultSet rset;
rset = empsbean.getAllEmployees();

「OK」をクリックします。スクリプトレットの表示は、図4-9に示すようにページに表示されます。

図4-9 JSPページでのスクリプトレットの表示

3. ビジュアル・エディタの一番下にある「ソース」タブを選択して、ページに対してこれまでに作成されたコードを表示します。ResultSetの下の波線は、コードにエラーがあることを示しています。

4. 左側の構造ウィンドウでも、ページにエラーがあることを示しています。ウィンドウの最上部までスクロールして、「JSPエラー」ノードを開きます。図4-10に、コード内のエラーが構造ウィンドウでどのように表示されるかを示します。

図4-10 構造ウィンドウでのエラーの表示

5. ResultSetパッケージをインポートする必要があります。これを行うには、「構造」ウィンドウの「ページ」ノードをクリックし、メイン編集領域の左側にある「プロパティ・インスペクタ」にページのプロパティを表示します。

6. インポートプロパティの右側にある空のボックス内を右クリックし、「編集」をクリックします。図4-11のように、プロパティの編集: インポートダイアログ・ボックスが表示されます。

図4-11 JDeveloperでのパッケージのインポート

7. 「階層」タブを選択し、「java」ノード、「sql」ノードの順に開き、ResultSetを選択します。「OK」をクリックします。

8. 「ソース」タブで、import文がページのコードに追加されているかどうかを確認します。構造ウィンドウのリストからエラーが消えています。次の項に進む前に、「設計」タブを選択してこのページの設計ビューに戻ります。

4.4.3 結果セットを表示する表のJSPページへの追加

次の手順では、JSPページに表を追加して、getAllEmployees問合せの結果を表示する方法について説明します。

1. employees.jspページがビジュアル・エディタで開かれていない場合は、アプリケーション・ナビゲータでダブルクリックして開き、「設計」タブで作業します。employees.jspファイルがビジュアル・エディタで開かれている状態で、カーソルをスクリプトレットの後に置き、図4-12のように、コンポーネント・パレットの「HTML Common」ページから、「表」コンポーネントを選択します。

図4-12 コンポーネント・パレット内の一般的なHTMLコンポーネント

2. 「表の挿入」ダイアログ・ボックスで、1行および6列を指定します。すべてのレイアウト・プロパティをデフォルトのままにします。「OK」をクリックします。

3. ページに表示された表の行で、各列の見出しとしてFirst Name、Last Name、Email、Job、PhoneおよびSalaryと入力します。Heading 4を使用して列名の書式を設定します。

4. 表内の各列に対して返される値を表示するための、出力用スクリプト要素を追加します。これを行うには、次のように表を選択します。表の上部境界線上にカーソルを移動し、カーソル・イメージが表のイメージに変わったところでクリックします。JSPコンポーネント・パレットで、スクリプトレットを選択します。(表にドラッグしなくても、スクリプトレットが自動的に挿入されます。)

5. 「スクリプトレットの挿入」ダイアログ・ボックスで、次のコード行を入力します。

while (rset.next ())
{
out.println("<tr>");
out.println("<td>" +
rset.getString("first_name") + "</td><td> " +
rset.getString("last_name") + "</td><td> " +
rset.getString("email") + "</td><td> " +
rset.getString("job_id") + "</td><td>" +
rset.getString("phone_number") + "</td><td>" +
rset.getDouble("salary") + "</td>");
out.println("</tr>");
}

6. 「OK」をクリックします。

図4-13に、作成されたJSPページを示します。

図4-13 JSPページでの表

4.5 問合せの結果セットのフィルタ

特定のパラメータまたは条件で問合せの結果をフィルタできます。アプリケーションのユーザーがデータ・フィルタをカスタマイズできるようにすることもできます。このマニュアルで作成するサンプル・アプリケーションでは、次の手順で問合せ結果をフィルタします。

1. 必要なフィルタ・セットの判別
問合せフィールドにフィルタ基準(この場合、検索する名前の一部)を入力することにより、ユーザーは表示する従業員レコードのセットを指定できます。employees.jspページは、フォーム・コントロールをとおしてこの入力を受け付け処理します。

2. 問合せのResultSetを戻すメソッドの作成
SQL問合せ文の作成に、ユーザー入力文字列を使用します。この文によって、ユーザーが入力した文字列が名前に含まれるすべての従業員が選択されます。問合せでは、姓と名の両方でこの文字列が検索されます。

3. 問合せの結果の表示
このことは、employees.jspページにコードを追加して、フィルタされる問合せを実行するメソッドを使用することによって実行されます。

この項では、問合せデータのフィルタについて、次の項で説明します。

- 結果をフィルタするJavaメソッドの作成

- 問合せフィルタ・メソッドのテスト

- JSPページへのフィルタ・コントロールの追加

- JSPページでのフィルタされたデータの表示

4.5.1 結果をフィルタするJavaメソッドの作成

次の手順では、getEmployeesByNameメソッドを作成する方法について説明します。このメソッドによって、ユーザーは従業員を姓または名でフィルタできます。

1. アプリケーション・ナビゲータから、Javaビジュアル・エディタでDataHandler.javaクラスを開きます。

2. getAllEmployeesメソッドの後に、次のようにgetEmployeesByNameメソッドを宣言します。

public ResultSet getEmployeesByName(String name) throws SQLException {

}

3. メソッド本体で次のコードを追加し、検索ヒット数が増えるように、名前を大文字に変換します。

name = name.toUpperCase();

4. データベースに接続するメソッドをコールします。

getDBConnection();

5. ResultSetタイプを指定し、問合せを作成します。

stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
query =
"SELECT * FROM Employees WHERE UPPER(first_name) LIKE \'%" + name + "%\'" +
" OR UPPER(last_name) LIKE \'%" + name + "%\' ORDER BY employee_id";

6. トレース・メッセージを出力します。

System.out.println("\nExecuting query: " + query);

7. 問合せを実行し、以前と同様に結果セットを戻します。

rset = stmt.executeQuery(query);
return rset;

8. ファイルを保存し、コンパイルしてコンパイル・エラーがないことを確認します。

4.5.2 問合せフィルタ・メソッドのテスト

「接続メソッドおよび問合せメソッドのテスト」で作成したJavaClient.javaクラスを使用して、getEmployeesByNameメソッドをテストできます。次の手順で説明するように、getEmployeesByNameメソッドを追加して問合せ結果を表示する必要があります。

1. Javaソース・エディタでJavaClient.javaクラスを開きます。

2. 結果セットにgetAllEmployees問合せからの結果が表示された後、次のように条件問合せの結果セットを定義します。

rset = datahandler.getEmployeesByName("King");

System.out.println("\nResults from query: ");

while (rset.next()) {
System.out.println(rset.getInt(1) + " " +
rset.getString(2) + " " +
rset.getString(3) + " " +
rset.getString(4));
}

3. この段階でアプリケーションをテストするため、一時的にDataHandlerクラスのjdbcUrl、useridおよびpassword変数値を調節して、HRスキーマに必要な値を指定します。ファイルを保存し、コンパイルして構文エラーをチェックします。

注意:
テスト後、userid、passwordおよびjdbcUrlの値をnullに戻してください。詳細は、「接続関連の変数の宣言」を参照してください。

4. コードをテスト実行するには、Javaソース・エディタで右クリックし、ショートカット・メニューで「実行」を選択します。ログ・ウィンドウには、最初にgetAllEmployeesメソッドの結果が表示され、次に、getEmployeesByName("xxx")問合せの結果が表示されます。ここでは、xxxを「King」に設定して、フィルタ機能をテストしています。実際の操作では、このパラメータはアプリケーションのユーザーが指定した値に設定され、検索がフィルタされます。

4.5.3 JSPページへのフィルタ・コントロールの追加

フィルタ基準を受け入れてフィルタ結果を表示するには、employees.jspページを変更する必要があります。次の手順では、ユーザーからの入力を受け入れるemployees.jspページにフォーム要素およびコントロールを追加して、従業員を名前でフィルタします。

1. employees.jspページがビジュアル・エディタに表示されている状態で、カーソルをuseBeanタグとスクリプトレットの間に置きます。

2. コンポーネント・パレットの「HTML Forms」ページで、「フォーム」を選択します。

3. 「フォームの挿入」ダイアログ・ボックスで、「アクション」フィールドの下矢印を使用して、employees.jspを選択します。他のフィールドは空のままにし、「OK」をクリックします。
フォームがビジュアル・エディタのページに表示され、点線の四角形で表されます。

4. コンポーネント・パレットの「HTML Forms」ページで、「テキスト・フィールド」にスクロールします。それを選択し、フォーム・コンポーネント内にドラッグ・アンド・ドロップします。「テキスト・フィールドの挿入」ダイアログ・ボックスで、「名前」フィールドの値としてqueryと入力し、「OK」をクリックします。フォーム内にテキスト・フィールド・ボックスが表示されます。ユーザーはこのフィールドにフィルタ基準を入力できます。

5. テキスト・フィールドの左にカーソルを置き、次のテキストを追加します。
Filter by Employee Name:

6. コンポーネント・パレットの「HTML Forms」ページで、「Submit Button」にスクロールします。それを選択し、フォーム・コンポーネント内のテキスト・フィールドの右にドラッグします。

7. 「送信ボタンの挿入」ダイアログ・ボックスで、「名前」フィールドは空のままで「値」フィールドの値としてFilterと入力し、「OK」をクリックします。
図4-14に、employees.jspファイルのこれらのHTMLフォーム・コンポーネントを示します。

図4-14 JSPページ内のHTMLフォーム・コンポーネント

4.5.4 JSPページでのフィルタされたデータの表示

前の項で、ユーザー入力を受け入れるテキスト・フィールド・コンポーネントをJSPページに作成しました。このテキスト・フィールドで、ユーザーは従業員の名前をフィルタするために使用する文字列を指定できます。また、送信ボタンも追加しました。

次の手順では、employees.javaファイル内のスクリプトレットにコードを追加して、getEmployeesByNameメソッドを使用できるようにします。このメソッドは、結果をフィルタするための値をユーザーが送信した場合にのみ使用されます。このフィルタ基準を指定しない場合は、getAllEmployeesメソッドが使用されます。

1. ビジュアル・エディタでemployees.jspファイルを開きます。

2. ページのスクリプトレット・タグ(表内ではありません)をダブルクリックして、「プロパティ」ダイアログ・ボックスを開きます。次のようにコードを変更します。

ResultSet rset;
String query = request.getParameter("query");
if (query != null)
rset = empsbean.getEmployeesByName(query);
else
rset = empsbean.getAllEmployees();

図4-15に、「スクリプトレットのプロパティ」ダイアログ・ボックスを使用してコードを変更する方法を示します。

図4-15 「スクリプトレットのプロパティ」ダイアログ・ボックスの使用

3. 「OK」をクリックします。

4. ファイルを保存します。

4.6 アプリケーションへのログイン機能の追加

サンプル・アプリケーションで使用されるログイン機能は、アプリケーション管理セキュリティの簡単な例です。完全なJava EEセキュリティ実装ではありませんが、サンプル・アプリケーションでの例として使用されます。

この簡単なログイン機能を実装するには、次の処理を実行する必要があります。

- ユーザーを認証するメソッドの作成

- ログイン・ページの作成

- 失敗したログインのエラー・レポートの準備

- ログイン・インタフェースの作成

- ログイン操作を処理するJSPページの作成

4.6.1 ユーザーを認証するメソッドの作成

次の手順では、DataHandler.javaクラスにメソッドを作成します。このメソッドでは、useridおよびpasswordに対して入力された値と、データベース・スキーマが必要とする値が一致するかどうかをチェックすることによってユーザーを認証します。

1. ソース・エディタでDataHandler.javaクラスを開きます。

2. ユーザーが入力したuserid、passwordおよびhostの値が有効かどうかをチェックするauthenticateUserという名前のメソッドを作成します。

public boolean authenticateUser(String jdbcUrl, String userid, String password,
HttpSession session) throws SQLException {

}

3. 波線の下線とHttpSessionのクラスをインポートする必要があるというメッセージが表示されます。[Alt]キーを押しながら[Enter]キーを押して、javax.servlet.http.HttpSessionクラスをインポートします。

4. メソッド本体で、次のようにコールのjdbcUrl、useridおよびpassword値を現在のオブジェクトの属性に割り当てます。

this.jdbcUrl= jdbcUrl;
this.userid = userid;
this.password = password;

5. 指定された値を使用してデータベースへの接続を試行し、成功した場合は値trueを返します。これを次のようにtryブロックで囲みます。

try {
OracleDataSource ds;
ds = new OracleDataSource();
ds.setURL(jdbcUrl);
conn = ds.getConnection(userid, password);
return true;
}

関連項目:
tryおよびcatchブロックの使用の詳細は、第5章の「例外処理」を参照してください。

6. ログイン資格証明が一致しない場合を処理するには、tryブロックの後にcatchブロックを追加します。このブロックのコードでは、ログ・メッセージを出力し、エラー・メッセージを設定します。このエラー・メッセージは、ログイン試行が失敗した場合にユーザーに表示されます。jdbcUrl、useridおよびpassword変数はnullに戻され、メソッドは値falseを戻します。このことを行うには、次のコードを入力します。

catch ( SQLException ex )  {
System.out.println("Invalid user credentials");
session.setAttribute("loginerrormsg", "Invalid Login. Try Again...");
this.jdbcUrl = null;
this.userid = null;
this.password = null;
return false;
}

例4-4に、完成したコードを示します。

例4-4 ユーザー検証の実装

public boolean authenticateUser(String jdbcUrl, String userid, String password,
HttpSession session) throws SQLException {

this.jdbcUrl = jdbcUrl;
this.userid = userid;
this.password = password;
try {
OracleDataSource ds;
ds = new OracleDataSource();
ds.setURL(jdbcUrl);
conn = ds.getConnection(userid, password);
return true;
} catch ( SQLException ex )  {
System.out.println("Invalid user credentials");
session.setAttribute("loginerrormsg", "Invalid Login. Try Again...");
this.jdbcUrl = null;
this.userid = null;
this.password = null;
return false;
}
}

4.6.2 ログイン・ページの作成

次の手順では、login.jspページを作成します。このページで、ユーザーは作業を行うスキーマのログイン詳細を入力します。

1. Viewプロジェクトで、新しいJSPページを作成します。名前をlogin.jspに変更し、その他はすべてデフォルトをそのまま使用します。JSP/HTMLビジュアル・エディタで新しいページが開き、テキストおよびコンポーネントをWebページに追加できるようになります。

2. 図4-16のとおり、保存済のJDeveloperスタイル・シートを「プロジェクトのCSSファイル」パネルからページにドラッグ・アンド・ドロップします。

図4-16 「プロジェクトのCSSファイル」パネル

3. このページに、以前に設定したものと同じ見出しAnyCo Corporation: HR Applicationを付け、Heading 2スタイルを割り当て、ページの中央に配置します。

4. 次の行で、Application Loginと入力し、Heading 3スタイルを適用します。この見出しをページの左側に配置します。

4.6.3 失敗したログインのエラー・レポートの準備

次の手順では、ユーザー・ログインが失敗したときにエラー・メッセージを表示する機能をlogin.jspページに追加します。login.jspページで使用されるスクリプトレットおよび式によって、エラー・メッセージを保持する変数が設定されます。ユーザー・ログインが失敗した場合、接続メソッドによってセッションのメッセージが設定されます。このページではそのようなメッセージがあるかどうかをチェックし、存在する場合にはメッセージを表示します。

1. login.jspページがビジュアル・エディタで開かれている状態で、カーソルをこのページのテキストの後に置きます。次に、コンポーネント・パレットの「JSP」ページから、「スクリプトレット」要素をパレットからページにドラッグ・アンド・ドロップします。

2. 「スクリプトレットの挿入」ダイアログ・ボックスで、次のコードを入力します。

String loginerrormsg = null;
loginerrormsg = (String) session.getAttribute("loginerrormsg");
if (loginerrormsg != null) {

3. 別のスクリプトレットを同じ方法で追加し、今度は1つの閉じカッコ(})のみを「スクリプトレットの挿入」ダイアログ・ボックスで入力します。

4. 2つのスクリプトレットの間にカーソルを置き、[Enter]を押して新しい行を作成します。新しい行にHeading 4スタイルを適用します。

5. カーソルを新しい行に置いたまま、コンポーネント・パレットの「JSP」ページで、「式」をクリックします。

6. 「式の挿入」ダイアログ・ボックスで、loginerrormsgと入力します。

7. login.jspページに追加されたコードを表示するには、ビジュアル・エディタの下の「ソース」タブを選択します。コードは次のように表示されます。

<%
String loginerrormsg = null;
loginerrormsg = (String) session.getAttribute("loginerrormsg");
if (loginerrormsg != null) {
%>
<h4>
<%=  loginerrormsg %>
</h4>
<%
}
%>

次の項に進む前に、「設計」タブを選択してこのページの設計ビューに戻ります。

4.6.4 ログイン・インタフェースの作成

これらの手順では、ユーザーがログイン詳細を入力するフィールドをlogin.jspページに追加します。

1. login.jspページがビジュアル・エディタで開かれていない場合は、アプリケーション・ナビゲータでダブルクリックして開き、「設計」タブが選択されていることを確認します。

2. カーソルを2番目のスクリプトレットの後に置き、コンポーネント・パレットの「HTML Forms」ページで、「フォーム」を選択します。「フォームの挿入」ダイアログ・ボックスで、「アクション」フィールドの値としてlogin_action.jspと入力します。このファイルは、login.jspファイルでのユーザー入力を処理するために使用されます。(このページはまだ作成されていないため、リストから選択できません。)他のフィールドは空のままにし、「OK」をクリックします。
フォームがビジュアル・エディタのページに表示され、点線の四角形で表されます。

3. 表をページに追加します。フォーム内に配置します。3行および2列のレイアウトを指定し、その他のレイアウトのデフォルトはそのまま使用します。

4. 3行の最初の列に、ユーザーに表示するテキストとして次のように入力します。
User ID:

Password:

Host:

5. コンポーネント・パレットの「HTML」ページから、「テキスト・フィールド」をUser ID:セルの右のセルにドラッグします。「テキスト・フィールドの挿入」ダイアログ・ボックスで、Nameプロパティの値としてuseridと入力します。他のフィールドは空のままにし、「OK」をクリックします。

6. 同じ方法で、「テキスト・フィールド」をPassword:セルの右のセルに追加し、「名前」プロパティの値としてpasswordと入力します。同様に、「テキスト・フィールド」をHost:セルの右のセルに追加し、「名前」プロパティの値としてhostと入力します。

7. 「発行」ボタンを表の下のフォームにドラッグします。ボタンの「値」プロパティにSubmitと入力します。

4-17に示すようにlogin.jspページが表示されます。

図4-17 ログイン・ページ

4.6.5 ログイン操作を処理するJSPページの作成

次の手順では、login_action.jspページを作成します。これは、ログイン操作を処理する非表示のページです。

1. JSPページを作成し、login_action.jspという名前を付けます。JSPページのすべてのデフォルト設定をそのまま使用します。

2. ビジュアル・エディタでlogin_action.jspが開かれている状態で、ページの左上隅にある「Page Directive」をクリックして選択します。「プロパティ・インスペクタ」にPage Directiveのプロパティが表示されます。

3. インポートフィールドの隣にある下矢印をクリックします。プロパティの編集: インポートダイアログ・ボックスが表示されます。「階層」タブを選択し、「Java」および「SQL」フォルダをそれぞれ展開してからResultSetを選択します。「OK」をクリックします。

4. jsp:usebeanタグをページにドラッグします。empsbeanをIDとして入力し、hr.DataHandlerをクラスとして参照して選択します。「有効範囲」を「セッション」に設定し、「OK」をクリックします。

5. カーソルをuseBeanタグの後に置き、スクリプトレットをページに追加します。次のコードを「スクリプトレットの挿入」ダイアログ・ボックスに入力し、「OK」をクリックします。

boolean userIsValid = false;
String host = request.getParameter("host");
String userid = request.getParameter("userid");
String password = request.getParameter("password");
String jdbcUrl = "jdbc:oracle:thin:@" + host + ":1521:ORACLE";
userIsValid = empsbean.authenticateUser(jdbcUrl, userid, password, session);

6. 別のスクリプトレットを追加し、次のコードを追加します。

if (userIsValid){

7. コンポーネント・パレットの「JSP」ページで、Forwardを見つけてページにドラッグし、jsp:forwardタグをページに追加します。「forwardの挿入」ダイアログ・ボックスで、ページ*フィールドの値としてemployees.jspと入力します。

8. 別のスクリプトレットを追加し、次のコードを入力します。

} else {

9. 別のjsp:forwardタグを追加し、今度はlogin.jspに移動します。

10. 最後のスクリプトレットを追加し、閉じカッコ(})を入力します。

11. 作業内容を保存します。

login_action.jspに追加されたコードを表示するには、「ソース」タブを選択します。次のようなコードが表示されます。

<body>
<%@ page import="java.sql.ResultSet"%><jsp:useBean id="empsbean"
class="hr.DataHandler"
scope="session"/>
<%boolean userIsValid = false;
String host = request.getParameter("host");
String userid = request.getParameter("userid");
String password = request.getParameter("password");
String jdbcUrl = "jdbc:oracle:thin:@" + host + ":1521:ORACLE";
userIsValid = empsbean.authenticateUser(jdbcUrl, userid, password, session);%> <%if(userIsValid){%><jsp:forward page="employees.jsp"/>
<%if (userIsValid){%><jsp:forward page="login.jsp"/><%}%>
</body>

4.7 JSPページのテスト

ログイン・ページと従業員のフィルタをテストするには、次の手順を実行します。

1. アプリケーション・ナビゲータで、Viewプロジェクトを右クリックし、「実行」を選択します。
プロジェクトのデフォルトの実行ターゲットの指定を求められる場合があります。ここでは、実行ターゲットにlogin.jspを設定します。後でプロジェクトのプロパティを変更して、デフォルトの実行ターゲット・ページを任意のページにすることができます。

図4-18に示すように、ログイン・ページがブラウザに表示されます。

図4-18 ブラウザでのサンプル・アプリケーションのログイン・ページ

2. データベースについて次のログイン詳細を入力し、「発行」をクリックします。
User ID: HR

Password: hr

Host: localhost

図4-19に示すように、Employee.javaファイルがブラウザに表示されます。

図4-19 employee.jspでのフィルタされていない従業員データ

3. 従業員データをフィルタする文字列を入力します。たとえば、「Filter by Employee Name」フィールドにingと入力し、「Filter」をクリックします。次に示すように、フィルタされたリストが表示されます。

図4-20 employee.jspでのフィルタされている従業員データ

5 データの更新

この章では、サンプル・アプリケーションの変更方法と、ユーザーがOracle Database内のデータを編集、更新および削除できるようにするための機能の追加方法について説明します。この章は次の項で構成されています。

- JavaBeanの作成

- Javaクラスからのデータの更新

- 従業員レコードの挿入

- 従業員レコードの削除

- 例外処理

- サンプル・アプリケーションのナビゲーション

5.1 JavaBeanの作成

簡単に言うと、Beanは、プロパティ、イベントおよびメソッドを持つJavaクラスです。Beanは、プロパティごとにアクセッサ(getおよびsetメソッド)も持っています。特定の基本ルールに従っているオブジェクトは、すべてBeanといえます。Beanを作成するために拡張する必要がある特別なクラスはありません。

この章のサンプル・アプリケーションの作成手順では、単一の従業員レコードを保持するためにJavaBeanを使用します。既存レコードを編集したり、新規レコードを追加するときに、表の単一行の変更された値または新しい値を保持するコンテナとしてJavaBeanが使用され、これによりデータベースの更新に使用する行が準備されます。

Beanは従業員レコードのフィールドごとにプロパティを持ち、JDeveloperはこれらのプロパティごとにアクセッサ(getおよびsetメソッド)を作成します。次の項では、サンプル・アプリケーションのJavaBeanの作成方法について説明します。

- JDeveloperでのJavaBeanの作成

- JavaBeanのプロパティおよびメソッドの定義

5.1.1 JDeveloperでのJavaBeanの作成

Employee.javaはサンプル・アプリケーションで使用するJavaBeanで、単一の従業員レコードを保持してその内容を変更します。JavaBeanを作成するには、次の手順を実行します。

1. Viewプロジェクトを右クリックして、ショートカット・メニューから「新規」を選択します。

2. 「新規ギャラリ」で、「すべてのテクノロジ」タブを選択します。

3. 「一般」カテゴリを開いて、「一般」カテゴリの「Java」を選択します。「項目」リストから、「Bean」を選択します。「OK」をクリックします。

図5-1 Java Beanの作成

4. 「Beanの作成」ダイアログ・ボックスで、名前にEmployeeを、パッケージにhrを入力し、「拡張対象」フィールドがjava.lang.Objectに設定されていることを確認します。「OK」をクリックして、Beanを作成します。

5. ファイルを保存します。これで、Employee.javaファイルに次のコードが含まれます。

package hr;

public class Employee {
public Employee(){
}
}

5.1.2 JavaBeanのプロパティおよびメソッドの定義

JavaBeanでは、Employees表の列ごとにフィールドを1つ作成し、フィールドごとにアクセッサ・メソッド(getメソッドおよびsetメソッド)を作成する必要があります。

1. java.sql.Date(いずれかのフィールドのフィールド型)のimport文を追加します。

import java.sql.Date;

2. Employees表の列ごとに、Employeeクラスにフィールドを追加します。各フィールドはprivateで、フィールド型は次のとおりです。

private Integer employeeId;
private String firstName;
private String lastName;
private String email;
private String phoneNumber;
private Date hireDate;
private String jobId;
private Double salary;
private Double commissionPct;
private Integer departmentId;

3. ソース・エディタのページで右クリックし、ショートカット・メニューで「アクセッサの生成」を選択します。「アクセッサの生成」ダイアログ・ボックスで、トップレベルのEmployeeノードを選択します。そのノードとそのすべてのフィールドに、チェック・マークが表示されます。「OK」をクリックします。図5-2に、すべてのフィールドが選択されている「アクセッサの生成」ダイアログ・ボックスを示します。

図5-2 「アクセッサの生成」ダイアログ・ボックス

4. ファイルを保存します。これで、Employee.javaファイルに次のコードが含まれます。

例5-1 基本的なJava Beanとアクセッサ・メソッドのスケルトン・コード

package hr;
import java.sql.Date;

public class Employee {
public Employee() {
}
private Integer employeeId;
private String firstName;
private String lastName;
private String email;
private String phoneNumber;
private Date hireDate;
private String jobId;
private Double salary;
private Double commissionPct;
private Integer departmentId;

public void setEmployeeId(Integer employeeId) {
this.employeeId = employeeId;
}

public Integer getEmployeeId() {
return employeeId;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getFirstName() {
return firstName;
}
...
...
...
...
// This list has been shortened and is not comprehensive.
// The actual code contains accessor methods
// for all the fields declared in the bean.

public void setDepartmentId(Integer departmentId) {
this.departmentId = departmentId;
}

public Integer getDepartmentId() {
return departmentId;
}
}

5.2 Javaクラスからのデータの更新

Javaアプリケーションからデータベースの表に含まれる行を更新するには、次のタスクを実行する必要があります。

1. 特定の従業員行を検索するメソッドを作成します。このメソッドを使用して、特定の従業員の値を編集ページに表示します。

2. Beanから更新済の従業員データを取り出してデータベースを更新するメソッドを作成します。

3. アプリケーションのメイン・ページにある従業員データの各行に、その従業員データの編集を可能にするリンクを含めます。このリンクを使用すると、edit.jspファイルが開き、その従業員のデータが編集可能な状態で表示されます。

4. edit.jspという名前のJSPページを作成します。このページには、単一の従業員の全データを表示するフォームと表が含まれ、ユーザーはこのページを使用して値を変更できます。

5. edit.jspページのフォームを処理し、更新された値をEmployee.java Beanに書き込んで、updateEmployeeメソッドをコールするJSPページを作成します。

これらの方法については、次の項を参照してください。

- 従業員レコードを識別するメソッドの作成

- 従業員データを更新するメソッドの作成

- 更新ページにナビゲートするリンクの追加

- 従業員データを編集するJSPページの作成

- 更新アクションを処理するJSPページの作成

5.2.1 従業員レコードを識別するメソッドの作成

次の手順で作成するメソッドは、特定の従業員レコードの検索に使用します。このメソッドは、特定の従業員レコードを編集または削除する場合や、Employee.javaページでその従業員のリンクを選択した場合に使用されます。

1. DataHandlerクラスがJavaソース・エディタでまだ開いていない場合は、アプリケーション・ナビゲータでこのクラスをダブルクリックして開きます。

2. DataHandlerクラスで、更新する従業員レコードを識別するための新規メソッドを宣言します。

public Employee findEmployeeById(int id) throws SQLException {

}

3. このメソッドのボディで、selectedEmpという名前の、Employee Beanの新規インスタンスを作成します。

Employee selectedEmp = new Employee();

4. データベースに接続します。

getDBConnection();

5. Statementオブジェクトを作成し、ResultSet型を定義して問合せを作成します。デバッグに役立てるために、トレース・メッセージを追加します。

stmt =
conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
query = "SELECT * FROM Employees WHERE employee_id = " + id;
System.out.println("\nExecuting: " + query);

6. 問合せを実行し、ResultSetオブジェクトを使用して結果を格納します。

rset = stmt.executeQuery(query);

7. rsetで返された結果セットを使用し、従業員Beanのsetメソッドを使用してBeanのフィールドに移入します。

while (rset.next()) {
selectedEmp.setEmployeeId(new Integer(rset.getInt("employee_id")));
selectedEmp.setFirstName(rset.getString("first_name"));
selectedEmp.setLastName(rset.getString("last_name"));
selectedEmp.setEmail(rset.getString("email"));
selectedEmp.setPhoneNumber(rset.getString("phone_number"));
selectedEmp.setHireDate(rset.getDate("hire_date"));
selectedEmp.setSalary(new Double(rset.getDouble("salary")));
selectedEmp.setJobId(rset.getString("job_id"));
}

8. 移入されたオブジェクトを返します。

return selectedEmp;

5.2.2 従業員データを更新するメソッドの作成

次の手順では、データベース内の従業員データを更新するメソッドの作成方法について説明します。

1. DataHandlerクラスを開きます。

2. 次のように、updateEmployeeメソッドを宣言します。

public String updateEmployee(int employee_id, String first_name,
String last_name, String email,
String phone_number, String salary,
String job_id) throws SQLException {

}

3. このメソッドのボディで、選択した従業員の詳細を格納する、Employee Beanのインスタンスを作成します。

Employee oldEmployee = findEmployeeById(employee_id);

4. データベースに接続します。

getDBConnection();

5. Statementオブジェクトを作成し、前述と同様にResultSet型を指定します。

stmt =
conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);

6. 作成する必要があるSQL UPDATE文の詳細を集積するStringBufferを作成します。

StringBuffer columns = new StringBuffer( 255 );

7. 従業員レコードの各フィールドの値をユーザーが変更したかどうかをチェックし、値が変更された場合は、関連するコードをStringBufferに追加します。最初の項目以降に追加する項目には、それぞれカンマを追加して各項目を分離します。次のコードは、first_name変数が変更されたかどうかをチェックし、変更された場合はその詳細をStringBuffer内のSQLに追加し、これを使用してデータベースを更新します。

if ( first_name != null &&
!first_name.equals(oldEmployee.getFirstName() ) )
{
columns.append( "first_name = '" + first_name + "'" );
}

last_nameについては、新しい名字を追加する前に、StringBuffer内にすでになんらかの変更があるかどうかをチェックし、変更がある場合は、カンマを追加して新しい変更と以前の変更を分けます。次のコードを使用します。

if ( last_name != null &&
!last_name.equals(oldEmployee.getLastName() ) ) {
if ( columns.length() > 0 ) {
columns.append( ", " );
}
columns.append( "last_name = '" + last_name + "'" );
}

同じコード・ロジックを使用して、emailおよびphone_numberの変更をチェックします。

注意:
この手順にはコードの重要な部分のみが含まれています。図5-2に、このメソッドのすべてのコードを示します。

salaryフィールドについては、String値を取得して、次のようにStringBufferに追加します。

if ( salary != null &&
!salary.equals( oldEmployee.getSalary().toString() ) ) {
if ( columns.length() > 0 ) {
columns.append( ", " );
}
columns.append( "salary = '" + salary + "'" );

8. 変更セットが作成された後、実際に変更があったかどうか、つまり、StringBufferにデータが含まれているかどうかをチェックします。そうであれば、StringBuffer内の情報を使用してSQL UPDATE文を作成し、実行します。StringBufferに変更が含まれていない場合、そのことを通知するメッセージを表示します。

if ( columns.length() > 0 )
{
sqlString = "update Employees SET " + columns.toString() +
" WHERE employee_id = " + employee_id;
System.out.println("\nExecuting: " + sqlString);
stmt.execute(sqlString);
}
else
{
System.out.println( "Nothing to do to update Employee Id: " +
employee_id);
}

9. 「success」というメッセージを返します。

return "success";

10. 作業内容を保存してファイルを作成し、構文エラーがないかどうかをチェックします。

図5-2に、このメソッドのすべてのコードを示します。

図5-2 データベース・レコードの更新のメソッド

public String updateEmployee(int employee_id, String first_name,
String last_name, String email,
String phone_number, String salary,
String job_id) throws SQLException {

Employee oldEmployee = findEmployeeById(employee_id);
getDBConnection();
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);

StringBuffer columns = new StringBuffer( 255 );
if ( first_name != null &&
!first_name.equals( oldEmployee.getFirstName() ) )
{
columns.append( "first_name = '" + first_name + "'" );
}
if ( last_name != null &&
!last_name.equals( oldEmployee.getLastName() ) ) {
if ( columns.length() > 0 ) {
columns.append( ", " );
}
columns.append( "last_name = '" + last_name + "'" );
}
if ( email != null &&
!email.equals( oldEmployee.getEmail() ) ) {
if ( columns.length() > 0 ) {
columns.append( ", " );
}
columns.append( "email = '" + email + "'" );
}
if ( phone_number != null &&
!phone_number.equals( oldEmployee.getPhoneNumber() ) ) {
if ( columns.length() > 0 ) {
columns.append( ", " );
}
columns.append( "phone_number = '" + phone_number + "'" );
}
if ( salary != null &&
!salary.equals( oldEmployee.getSalary().toString() ) ) {
if ( columns.length() > 0 ) {
columns.append( ", " );
}
columns.append( "salary = '" + salary + "'" );
}
if ( job_id != null &&
!job_id.equals( oldEmployee.getJobId() ) ) {
if ( columns.length() > 0 ) {
columns.append( ", " );
}
columns.append( "job_id = '" + job_id + "'" );
}

if ( columns.length() > 0 )
{
sqlString =
"UPDATE Employees SET " + columns.toString() +
" WHERE employee_id = " + employee_id;
System.out.println("\nExecuting: " + sqlString);
stmt.execute(sqlString);
}
else
{
System.out.println( "Nothing to do to update Employee Id: " +
employee_id);
}
return "success";
}

5.2.3 更新ページにナビゲートするリンクの追加

次の手順では、employees.jspページの従業員表の各行にリンクを追加します。ユーザーはリンクをクリックしてその行を編集します。

1. ビジュアル・エディタでemployees.jspを開きます。

2. 従業員の詳細を表示する表に、新規に列を追加します。列を追加するには、表の最後の列にカーソルを置いて右クリックし、ショートカットメニューで「表」を選択してから、「行または列の挿入」を選択します。「行または列の挿入」ダイアログ・ボックスで「列」および「選択した列の後」を選択して、「OK」をクリックします。

3. この追加された列には、「Edit」と表示されるリンクが行ごとに含まれます。これらのリンクは、選択した従業員レコードを編集できる個々のページにナビゲートします。これには、Employees表内のスクリプトレットをダブルクリックして「スクリプトレットのプロパティ」ダイアログ・ボックスを表示します。

4. edit.jspページへのリンクが含まれるように、スクリプトレットを変更します。変更されたスクリプトレットには次のコードが含まれている必要があります。

while (rset.next ())
{
out.println("<tr>");
out.println("<td>" +
rset.getString("first_name") + "</td><td> " +
rset.getString("last_name") + "</td><td> " +
rset.getString("email") + "</td><td> " +
rset.getString("job_id") + "</td><td>" +
rset.getString("phone_number") + "</td><td>" +
rset.getDouble("salary") +
"</td><td> <a href=\"edit.jsp?empid=" + rset.getInt(1) +
"\">Edit</a></td>");
out.println("<tr>");
}

従業員の編集リンクがクリックされると、このコードは、従業員レコードの更新を処理するedit.jspページに、従業員IDを渡します。edit.jspページはこれを使用して、その従業員のレコードをデータベース内で検索します。

5. employees.jspを保存します。図5-3は、実行されてブラウザに表示されたemployees.jspを示しています。クリックして従業員データを編集できるリンクが表示されています。

図5-3 employees.jspの従業員の編集へのリンク

5.2.4 従業員データを編集するJSPページの作成

この項では、従業員レコードの更新に使用するedit.jspファイルを作成します。

1. 新しいJSPページを作成して、edit.jspという名前を付けます。その他はすべてデフォルトを使用します。

2. このページに、以前に設定したものと同じ見出しAnyCo Corporation: HR Applicationを付け、Heading 2スタイルを割り当て、ページの中央に配置します。

3. 次の行に、Edit Employee Recordと入力し、Heading 3スタイルを適用します。この見出しをページの左側に配置します。

4. JDeveloperスタイルシートをページに追加します。

5. jsp:usebeanタグを追加します。empsbeanをIDとして入力し、hr.DataHandlerをクラスとして入力します。「有効範囲」を「セッション」に設定し、「OK」をクリックします。

6. カーソルをuseBeanタグの後に置いて、jsp:usebeanタグをもう1つ追加します。今度は、employeeを「ID」として入力し、hr.Employeeを「クラス」として参照して選択し、「有効範囲」を「page」のままにします。「OK」をクリックします。

7. スクリプトレットをページに追加します。スクリプトレット・コードは、従業員IDをfindEmployeeByIdメソッドに渡して、Employee Bean内のデータを取り出します。次のコードを「スクリプトレットの挿入」ダイアログ・ボックスに入力します。

Integer employee_id = new Integer(request.getParameter("empid"));
employee = empsbean.findEmployeeById(employee_id.intValue());

8. フォームをページに追加します。「フォームの挿入」ダイアログで、「アクション」フィールドにupdate_action.jspと入力します。まだ作成していないため、このページはリストからは選択できません。

9. 表をページに追加します。フォーム内に配置します。6行2列のレイアウトを指定し、その他のレイアウトはデフォルトを使用します。

10. 各行の最初の列に、次の見出しをそれぞれ入力します。First Name、Last Name、Email、Phone, Job、Monthly Salary

11. コンポーネント・パレットの「HTML Forms」ページから、「Hidden Field」コンポーネントをドラッグします。2列目の、First Name見出しの横にドロップします。「Hidden Fieldの挿入」ダイアログで、employee_idを「名前」プロパティに入力し、<%= employee.getEmployeeId()%>を「値」プロパティに入力します。

12. この列の、First Name見出しの横に、「テキスト・フィールド」コンポーネントをドラッグします。「Text Fieldの挿入」ダイアログで、first_nameを「名前」フィールドに入力し、< %= employee.getFirstName() %>を「値」フィールドに入力します。「OK」をクリックします。

13. この列の、Last Name見出しの横に、2つ目の「テキスト・フィールド」コンポーネントをドラッグします。「Text Fieldの挿入」ダイアログで、 last_nameを「名前」フィールドに入力し、< %= employee.getLastName() %>を「値」フィールドに入力します。「OK」をクリックします。

14. 同様に、残りの各列見出しの横にテキスト・フィールドを追加します。email、phone_number、job_idおよびsalaryをフィールド名として使用し、各フィールドに対応するgetterメソッドを使用します。これらは次の表で指定されます。

15. 「発行」ボタンを、フォームの表の下に追加します。Updateを「値」として入力します。

16. アプリケーションを保存します。
結果として作成されるedit.jspページは、図5-4のようなページになります。

図5-4 従業員の詳細を編集するJSPページの作成

5.2.5 更新アクションを処理するJSPページの作成

この項では、update_action.jspファイルの作成方法について説明します。このページは、従業員レコードの更新に使用するedit.jspページのフォームを処理します。このページには表示要素はなく、edit.jspフォームを処理するためにのみ使用され、employees.jspファイルに制御を返します。

1. 新しいJSPページを作成して、update_action.jspという名前を付けます。その他はすべて、JSP作成ウィザードのページのデフォルトを使用します。

2. ページの左上隅にある「Page Directive」をクリックして選択します。「プロパティ・インスペクタ」にPage Directiveのプロパティが表示されます。

3. インポートフィールドの隣にある下矢印をクリックします。プロパティの編集: インポートダイアログ・ボックスが表示されます。「階層」タブを選択し、「Java」および「SQL」フォルダをそれぞれ展開してからResultSetを選択します。「OK」をクリックします。

4. jsp:usebeanタグを追加します。empsbeanをIDとして入力し、hr.DataHandlerをクラスとして入力します。「有効範囲」を「セッション」に設定し、「OK」をクリックします。

5. スクリプトレットをページに追加します。次のコードを「スクリプトレットの挿入」ダイアログ・ボックスに入力します。

Integer employee_id = new Integer(request.getParameter("employee_id"));
String first_name = request.getParameter("first_name");
String last_name = request.getParameter("last_name");
String email = request.getParameter("email");
String phone_number = request.getParameter("phone_number");
String salary = request.getParameter("salary");
String job_id = request.getParameter("job_id");
empsbean.updateEmployee(employee_id.intValue(), first_name, last_name, email, phone_number, salary, job_id );

6. jsp:forwardタグをページに追加します。「forwardの挿入」ダイアログ・ボックスで、ページ*プロパティにemployees.jspと入力します。

7. 作業内容を保存します。

8. プロジェクトを実行して、従業員レコードを編集できるかどうかをテストします。employees.jspページで、いずれかの従業員のEditをクリックすると、図5-5に示されているページに移動します。従業員の詳細を変更し、employees.jspページで変更が反映されているかどうかをチェックします。

図5-5 従業員データの編集

5.3 従業員レコードの挿入

Employees表に新しい従業員レコードを挿入する手順は、従業員レコードの更新処理と似ています。

1. Employees表に新しい従業員行を挿入するメソッドを作成します。

2. メイン・アプリケーション・ページにリンクを追加し、ユーザーがリンクをクリックして新規従業員を挿入できるようにします。このリンクは、新しい行の詳細を入力するためのinsert.jspにユーザーを誘導します。

3. insert.jspページのフォームを処理するJSPページを作成します。

4. 新しい従業員の値を入力するためのフォームを制御するJSPページを作成します。

ここでは、新しい従業員データを挿入するJavaアプリケーション・コードの作成方法について次の各項で説明します。

- データを挿入するメソッドの作成

- 挿入ページにナビゲートするリンクの追加

- 挿入アクションを処理するJSPページの作成

- 新規データを入力するJSPページの作成

5.3.1 データを挿入するメソッドの作成

次の手順では、新しい従業員レコードを挿入するメソッドを作成します。

1. Javaソース・エディタでDataHandler.javaを開きます。

2. 新しい従業員レコードを追加するメソッドを宣言します。

public String addEmployee(String first_name,
String last_name, String email,
String phone_number, String job_id, int salary) throws SQLException {

}

3. データベースに接続するための行を追加します。

getDBConnection();

4. Statementオブジェクトを作成し、ResultSet型を以前と同様に定義してSQL文を作成します。

stmt =
conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
sqlString =
"INSERT INTO Employees VALUES (EMPLOYEES_SEQ.nextval, '" +
first_name + "','" +
last_name + "','" +
email + "','" +
phone_number + "'," +
"SYSDATE, '" +
job_id + "', " +
salary + ",.30,100,80)";

注意:
最後の3つの列(Commission、ManagerIdおよびDepartmentId)には、サンプル・アプリケーション用のハードコードされた値が格納されます。

5. トレース・メッセージを追加して、SQL文を実行します。

6. 挿入が成功した場合は、「success」というメッセージを返します。

7. 構文エラーをチェックするためのファイルを作成します。

図5-3に、addEmployee()メソッドのコードを示します。

図5-3 新規従業員レコードの追加のメソッド

public String addEmployee(String first_name,
String last_name, String email,
String phone_number, String job_id, int salary) throws SQLException {
getDBConnection();
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
sqlString =
"INSERT INTO Employees VALUES (EMPLOYEES_SEQ.nextval, '" +
first_name + "','" +
last_name + "','" +
email + "','" +
phone_number + "'," +
"SYSDATE, '" +
job_id + "', " +
salary + ",.30,100,80)";

System.out.println("\nInserting: " + sqlString);
stmt.execute(sqlString);
return "success";
}

5.3.2 挿入ページにナビゲートするリンクの追加

次の手順では、従業員表のヘッダー行にリンクを追加します。ユーザーはリンクをクリックすることで、新しい従業員を追加できます。

1. ビジュアル・エディタでemployees.jspを開きます。

2. コンポーネント・パレットの「HTML Common」ページから、「Hyper Link」コンポーネントを、ヘッダー行の最後にある空の列ヘッダーのセルにドラッグします。「ハイパー・リンクの挿入」ダイアログ・ボックスで、「ハイパーリンク」フィールドにinsert.jspを入力し、「テキスト」フィールドにInsert Employeeを入力します。まだ作成していないため、insert.jspを参照して検索することはできません。「OK」をクリックします。

3. employees.jspを保存します。

5.3.3 新規データを入力するJSPページの作成

次の手順では、insert.jspページを作成します。このページを使用することで、ユーザーは新しい従業員レコードの詳細を入力できます。

1. 新しいJSPページを作成して、insert.jspという名前を付けます。

2. このページに、以前に設定したものと同じ見出しAnyCo Corporation: HR Applicationを付け、Heading 2としてフォーマットして、中央に配置します。

3. 次の行に、Insert Employee Recordと入力し、Heading 3フォーマットを適用します。この見出しをページの左側に配置します。

4. JDeveloperスタイルシートをページに追加します。

5. フォームを追加します。「フォームの挿入」ダイアログ・ボックスで、「アクション」プロパティにinsert_action.jspと入力して、「OK」をクリックします。

6. 表をフォーム内に追加します。6行2列を指定し、その他のレイアウトはデフォルトを使用します。

7. 各行の最初の列に、次の見出しをそれぞれ入力します。First Name、Last Name、Email、Phone、Job、Monthly Salary

8. First Nameヘッダーの右の列に、「テキスト・フィールド」をドラッグ・アンド・ドロップします。「フィールドの挿入」ダイアログ・ボックスで、「名前」プロパティにfirst_nameと入力します。

9. Last Name、Email、PhoneおよびMonthly Salaryヘッダーのそれぞれの横に、「テキスト・フィールド」をドラッグします。これらのテキスト・フィールドごとに、「フィールドの挿入」ダイアログ・ボックスで「名前」プロパティに値を指定します。次の表に、値を示します。

テキスト・フィールドの対象

「名前」プロパティに設定する値

Last Name

last_name

Email

email

Phone

phone_number

Monthly Salary

salary

Job行は手順が異なります。

10. コンポーネント・パレットの「HTML Forms」ページから、コンボ・ボックス・コンポーネントを、Job見出しの横の列にドラッグします。

11. 「選択の挿入」ダイアログ・ボックスで、名前にjob_idを入力し、サイズに1を入力します。追加(+)アイコンをクリックし、「値」フィールドにSA_REPと入力し、「キャプション」フィールドにSales Representativeと入力します。追加(+)記号をクリックして、次の各ジョブ・タイトルを追加し、「OK」をクリックします。

値

キャプション

HR_REP

HR Representative

PR_REP

PR Representative

MK_MAN

Marketing Manager

SA_MAN

Sales Manager

FI_MAN

Finance Manager

IT_PROG

Software Developer

AD_VIP

Vice President

12. 「発行」ボタンを表の下のフォームにドラッグします。「送信ボタンの挿入」ダイアログ・ボックスで、「値」プロパティにAdd Employeeと入力します。

13. 作業内容を保存します。

図5-6に、ビジュアル・エディタのinsert.jspページを示します。

図5-6 従業員データを挿入するフォーム

5.3.4 挿入アクションを処理するJSPページの作成

次の手順では、insert_action.jspページを作成します。このページは、新しい従業員レコードを入力するinsert.jspページからのフォーム入力を処理します。このページには表示要素はなく、 insert.jspフォームを処理するためにのみ使用され、employees.jspファイルに制御を返します。

1. 前述と同様に、JSPページを作成します。このページにinsert_action.jspという名前を付けます。

2. jsp:usebeanタグを追加します。以前と同様に、IDにempsbeanを入力し、クラスにhr.DataHandlerを入力します。「有効範囲」を「セッション」に設定し、「OK」をクリックします。

3. カーソルをuseBeanタグの後に置き、スクリプトレットをページに追加します。次のコードを「スクリプトレットの挿入」ダイアログ・ボックスに入力します。

String first_name = request.getParameter("first_name");
String last_name = request.getParameter("last_name");
String email = request.getParameter("email");
String phone_number = request.getParameter("phone_number");
String job_id = request.getParameter("job_id");
Integer salary = new Integer(request.getParameter("salary"));

empsbean.addEmployee(first_name, last_name, email, phone_number, job_id, salary.intValue());

4. jsp:forwardタグをページにドラッグします。「forwardの挿入」ダイアログ・ボックスで、employees.jspと入力します。

5. 作業内容を保存します。

6. Viewプロジェクトを実行して、新しい従業員レコードを挿入できるかどうかをテストします。

従業員を挿入するには、図5-7に示したemployees.jspページで、Insert Employeeをクリックします。

図5-7 新規従業員データの挿入

図5-8に、入力済のデータと、ジョブの選択に使用されるジョブ・リストが表示されている、従業員データを新規に挿入するページを示します。

図5-8 従業員データの挿入

5.4 従業員レコードの削除

レコードを削除する手順は、レコードを編集および挿入する手順と似ています。

1. 「従業員レコードを識別するメソッドの作成」で作成したメソッドを使用して、特定の従業員行を識別します。このメソッドは、削除する行を識別するために使用されます。

2. 従業員レコードをデータベースから削除するメソッドを作成します。

3. メイン・アプリケーション・ページで各行にリンクを追加し、ユーザーがリンクをクリックしてその行の従業員を削除できるようにします。このリンクは、レコードが削除される従業員のIDとともにdelete_action.jspにユーザーを誘導します。

4. データベースから従業員を削除するには、手順2で作成した削除メソッドをコールするJSPページを作成します。

この項では、従業員データの削除に関連する次のタスクについて説明します。

- データを削除するメソッドの作成

- 従業員を削除するリンクの追加

- 削除アクションを処理するJSPページの作成

5.4.1 データを削除するメソッドの作成

次の手順で作成するメソッドは、IDを使用した従業員レコードの削除に使用します。

1. Javaソース・エディタでDataHandler.javaを開きます。

2. 削除する従業員レコードを識別するための新規メソッドを宣言します。

public String deleteEmployeeById(int id) throws SQLException {

}

3. 前述と同様に、データベースに接続します。

getDBConnection();

4. Statementオブジェクトを作成し、ResultSet型を以前と同様に定義してSQL文を作成します。デバッグに役立てるために、トレース・メッセージを追加します。

stmt =
conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
sqlString = "DELETE FROM Employees WHERE employee_id = " + id;
System.out.println("\nExecuting: " + sqlString);

5. SQL文を実行します。

stmt.execute(sqlString);

6. SQL文の実行が正常に完了した場合は、Successというメッセージを返します。

return "success";

図5-4に、 deleteEmployeeById()メソッドのコードを示します。

図5-4 従業員レコードを削除するメソッド

public String deleteEmployeeById(int id) throws SQLException {
getDBConnection();
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
sqlString = "DELETE FROM Employees WHERE employee_id = " + id;
System.out.println("\nExecuting: " + sqlString);
stmt.execute(sqlString);
return "success";
}

5.4.2 従業員を削除するリンクの追加

次の手順では、employees.jsp ページの従業員表の各行にリンクを追加します。リンクをクリックすると、その行の従業員データがすべて削除されます。

1. ビジュアル・エディタでemployees.jspを開きます。

2. Editリンクを配置するために作成した「Insert Employee」列(図5-7を参照)に、行を削除するための別のリンクを追加します。これには、Employees表内のスクリプトレットをダブルクリックして「スクリプトレットのプロパティ」ダイアログ・ボックスを表示します。

3. delete_action.jspページへのリンクが含まれるように、スクリプトレットを変更します。変更されたスクリプトレットには次のコードが含まれている必要があります。

while (rset.next ())
{
out.println("<tr>");
out.println("<td>" +
rset.getString("first_name") + "</td><td> " +
rset.getString("last_name") + "</td><td> " +
rset.getString("email") + "</td><td> " +
rset.getString("job_id") + "</td><td>" +
rset.getString("phone_number") + "</td><td>" +
rset.getDouble("salary") +
"</td><td> <a href=\"edit.jsp?empid=" + rset.getInt(1) +
"\">Edit</a>   <a href=\"delete_action.jsp?empid=" +
rset.getInt(1) + "\">Delete</a></td>");
out.println("<tr>");
}

4. employees.jspを保存します。

5.4.3 削除アクションを処理するJSPページの作成

次の手順では、delete_action.jspページを作成します。これは、削除操作のみを処理するページです。このページにはビジュアル要素はありません。

1. 新しいJSPページを作成して、delete_action.jspという名前を付けます。

2. jsp:usebeanタグを追加します。以前と同様に、IDにempsbeanを入力し、クラスにhr.DataHandlerを入力します。「有効範囲」を「セッション」に設定し、「OK」をクリックします。

3. スクリプトレットをページに追加します。次のコードを「スクリプトレットの挿入」ダイアログ・ボックスに入力します。

Integer employee_id =
new Integer(request.getParameter("empid"));
empsbean.deleteEmployeeById(employee_id.intValue());

4. コンポーネント・パレットからForwardをドラッグして、jsp:forwardタグをページに追加します。「forwardの挿入」ダイアログ・ボックスで、employees.jspと入力します。

5. 作業内容を保存します。

6. プロジェクトを実行して従業員を削除してみます。図5-9に、employees.jspから従業員レコードを削除するリンクを示します。

図5-9 employees.jspから従業員を削除するためのリンク

いずれかの従業員レコードのDeleteをクリックすると、その従業員レコードが削除されます。

5.5 例外処理

SQLExceptionオブジェクト・インスタンスは、データベース・アクセス・エラーやその他のエラーに関する情報を提供します。各SQLExceptionインスタンスは様々なタイプの情報を提供しますが、情報がエラー内容を説明する文字列である場合は、これをJava例外メッセージとして使用し、getMessageメソッドをとおして取得できます。

このサンプル・アプリケーションでは、Javaの例外処理メカニズムである、tryブロックとcatchブロックを使用します。Javaでは、メソッドから例外がスローされる場合、これを処理するメカニズムが必要になります。通常、catchブロックは例外を捕捉し、例外発生時のアクションの流れを指定しますが、単にメッセージを表示するだけの場合もあります。

データベース・アクセス・エラーが発生すると、各JDBCメソッドはSQLExceptionをスローします。そのため、このようなメソッドを実行するアプリケーションのメソッドにはすべて例外処理が必要です。

サンプル・アプリケーション内のすべてのメソッドには、例外処理用のコードが含まれています。たとえば、データベース接続に使用されるgetDBConnectionは、次に示すgetAllEmployeesメソッドと同じように、SQLExceptionをスローします。

public ResultSet getAllEmployees() throws SQLException {
}

SQLExceptionを捕捉して処理するコードの例は、DataHandler.javaクラスのauthenticateUserメソッド内のコードを参照してください。この例では、ユーザー認証を行うため実行する必要のあるコードがtryブロックに含まれており、認証が失敗した場合は、catchブロックが対応します。次の項では、SQLExceptionを捕捉して処理するコードをサンプル・アプリケーションに追加する方法について説明します。

5.5.1 Javaメソッドへの例外処理の追加

サンプル・アプリケーションのメソッドでSQL例外を処理するには、次の手順を実行します。

1. メソッドがSQLExceptionをスローしていることを確認します。次にメソッドの例を示します。

public ResultSet getAllEmployees() throws SQLException

2. tryブロックおよびcatchブロックを使用して、SQLExceptionを捕捉します。たとえば、getAllEmployeesメソッドでは、既存コードをtryブロックにまとめ、catchブロックを次のように追加しています。

public ResultSet getAllEmployees() throws SQLException {
try {
getDBConnection();
stmt =
conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
sqlString = "SELECT * FROM Employees order by employee_id";
System.out.println("\nExecuting: " + sqlString);
rset = stmt.executeQuery(sqlString);
}
catch (SQLException e) {
e.printStackTrace();
}
return rset;
}

3. 別の例として、tryブロックおよびcatchブロックを使用するように書き換えたdeleteEmployeeメソッドは、メソッドの実行が成功した場合にのみ"success"を返します。つまり、return文がtryブロックに含まれています。コードは次のようになります。

public String deleteEmployeeById(int id) throws SQLException {

try {
getDBConnection();
stmt =
conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
sqlString = "delete FROM Employees where employee_id = " + id;
System.out.println("\nExecuting: " + sqlString);

stmt.execute(sqlString);
return "success";
}
catch (SQLException e) {
e.printStackTrace();
}
}

5.5.2 SQLExceptionを処理するメソッドの作成

サンプル・アプリケーションのコードの改良点として、SQLExceptionをスローするメソッドで使用する例外処理のメソッドを作成します。例として、次のメソッドは、サンプル・アプリケーションのどのメソッドのcatchブロックからでもコールできます。このメソッドは累積されたすべての例外を処理し、それぞれについてスタック・トレースを出力します。

例5-5 アプリケーションのSQLExceptionを処理するメソッドの追加

public void logException( SQLException ex )
{
while ( ex != null ) {
ex.printStackTrace();
ex = ex.getNextException();
}
}

また、catchブロックでは、メソッドが失敗した理由を説明するテキストを返せます。つまり、メソッドのcatchブロックを次のように記述できます。

catch ( SQLException ex )  {
logException( ex );
return "failure";
}

この機能をアプリケーションに追加するには、次の手順を実行します。

1. DataHandler.javaにlogExceptionメソッドを追加します。

2. tryブロックとcatchブロックを含むように各メソッドを編集します。

3. 各メソッドのcatchブロックで、logExceptionメソッドを実行します。

4. Stringの戻り値を持つメソッドの場合は、次のようにreturn文を記述して、メソッドが失敗したことを示すメッセージを返します。

return "failure";

5.6 サンプル・アプリケーションのナビゲーション

web.xmlファイルは、Webアプリケーションのデプロイメント・ディスクリプタ・ファイルです。web.xmlファイルの1つのセクションを使用して、次のようにアプリケーションの開始ページを定義できます。

<web-app>
...
<welcome-file>
myWelcomeFile.jsp
</welcome-file>
...
</web-app>

web.xmlファイルでwelcomeページを定義しなかった場合、名前がindexで拡張子が.html、.htmまたは.jspのファイルが見つかれば、通常これが開始ページとして使用されます。JDeveloperでは、アプリケーションのデフォルトの実行ターゲットとするページ、つまり、最初に表示されるアプリケーションのページを、プロジェクトのプロパティを使用して定義できます。

アプリケーションが起動して開始ページが表示された後、アプリケーション内のナビゲーションは次の方法を使用して実現されます。

- リンク: HTMLアンカー・タグの形式で、リンクのターゲット(通常はナビゲート先の別のJSPページを特定する)およびリンクのテキストを定義します。

- HTML送信ボタン: このボタンを使用してページのフォーム(新規データまたは変更済のデータを入力するフォームなど)を送信します。

- jsp:forwardタグ: 問合せおよびフォームを処理するJSPページで実行され、同じJSPページに再度フォワードするかまたは別のJSPページにフォワードします。

5.6.1 アプリケーションの開始ページの作成

次の手順では、アプリケーションのデフォルトの開始ページとするindex.jspページを作成します。このページには表示要素は配置せず、アプリケーションのログイン・ページ(login.jsp)へのユーザーのフォワードのみを行います。これを行うには、jsp:forwardタグを使用します。jsp:forwardタグは問合せおよびフォームを処理するJSPページで実行され、同じJSPページに再度フォワードするかまたは別のJSPページにフォワードします。

1. 新しいJSPページを作成して、index.jspという名前を付けます。

2. サンプル・アプリケーションでは、このページにテキストを追加しません。コンポーネント・パレットの「JSP」ページから、Forwardをドラッグして、jsp:forwardタグをページに含めます。

3. forwardタグの「forwardの挿入」ダイアログ・ボックスで、login.jspを「ページ」として入力します。

これで、この新しいページをアプリケーションのデフォルト・ターゲットに指定できます。次の手順を実行します。

1. アプリケーション・ナビゲータで、Viewプロジェクトを右クリックして、「プロジェクト・プロパティ」を選択します。

2. 表示されたツリーで、「実行/デバッグ/プロファイル」を選択します。「実行/デバッグ/プロファイル」領域で「プロジェクト設定を使用」が選択されていることを確認し、「実行構成」領域で「デフォルト構成」が選択されていることを確認します。「編集」をクリックします。

3. 「起動設定の編集」ダイアログ・ボックスで、「起動設定」を選択します。右側の「起動設定」領域で、「デフォルトの実行ターゲット」フィールドの横にある「参照」をクリックして、今作成した新しいindex.jspページを検索し、「OK」をクリックします。再度「OK」をクリックして、ダイアログ・ボックスを閉じます。

これで、Viewプロジェクトを右クリックし、ショートカット・メニューで「実行」を選択すると、アプリケーションを実行できます。アプリケーションを起動すると、アプリケーションのデフォルトの起動ターゲットとして設定されているindex.jspが最初に実行されます。index.jspによって直接ログイン・ページ(login.jsp)にフォワードされ、このページがブラウザに表示されます。

6 アプリケーションの拡張: 拡張JDBC機能

この章では、Javaアプリケーションで使用できる追加機能について説明します。一部の機能でサンプル・アプリケーションに実装されていないものもありますが、パフォーマンスを向上させるためにコード内で使用できる機能拡張もあります。

この章は次の項で構成されています。

- 動的SQLの使用

- ストアド・プロシージャのコール

- カーソル変数の使用

6.1 動的SQLの使用

本番環境では、動的SQL、つまり実行時にSQL文を生成することが常に必要です。特に、データベースに対して行われる更新の場合など、最終的な問合せが実行時までわからないことがよくあります。

異なる更新値を持つ多数の類似問合せをデータベースに対して実行する必要がある場合は、Statementオブジェクトを拡張するOraclePreparedStatementオブジェクトを使用できます。この場合、リテラルの更新値をバインド変数に置き換えます。また、OracleCallableStatementオブジェクトを介してストアド・プロシージャをコールすることによって、データベースでPL/SQLストアド・ファンクションを使用することもできます。

この項では、次の項目について説明します。

- OraclePreparedStatementの使用

- OracleCallableStatementの使用

- バインド変数の使用

6.1.1 OraclePreparedStatementの使用

データベースに対して静的SQL問合せを実行する場合は、Statementオブジェクトを使用します。ただし、複数の類似問合せを実行したり、データベースの多数の列に影響する複数の更新を実行する場合は、それぞれの問合せをアプリケーションにハード・コードすることはできません。

同じSQL文を複数回実行する場合は、OraclePreparedStatementを使用できます。次のような問合せについて考えてみます。

SELECT * FROM Employees WHERE ID=xyz;

この問合せのxyzの値が変更されるたびに、SQL文を再度コンパイルする必要があります。

OraclePreparedStatement機能を使用すると、実行するSQL文はプリコンパイルされてPreparedStatementオブジェクトに格納されるため、実行するたびにコンパイルしなくても、何度でも実行できます。文中のデータが変化する場合は、そのデータのプレースホルダとしてバインド変数を使用し、実行時にリテラル値を指定することができます。

OraclePreparedStatementの使用について、次に例を示します。

例6-1 PreparedStatementの作成

OraclePreparedStatement pstmt = conn.prepareStatement("UPDATE Employees
SET salary = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)

OraclePreparedStatementインタフェースを使用するメリットは、次のとおりです。

- 同じPreparedStatementオブジェクトを使用することによって、更新をバッチ化できます。

- 何度も実行されるSQL文を1回目の実行時にのみコンパイルするため、パフォーマンスを改善できます。

- バインド変数を使用して、コードを単純かつ再利用可能にすることができます。

6.1.2 OracleCallableStatementの使用

OracleCallableStatementインタフェースを使用すると、データベース上のストアド・プロシージャにアクセスできます。このインタフェースは、OraclePreparedStatementインタフェースを拡張します。OracleCallableStatementインタフェースは、ストアド・プロシージャをコールするために、標準的なJDBCエスケープ構文で構成されています。このインタフェースは、結果パラメータの有無にかかわらず使用できます。ただし、結果パラメータを使用する場合は、それがOUTパラメータとして登録されている必要があります。このインタフェースでは、その他のパラメータとして、INまたはOUTあるいはその両方を使用できます。

これらのパラメータは、OraclePreparedStatementインタフェースから継承されるアクセッサ・メソッドの使用によって設定されます。INパラメータはsetXXXメソッドで設定し、OUTパラメータはgetXXXメソッドで取得します。XXXは、パラメータのJavaデータ型です。

また、CallableStatementは、複数のResultSetオブジェクトを返すこともあります。

例として、次のようにOracleCallableStatementを作成して、fooストアド・プロシージャをコールすることができます。

例6-2 CallableStatementの作成

OracleCallableStatement cs = (OracleCallableStatement)
conn.prepareCall("{call foo(?)}");

次のいずれかの方法で、文字列barをこのプロシージャに渡すことができます。

cs.setString(1,"bar"); // JDBC standard
// or...
cs.setStringAtName(X, "value"); // Oracle extension

6.1.3 バインド変数の使用

バインド変数は、SQL文中のリテラルのかわりとなる変数です。バインド変数をOraclePreparedStatementおよびOracleCallableStatementとともに使用して、SQL文の構築に使用されるパラメータ値を指定します。バインド変数を使用すると、本番環境でのパフォーマンスが大幅に向上します。

PL/SQLブロックまたはストアド・プロシージャ・コールでは、IN、OUTおよびIN OUTという修飾子を使用して、入力変数と出力変数を区別できます。入力変数の値はsetXXXメソッドで設定し、OUT変数の値はgetXXXメソッドで取得します。XXXは、値のJavaデータ型です。これは、アクセスするデータベース内の列のSQLデータ型によって異なります。

6.2 ストアド・プロシージャのコール

Oracle Java Database Connectivity(JDBC)ドライバでは、PL/SQLストアド・プロシージャおよび無名ブロックの処理がサポートされています。Oracle JDBCドライバでは、Oracle PL/SQLブロック構文およびほとんどのJDBCエスケープ構文がサポートされています。次のPL/SQLコールは、すべてのOracle JDBCドライバで動作します。

例6-3 ストアド・プロシージャのコール

// JDBC syntaxCallableStatement cs1 = conn.prepareCall
( "{call proc (?,?)}" ) ; // stored proc
CallableStatement cs2 = conn.prepareCall
( "{? = call func (?,?)}" ) ; // stored func

// Oracle PL/SQL block syntax
CallableStatement cs3 = conn.prepareCall
( "begin proc (?,?); end;" ) ; // stored proc
CallableStatement cs4 = conn.prepareCall
( "begin ? := func(?,?); end;" ) ; // stored func

Oracle構文の例として、ストアド・ファンクションを作成するPL/SQLコードの一部を示します。このPL/SQLファンクションでは文字列を取得して接尾辞を連結します。

例6-4 ストアド・ファンクションの作成

create or replace function foo (val1 char)
return char as
begin
return val1 || 'suffix';
end;

次のように、Javaプログラムでこのストアド・ファンクションをコールできます。

例6-5 Javaのストアド・ファンクションのコール

OracleDataSource ods = new OracleDataSource();
ods.setURL("jdbc:oracle:thin:@<hoststring>");
ods.setUser("hr");
ods.setPassword("hr");
Connection conn = ods.getConnection();
CallableStatement cs = conn.prepareCall ("begin ? := foo(?); end;");
cs.registerOutParameter(1,Types.CHAR);
cs.setString(2, "aa");
cs.executeUpdate();
String result = cs.getString(1);

次の項では、このマニュアルのサンプル・アプリケーションでストアド・プロシージャを使用する方法について説明します。

- JDeveloperでのPL/SQLストアド・プロシージャの作成

- ストアド・プロシージャを使用するためのメソッドの作成

- ユーザーによるストアド・プロシージャの選択の許可

- アプリケーションからのストアド・プロシージャのコール

6.2.1 JDeveloperでのPL/SQLストアド・プロシージャの作成

JDeveloperを使用すると、データベース・ナビゲータを使用して、ストアド・プロシージャをデータベースに作成できます。次の手順では、サンプル・アプリケーションで従業員レコードを挿入するための代替方法として使用できるストアド・プロシージャを作成します。

1. Select the 「DatabaseNavigatorName」タブを選択して、データベース・ナビゲータを表示します。

2. データベース接続ノード(デフォルトではConnection1)を開き、HRデータベース内のオブジェクトを表示します。

3. 「プロシージャ」を右クリックし、「新規プロシージャ」を選択します。

4. 「PL/SQLプロシージャ作成」ダイアログ・ボックスで、オブジェクト名としてinsert_employeeと入力します。「OK」をクリックします。
プロシージャのスケルトン・コードがソース・エディタに表示されます。

5. キーワードCREATE OR REPLACEの後に、次のコード行を入力して既存の行を置き換えます。

PROCEDURE INSERT_EMPLOYEE (p_first_name  employees.first_name%type,
p_last_name    employees.last_name%type,
p_email        employees.email%type,
p_phone_number employees.phone_number%type,
p_job_id       employees.job_id%type,
p_salary       employees.salary%type
)

6. BEGIN文の後のNULLを示す行を次の内容で置き換えます。

INSERT INTO Employees VALUES (EMPLOYEES_SEQ.nextval, p_first_name,
p_last_name, p_email, p_phone_number, SYSDATE, p_job_id,
p_salary,.30, 100, 80);

この文では、DataHandler.javaクラスのaddEmployeeメソッドの最後の3行に使用される、ハードコードされた同じ値が使用されていることがわかります。

7. END文にプロシージャ名を追加します。

END insert_employee;

8. ファイルを保存し、コンパイル・エラーがないかを確認します。

例6-6に、ストアド・プロシージャの完成したコードに示します。

例6-6 従業員データを挿入するためのPL/SQLストアド・プロシージャの作成

CREATE OR REPLACE PROCEDURE INSERT_EMPLOYEE (p_first_name  employees.first_name%type,
p_last_name    employees.last_name%type,
p_email        employees.email%type,
p_phone_number employees.phone_number%type,
p_job_id       employees.job_id%type,
p_salary       employees.salary%type
)
AS
BEGIN
INSERT INTO Employees VALUES (EMPLOYEES_SEQ.nextval, p_first_name ,
p_last_name , p_email , p_phone_number, SYSDATE, p_job_id,
p_salary,.30,100,80);
END insert_employee;

6.2.2 ストアド・プロシージャを使用するためのメソッドの作成

次の手順では、addEmployeeメソッドのかわりに使用できるメソッドをDataHandler.javaクラスに追加します。ここで追加する新しいメソッドでは、insert_employeeストアド・プロシージャを使用します。

1. 「アプリケーション」タブを選択して、アプリケーション・ナビゲータを表示します。

2. DataHandler.javaファイルがJavaソース・エディタでまだ開いていない場合は、ダブルクリックして開きます。

3. 次のようにCallableStatementをインポートします。

import java.sql.CallableStatement;

4. addEmployeeメソッドの後に、addEmployeeSPメソッドの宣言を追加します。

public String addEmployeeSP(String first_name, String last_name,
String email, String phone_number, String job_id,
int salary) throws SQLException {
}

このメソッドのシグネチャはaddEmployeeのものと同じです。

5. このメソッド内にtryブロックを追加し、このブロック内でデータベースに接続します。

try {
getDBConnection();
}

6. さらに、tryブロック内で次のSQL文字列を作成します。

sqlString = "begin hr.insert_employee(?,?,?,?,?,?); end;";

文中の疑問符(?)はバインド変数で、ストアド・プロシージャによって使用される、first_name、last_nameなどの値のプレースホルダの役割を果たします。

7. CallableStatementを作成します。

CallableStatement callstmt = conn.prepareCall(sqlString);

8. INパラメータを設定します。

callstmt.setString(1, first_name);
callstmt.setString(2, last_name);
callstmt.setString(3, email);
callstmt.setString(4, phone_number);
callstmt.setString(5, job_id);
callstmt.setInt(6, salary);

9. トレース・メッセージを追加し、コール可能文を実行します。

System.out.println("\nInserting with stored procedure: " +
sqlString);
callstmt.execute();

10. 戻りメッセージを追加します。

return "success";

11. tryブロックの後にcatchブロックを追加して、すべてのエラーを捕捉します。例5-5で作成したlogExceptionをコールします。

catch ( SQLException ex ) {
System.out.println("Possible source of error: Make sure you have created the stored procedure");
logException( ex );
return "failure";
}

12. DataHandler.javaを保存します。

例6-7に、完成したメソッドを示します。

注意:
logException()メソッド(例5-5を参照)を追加していない場合は、logException(ex)の下に表示される赤い波線によってエラーが示されます。ファイルのコンパイルに進む前に、このメソッドがDataHandler.javaクラスに存在する必要があります。

例6-7 JavaでのPL/SQLストアド・プロシージャの使用

public String addEmployeeSP(String first_name, String last_name,
String email, String phone_number, String job_id,
int salary) throws SQLException {

try {
getDBConnection();
sqlString = "begin hr.insert_employee(?,?,?,?,?,?); end;";
CallableStatement callstmt = conn.prepareCall(sqlString);
callstmt.setString(1, first_name);
callstmt.setString(2, last_name);
callstmt.setString(3, email);
callstmt.setString(4, phone_number);
callstmt.setString(5, job_id);
callstmt.setInt(6, salary);
System.out.println("\nInserting with stored procedure: " +
sqlString);

callstmt.execute();
return "success";
}
catch ( SQLException ex ) {
System.out.println("Possible source of error: Make sure you have created the stored procedure");
logException( ex );
return "failure";
}
}

6.2.3 ユーザーによるストアド・プロシージャの選択の許可

この項の手順では、insert.jspページにラジオ・ボタン・グループを追加します。従業員レコードを挿入する場合に、ストアド・プロシージャを使用するか、またはJavaコードでSQL問合せを使用するかを、このラジオ・ボタンによって、ユーザーが選択できるようにします。

1. insert.jspを開いていない場合は、ビジュアル・エディタで開きます。

2. 「Insert Employee Record」という見出しの後に、新しい行を作成します。この新しい行にカーソルを置き、「UseBean」をコンポーネント・パレットの「JSP」ページからドラッグしてjsp:useBeanタグをこのページに追加します。IDとしてempsbeanを入力し、「クラス」としてhr.DataHandlerを参照して選択し、「有効範囲」を「セッション」に設定します。ページ上でUseBeanが選択されている状態で、この行のスタイルをHeading 3ではなくNoneに設定します。

3. 「Radio Button」コンポーネントをコンポーネント・パレットの「HTML Forms」ページから表の上にあるフォーム内のページにドラッグします。「ラジオ・ボタンの挿入」ダイアログ・ボックスで、「名前」にuseSPを入力し、「値」にfalseを入力して、「チェック」を選択します。「OK」をクリックします。

4. ビジュアル・エディタでボタンの右側にカーソルを置き、「新しいレコードの追加にはJDBCのみを使用する」など、ボタンの目的を説明するテキストを入力します。

5. 現在の行の末尾で[Enter]を押して、新しい行を作成します。

6. 2つ目の「Radio Button」を最初のラジオ・ボタンの下にドラッグします。「ラジオ・ボタンの挿入」ダイアログ・ボックスで、「名前」にuseSPを入力し、「値」にtrueを入力して、「チェック」チェック・ボックスが選択されていないことを確認します。

7. ビジュアル・エディタでボタンの右側にカーソルを置き、「レコードの追加にはJDBCからコールするストアド・プロシージャのみを使用する」など、ボタンの目的を説明するテキストを入力します。

8. ページを保存します。

図6-1に、ストアド・プロシージャを使用するときのオプションとなるラジオ・ボタンのあるinsert.jsp を示します。

図6-1 ストアド・プロシージャ・オプションのためのリンクの追加

6.2.4 アプリケーションからのストアド・プロシージャのコール

この項の手順では、insert.jspページ上でフォームを処理するinsert_action.jspファイルを変更し、ラジオ・ボタンの選択によって、新しい従業員レコードを挿入するための適切なメソッドを選択します。

1. insert_action.jspを開いていない場合は、ビジュアル・エディタで開きます。

2. スクリプトレットをダブルクリックして「スクリプトレットのプロパティ」ダイアログ・ボックスを表示し、次のようにsalary変数の後に新しい変数を追加します。

String useSPFlag = request.getParameter("useSP");

3. 「スクリプトレットのプロパティ」ダイアログ・ボックスのまま、その下で、既存のempsbean.addEmployee行を次のコード行で置き換えます。このコード行では、addEmployeeSPメソッドまたはpure JDBC addEmployeeメソッドを選択してレコードを挿入します。

if ( useSPFlag.equalsIgnoreCase("true"))
empsbean.addEmployeeSP(first_name, last_name, email,
phone_number, job_id, salary.intValue());
// otherwise use pure JDBC insert
else
empsbean.addEmployee(first_name, last_name, email,
phone_number, job_id, salary.intValue());

4. insert_action.jspを保存します。

これで、アプリケーションを実行すると、挿入ページのラジオ・ボタンを使用して新しい従業員レコードを挿入する方法を選択できます。ブラウザでは、ページは図6-2のように表示されます。

図6-2 レコードを入力するためのストアド・プロシージャの使用

6.3 カーソル変数の使用

Oracle JDBCドライバではREF CURSOR型のカーソル変数がサポートされますが、これはJDBC標準の一部ではありません。REF CURSOR型は、JDBC結果セットとしての使用がサポートされています。

カーソル変数は、問合せ作業領域の(内容でなく)メモリーの場所を保持します。カーソル変数を宣言すると、ポインタが作成されます。SQLでは、ポインタはデータ型REF xを取ります。ここで、REFはREFERENCEの省略形で、xは参照されるエンティティを表します。次に、REF CURSORがカーソル変数への参照を特定します。様々な作業領域を指し示すため、多数のカーソル変数が使用されることがあります。そのためREF CURSORは、カーソル変数の様々な型を識別するカテゴリまたはデータ型指定子と考えることができます。基本的にREF CURSORは問合せ結果をカプセル化します。

Oracleは結果セットを返しません。問合せによって返されたデータにアクセスするには、CURSORおよびREF CURSORを使用します。CURSORには、問合せ結果およびメタデータが含まれます。REF CURSOR(CURSOR変数)データ型には、カーソルへの参照が含まれます。RDBMSとクライアント、またはデータベースでPL/SQLとJavaの間での受け渡しが可能です。問合せまたはストアド・プロシージャから返される場合もあります。

このリリース以降、Oracle Databaseで、ストアド・プロシージャで実行されたSQL文の結果がクライアントに暗黙的に返されることがサポートされるようになりました。

関連項目:
暗黙的な結果のサポートの詳細は、『Oracle Database JDBC開発者ガイド』を参照してください。

注意:
REF CURSORインスタンスはスクロールできません。

この項では、次の項目について説明します。

- OracleのREF CURSOR型のカテゴリ

- REF CURSORデータへのアクセス

- サンプル・アプリケーションでのREF CURSORの使用

6.3.1 OracleのREF CURSOR型のカテゴリ

カーソル変数を作成するには、REF CURSORカテゴリに属する型を識別することから開始します。次に例を示します。

dept_cv DeptCursorTyp
...

次に、DeptCursorTyp型であることを宣言して、カーソル変数を作成します。

例6-8 REF CURSOR型の宣言

DECLARE TYPE DeptCursorTyp IS REF CURSOR

REF CURSORは、特定のデータ型というよりも、データ型のカテゴリです。ストアド・プロシージャは、REF CURSORカテゴリのカーソル変数を返すことがあります。この出力は、データベース・カーソルまたはJDBC結果セットと同等です。

6.3.2 REF CURSORデータへのアクセス

Javaでは、REF CURSORはResultSetオブジェクトとしてマテリアライズされ、次のようにアクセスできます。

例6-9 JavaにおけるREF CURSORデータへのアクセス

import oracle.jdbc.*;
...
CallableStatement cstmt;
ResultSet cursor;

// Use a PL/SQL block to open the cursor
cstmt = conn.prepareCall
("begin open ? for select ename from emp; end;");

cstmt.registerOutParameter(1, OracleTypes.CURSOR);
cstmt.execute();
cursor = ((OracleCallableStatement)cstmt).getCursor(1);

// Use the cursor like a normal ResultSet
while (cursor.next ())
{System.out.println (cursor.getString(1));}

前述の例では、次の手順が実行されます。

1. 接続クラスのprepareCallメソッドを使用して、CallableStatementオブジェクトが作成されます。

2. コール可能文によって、REF CURSORを返すPL/SQLプロシージャが実装されます。

3. 通常どおり、コール可能文の出力パラメータは、その型を定義するために登録されている必要があります。REF CURSORには、型コードOracleTypes.CURSORを使用します。

4. コール可能文が実行され、REF CURSORが返されます。

5. getCursorメソッドを使用するために、CallableStatementオブジェクトがOracleCallableStatementにキャストされます。このメソッドは、標準JDBC Application Program Interface(API)に対するOracleの拡張機能であり、REF CURSORをResultSetオブジェクトに返します。

6.3.3 サンプル・アプリケーションでのREF CURSORの使用

次の項では、サンプル・アプリケーションを拡張し、新しい従業員レコードを挿入するときに、動的に生成された職務IDと職務名のリストを「ジョブ」フィールドに表示します。

- データベースでのパッケージの作成

- データベース・ファンクションの作成

- メソッドからのREF CURSORのコール

- 動的に生成されたリストの表示

これを行うには、REF CURSORを使用して、職務の結果セットをJobs表から取得するデータベース・ファンクションGET_JOBSを作成します。新しいJavaメソッドgetJobsは、このデータベース・ファンクションをコールして結果セットを取得します。

6.3.3.1 データベースでのパッケージの作成

次の手順では、データベースで新しいパッケージを作成して、REF CURSOR宣言を保持します。

1. 「DatabaseNavigatorName」タブを選択して、ナビゲータで表示します。

2. Connection1ノードを開いて、データベース・オブジェクトのリストを表示します。「パッケージ」にスクロールします。「パッケージ」を右クリックし、「新規パッケージ」を選択します。

3. 「PL/SQLパッケージ作成」ダイアログ・ボックスで、名前としてJOBSPKGと入力します。「OK」をクリックします。パッケージの定義がソース・エディタに表示されます。

4. 行/* TODO enter package declarations (types, exceptions, methods etc) here */を次の行に置き換えて、次のようにREF CURSORを宣言します。

TYPE ref_cursor IS REF CURSOR;

5. パッケージを保存します。

例6-10に、パッケージのコードを示します。

例6-10 データベースでのパッケージの作成

CREATE OR REPLACE
PACKAGE JOBSPKG AS
TYPE ref_cursor IS REF CURSOR;
END;

6.3.3.2 データベース・ファンクションの作成

次の手順では、REF CURSORを使用して、職務の結果セットをJobs表から取得するデータベース・ファンクションGET_JOBSを作成します。

1. データベース・ナビゲータで、必要なノードを再度開いて、HRデータベースのオブジェクトを表示します。「ファンクション」を右クリックし、ショートカット・メニューで「新規関数」を選択します。

2. 「PL/SQLファンクション作成」ダイアログ・ボックスで、名前としてGET_JOBSと入力します。「OK」をクリックします。GET_JOBSファンクションの定義がソース・エディタに表示されます。

3. ファンクション定義の最初の行で、VARCHAR2のかわりに、戻り値としてJobsPkg.ref_cursorを指定します。

4. ASキーワードの後に、次のように入力します。

jobs_cursor JobsPkg.ref_cursor;

5. BEGINブロックで、次のコードを入力して現在の内容を置き換えます。

OPEN jobs_cursor FOR
SELECT job_id, job_title FROM jobs;
RETURN jobs_cursor;

6. ファンクションを保存します。

例6-11に、ファンクションのコードを示します。

例6-11 ストアド・ファンクションの作成

CREATE OR REPLACE FUNCTION GET_JOBS
RETURN JobsPkg.ref_cursor
AS jobs_cursor JobsPkg.ref_cursor;
BEGIN
OPEN jobs_cursor FOR
SELECT job_id, job_title FROM jobs;
RETURN jobs_cursor;
END;

6.3.3.3 メソッドからのREF CURSORのコール

次の手順では、GET_JOBSファンクションをコールして結果セットを取得するJavaメソッドgetJobsをDataHandlerクラスに作成します。

1. DataHandler.javaがまだ開いていない場合は、ダブルクリックしてソース・エディタで開きます。

2. メソッド宣言を入力します。

public ResultSet getJobs() throws SQLException {

}

3. メソッド本体で、データベースに接続します。

getDBConnection();

4. 接続に続いて、新しい変数jobqueryを宣言します。

String jobquery = "begin ? := get_jobs; end;";

5. prepareCallメソッドを使用して、CallableStatementを作成します。

CallableStatement callStmt = conn.prepareCall(jobquery);

6. Oracle固有の型を使用して、OUTパラメータの型を登録します。

callStmt.registerOutParameter(1, OracleTypes.CURSOR);

7. Oracle固有の型を使用することを指定すると、[Alt]+[Enter]キーを押してoracle.jdbc.OracleTypesをインポートすることを求めるメッセージが表示されます。[Alt]+[Enter]キーを押した後、表示されるリストでOracleTypes(oracle.jdbc)を選択します。

8. 文を実行して結果セットを返します。

callStmt.execute();
rset = (ResultSet)callStmt.getObject(1);

9. ここまでに入力したコードをtryブロックで囲みます。

10. 例外を捕捉するためのcatchブロックを追加し、logExceptionメソッドもコールします。

catch ( SQLException ex ) {
logException( ex );
}

11. catchブロックを閉じた後で、結果セットを返します。

return rset;

12. 構文エラーをチェックするためのファイルを作成します。

getJobsメソッドのコードを次に示します。

public ResultSet getJobs() throws SQLException {
try {
getDBConnection();
String jobquery = "begin ? := get_jobs; end;";
CallableStatement callStmt = conn.prepareCall(jobquery);
callStmt.registerOutParameter(1, OracleTypes.CURSOR);
callStmt.execute();
rset = (ResultSet)callStmt.getObject(1);
} catch ( SQLException ex ) {
logException( ex );
}
return rset;
}

6.3.3.4 動的に生成されたリストの表示

職務IDと職務名のリストを挿入ページに表示するリストを作成するには、職務IDと職務名をハードコードします。次の手順では、これを前の項で作成したREF CURSORから提供される動的生成リストに置き換えます。

1. insert.jspが開いていない場合は、アプリケーション・ナビゲータのビジュアル・エディタでダブルクリックして開きます。

2. ページの左上隅にある「Page Directive」をクリックして選択します。「プロパティ・インスペクタ」にPage Directiveのプロパティが表示されます。

3. インポートフィールドの隣にある下矢印をクリックします。プロパティの編集: インポートダイアログ・ボックスが表示されます。「階層」タブを選択し、「Java」および「SQL」フォルダをそれぞれ展開してからResultSetを選択します。「OK」をクリックします。

4. 「Page Directive」の隣のページにスクリプトレットをドラッグします。「スクリプトレットの挿入」ダイアログ・ボックスで、次のコードを追加し、getJobsメソッドを実行して、職務のリストを含む結果セットを返します。

ResultSet rset = empsbean.getJobs();

5. ページでListBoxコンポーネント(フォームに職務を入力するためのコンポーネント)を選択し、JSPのコンポーネント・パレットの「スクリプトレット」をクリックします。(この場合、スクリプトレットをページにドラッグ・アンド・ドロップする必要はありません。)「スクリプトレットの挿入」ダイアログ・ボックスが表示されます。

6. 次のコードを「スクリプトレットの挿入」ダイアログ・ボックスに入力します。「OK」をクリックします。

while (rset.next ())
{
out.println("<option value=" + rset.getString("job_id") + ">" +
rset.getString("job_title") + "</option> "  );
}

7. 次のように、ハードコードされた値を削除します。
ListBoxコンポーネントが選択された状態のまま、「構造」ウィンドウで「ジョブ」フィールドにスクロールします。selectキーワードの下のハードコードされたオプションのリストを確認します。各オプションを削除しますが、スクリプトレットは保持されることを確認します。

図6-3 ListBoxオプションの構造の表示

8. ページを保存します。

ここで、アプリケーションを実行し、クリックして新しい従業員を挿入し、リストを使用して選択可能な職務のリストを表示します。図6-4に、ブラウザでの動的な職務のリストを示します。

図6-4 ブラウザで動的に生成されたリスト

7 Oracle Database 12c リリース1 (12.1)からの切断

JDeveloperでのデータベースからの切断は簡単な操作ですが、Javaアプリケーションでは単独のプロセスではありません。アプリケーションでは、ResultSet、StatementおよびConnectionオブジェクトを使用した後、それらをすべて明示的にクローズする必要があります。Connectionオブジェクトをクローズすると、データベースから切断されます。closeメソッドによって、メモリーがクリーンアップされ、データベース・カーソルが解放されます。そのため、ResultSetおよびStatementオブジェクトを明示的にクローズしないと、重大なメモリー・リークが発生する場合があり、データベース内のカーソルを使い果たすことがあります。その後、接続をクローズする必要があります。

この章は次の項で構成されています。

- オープンしたすべてのオブジェクトをクローズするメソッドの作成

- アプリケーションでのオープンしたオブジェクトのクローズ

7.1 オープンしたすべてのオブジェクトをクローズするメソッドの作成

次の手順では、closeAllメソッドをDataHandlerクラスに追加します。

1. アプリケーション・ナビゲータでDataHandler.javaをダブルクリックして、Javaソース・エディタで開きます。

2. DataHandlerクラスの最後で、次のようにcloseAllメソッドを宣言します。

public void closeAll() {

}

3. ソッド本体で、次のようにResultSet オブジェクトがオープンしているかどうかを確認します。

if ( rset != null ) {

4. オープンしている場合は、次のようにクローズして例外を処理します。

try { rset.close(); } catch ( Exception ex ) {}
rset = null;
}

5. Statementオブジェクトに同じ操作を繰り返します。

if ( stmt != null ) {
try { stmt.close(); } catch ( Exception ex ) {}
stmt = null;
}

6. 最後に、Connectionオブジェクトをクローズします。

if ( conn != null ) {
try { conn.close(); } catch ( Exception ex ) {}
conn = null;
}

完成したcloseAllメソッドは、例7-1のようになります。

例7-1 オープンしたすべてのオブジェクトをクローズするメソッドの作成

public void closeAll() {

if ( rset != null ) {
try { rset.close();
}
catch ( Exception ex ) {}
rset = null;
}

if ( stmt != null ) {
try {
stmt.close();
}
catch ( Exception ex ) {}
stmt = null;
}

if ( conn != null ) {
try {
conn.close();
}
catch ( Exception ex ) {}
conn = null;
}
}

7.2 アプリケーションでのオープンしたオブジェクトのクローズ

ResultSet、StatementおよびConnectionオブジェクトは、使い終わった後クローズする必要があります。DataHandlerクラスでは、挿入、更新および削除メソッドでは、戻る前にこれらのオブジェクトをクローズする必要があります。問合せメソッドでは、employees.jspページが問合せによって返された行の処理を終了するまで、これらのオブジェクトをクローズできないことに注意してください。

次の手順では、DataHandler.javaファイルでcloseAllメソッドへの適切なコールを追加します。

1. Javaソース・エディタでDataHandler.javaを開きます。

2. addEmployeeメソッドの最後で、catchブロックの閉じカッコの後、finallyブロックでcloseAllメソッドへのコールを追加します。

finally {
closeAll();
}

3. 同じコールをaddEmployeeSP、deleteEmployeeById、findEmployeeById、updateEmployeeおよびauthenticateUserメソッドに追加します。

4. ビジュアル・エディタでemployees.jspファイルを開きます。Employees表内のスクリプトレットを検索し、ダブルクリックして「スクリプトレットの挿入」ダイアログ・ボックスを開きます。

5. 次の文をwhileループの後に追加します。

empsbean.closeAll();

6. 作業内容を保存し、アプリケーションをコンパイルおよび実行して、すべて正しく動作することを確認します。

8 ユニバーサル接続プールの作成

接続プールは、データベース接続オブジェクトのキャッシュです。オブジェクトは、アプリケーションでデータベースへの接続に使用できる物理的なデータベース接続を表します。実行時に、アプリケーションはプールに接続をリクエストします。リクエストを満たすことができる接続がプールにある場合、その接続がアプリケーションに戻されます。接続が見つからない場合は、新しい接続が作成されてアプリケーションに戻されます。アプリケーションは、その接続を使用してデータベースで処理を実行した後、オブジェクトをプールに返します。その接続は次の接続リクエストに使用できます。

Universal Connection Pool (UCP) for JDBCは、JDBC接続をキャッシュするための接続プールを実装します。データベース集約型のJavaアプリケーションでは、この接続プールを使用することでパフォーマンスが向上し、システム・リソースをより効率的に利用します。UCP JDBC接続プールでは任意のJDBCドライバを使用して物理接続を作成することができ、作成した接続はプールで管理されます。このプールは構成可能で、アプリケーションのパフォーマンス要件や可用性要件に基づいてプールの動作を最適化するために使用するプロパティが一とおり用意されています。さらに高度なアプリケーションでは、UCP for JDBCのプール・マネージャを使用して、プール・インスタンスを管理できます。

関連項目:
『Oracle Universal Connection Pool for JDBC開発者ガイド』

この章では、ユニバーサル接続プールの作成方法について説明します。この章は次の項で構成されています。

- JDeveloperプロジェクト・プロパティの設定

- 株価表示機アプリケーションの作成

- 出力の監視

8.1 JDeveloperプロジェクト・プロパティの設定

ユニバーサル接続プールを作成するには、次の手順を実行し、JDeveloperプロジェクトのプロパティを最初に設定する必要があります。

1. 「アプリケーション」メニューから「デフォルト・プロジェクト・プロパティ」を選択します。

図8-1 デフォルト・プロジェクト・プロパティの設定

2. 「デフォルト・プロジェクト・プロパティ」画面の左パネルにある「ライブラリとクラスパス」をクリックします。

図8-2 「ライブラリとクラスパス」の設定

3. 「デフォルト・プロジェクト・プロパティ」画面の右ペインにある「Jar/ディレクトリの追加」をクリックします。
「アーカイブまたはディレクトリの追加」画面が表示されます。

4. $ORACLE_HOME/ucp/libフォルダ内のucp.jarファイルを選択し、「選択」をクリックします。

図8-3 「アーカイブまたはディレクトリの追加」画面

5. 「OK」をクリックします。

8.2 株価表示機アプリケーションの作成

次の例は、ユニバーサル接続プールを使用してデータベースから株価情報を取得する株価表示機アプリケーションです。この例を使用して、ユニバーサル接続プールのプロパティを表示したり、プール・インスタンスをシャットダウンすることなく実行時にプロパティを変更したり、ユニバーサル接続の統計を表示したりなどの操作を実行できます。この例を実行する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」パネルで、「新規アプリケーション」をクリックします。

図8-4 「アプリケーション・ナビゲータ」パネルのオプション

2. 「アプリケーションの名前付け」画面で、「アプリケーション名」としてStockTickerAppと入力し、「次へ」をクリックします。

3. 「プロジェクトの名前付け」画面で、「プロジェクト名」としてStockTickerProjと入力し、「終了」をクリックします。

4. 「ファイル」メニューから「開く」をクリックします。

5. UCPDemo.java、ClientSimulator.java、DBConfig.java、HttpServer.javaおよびDbConfig.propertiesファイルを選択し、「開く」をクリックします。

6. DbConfig.propertiesファイルで、ユーザー名、パスワードおよびOracle DatabaseのURLの情報が正しいことを確認します。

図8-5 コード・エディタ内のDbConfig.propertiesファイル

7. コード・エディタで「UCPDemo.java」タブを右クリックし、「StockTickerProj.jprに追加」を選択します。

図8-6 プロジェクトへのソース・ファイルの追加

8. 「プロジェクト・コンテンツに追加」画面で、コンテンツ・パスのデフォルト値を維持したまま、「OK」をクリックします。

図8-7 「プロジェクト・コンテンツに追加」

9. ClientSimulator.java、DBConfig.java、HttpServer.javaおよびDbConfig.propertiesファイルについて、手順7および8を繰り返し、これらのファイルをStockTickerProjプロジェクトに追加します。

10. 「アプリケーション・ナビゲータ」ウィンドウでUCPDemo.javaファイルを右クリックし、「メイク」をクリックします。

11. 「実行」メニューから「アクティブな実行構成を選択」を選択し、「実行構成の管理」を選択します。

図8-8 「実行」メニューのオプション

12. 「プロジェクト・プロパティ」画面で、StockTickerProjプロジェクトの「編集」をクリックします。

図8-9 StockTickerProjプロジェクトの「プロジェクト・プロパティ」画面

「実行構成の編集」画面が表示されます。

13. 「プログラムの引数」フィールドに、8067またはシステム上の空きポートを入力し、「OK」をクリックします。

図8-10 「実行構成の編集」画面

14. 「OK」をクリックし、「プロジェクト・プロパティ」画面を終了します。

15. 「アプリケーション・ナビゲータ」ウィンドウでUCPDemo.javaファイルを右クリックし、「実行」をクリックします。

8.3 出力の監視

アプリケーションを実行すると、最初の数秒間で株価データがデータベースに保存されます。図8-11のように、...ready to go!というメッセージが画面に出力されるまで待ちます。

図8-11 JDeveloperログ内の株価表示機アプリケーションの出力

メッセージが表示された後、UCPデモ・サーバーが起動し実行状態になるため、このサーバーを次の手順で使用できます。

1. ブラウザのアドレス・バーに、次のURLを入力します。
http://localhost:8067

ユニバーサル接続プール・デモ・ページが表示されます。

図8-12 ブラウザを使用したユニバーサル接続プールからの情報取得

2. Try the Demo:セクションの下にあるリンクをクリックし、データベースから株価情報を取得します。
UCPプロパティを表示するには、Show UCP Propertiesをクリックします。

図8-13 UCPプロパティ・ページ

Get Stock Price from Databaseをクリックして株価表示機を実行します。

図8-14 ブラウザ上の株価表示機ページ

UCP統計を表示するには、Show UCP Statisticsをクリックします。

図8-15 ブラウザ上のUCP統計ページ

UCPプロパティを更新するには、Dynamically Reconfigure UCP Propertiesをクリックします。

注意:
Dynamically Reconfigure UCP Propertiesリンクをクリックすると、ブラウザ上でUCPプロパティを変更できます。ただし、関係するデータベースが単一インスタンス・データベースでないプロパティを設定しようとすると、例外がスローされることがあります。

図8-16 ブラウザ上のUCPプロパティ更新ページ

サービスを同時使用する多数の株価表示機クライアントをシミュレートするには、Run Massive Website Client Access Simulationをクリックします。

図8-17 ブラウザ上のクライアント・シミュレータ・ページ

このページには次のフィールドが含まれています。

フィールド

説明

Ticket server URL

表示機WebサービスのURLを指定します。

Number of simulated users (threads) to run

実行する同時スレッドの数を指定します。

Number of ticket requests per user

各スレッドで実行する表示機リクエストの数を指定します。

9 グローバル・アプリケーションの構築

様々なロケールをサポートするグローバル・インターネット・アプリケーションを構築するには、適切な開発の実施が必要です。ロケールとは、各国の言語およびその言語が話される地域のことです。アプリケーション自体で、ユーザーのロケール設定を認識し、ユーザーが期待する文化的な慣習に従って、内容を表示する必要があります。正しい日付書式や数値書式を使用するなど、適切なロケール特性でデータを表示することが重要です。Oracle Database 12c リリース1 (12.1)は完全に国際化されており、グローバル・アプリケーションを開発およびデプロイするためのグローバル・プラットフォームを提供します。

この章では、JavaおよびOracle Database 12c リリース1 (12.1)環境でのグローバル・アプリケーション開発について説明します。グローバル・インターネット・アプリケーションの開発およびデプロイに関連する基本タスク、すなわちロケール認識の開発、ユーザー設定言語でのHTMLコンテンツの構築、ユーザー・ロケールの文化的な慣習に従ったデータの表示などについて説明します。

この章では、次の項目について説明します。

- ロケール認識の開発

- ユーザー・ロケールの判別

- HTMLページのエンコーディング

- HTMLページのコンテンツを翻訳するための構成

- ユーザー・ロケールの表記規則によるデータの表示

- JDeveloperでのJSPページのテキストのローカライズ

9.1 ロケール認識の開発

グローバル・インターネット・アプリケーションでは、ユーザー・ロケールを認識する必要があります。日付、時間、通貨の書式設定など、ロケールに依存する機能はJavaやSQLなどのプログラミング環境に組み込まれています。アプリケーションではロケールに依存する機能を使用して、ユーザー・ロケールの文化的な慣習に従って、HTMLページを書式設定できます。

プログラミング環境によって、ロケールを表す方法は異なります。たとえば、フランス語(カナダ)のロケールは、次のように表されます。

環境

表記

ロケール

説明

Java

Javaロケール・オブジェクト

fr_CA

Javaでは、ISOの言語コードおよび国コードを使用します。
frはISO 639規格で定義された言語コードです。CAはISO 3166規格で定義された国コードです。

SQLおよびPL/SQL

NLS_LANGUAGEおよびNLS_TERRITORYパラメータ

NLS_LANGUAGE ="CANADIAN FRENCH"
NLS_TERRITORY ="CANADA"

『Oracle Database 2日で開発者ガイド』の「グローバル環境での作業」を参照してください。

表9-1に、一般的に使用されるロケールのJavaおよびOracle環境での定義を示します。

表9-1 Java、SQLおよびPL/SQLプログラミング環境でのロケール表記

ロケール

Java

NLS_LANGUAGE、NLS_TERRITORY

中国語(中国)

zh_CN

SIMPLIFIED CHINESE、CHINA

中国語(台湾)

zh_TW

TRADITIONAL CHINESE、TAIWAN

英語(アメリカ)

en_US

AMERICAN、AMERICA

英語(イギリス)

en_GB

ENGLISH、UNITED KINGDOM

フランス語(カナダ)

fr_CA

CANADIAN FRENCH、CANADA

フランス語(フランス)

fr_FR

FRENCH、FRANCE

ドイツ語(ドイツ)

de_DE

GERMAN、GERMANY

イタリア語(イタリア)

it_IT

ITALIAN、ITALY

日本語(日本)

ja_JP

JAPANESE、JAPAN

韓国語(韓国)

ko_KR

KOREAN、KOREA

ポルトガル語(ブラジル)

pt_BR

BRAZILIAN PORTUGUESE、BRAZIL

ポルトガル語(ポルトガル)

pt_PT

PORTUGUESE、PORTUGAL

スペイン語(スペイン)

es_ES

SPANISH、SPAIN

異なるプログラミング環境をまたいでグローバル・アプリケーションを記述する場合、ユーザーのロケール設定を環境間で同期化する必要があります。たとえば、PL/SQLプロシージャをコールするJavaアプリケーションでは、Javaロケールを対応するNLS_LANGUAGEおよびNLS_TERRITORY値にマッピングし、ユーザー・ロケールが一致するようにパラメータ値を変更してから、PL/SQLプロシージャをコールする必要があります。

9.1.1 OracleとJavaロケール間のマッピング

Oracle Globalization Development Kit(GDK)では、LocaleMapperクラスが提供されています。Java、IANA、ISO、Oracle間で、等価のロケールおよびキャラクタ・セットがマッピングされます。Javaアプリケーションが、Oracleロケール名で指定されたロケール情報をクライアントから受け取る場合があります。Javaアプリケーションで情報を正しく処理するには、等価のJavaロケールにマッピングできる必要があります。

例9-1に、LocaleMapperクラスの使用方法を示します。

例9-1 JavaロケールからOracleの言語および地域へのマッピング

Locale locale = new Locale("fr", "CA");
String oraLang = LocaleMapper.getOraLanguage(locale);
String oraTerr = LocaleMapper.getOraTerritory(locale);

GDKは、Oracleアプリケーション開発者にグローバル・インターネット・アプリケーションの開発フレームワークを提供する、一連のJava Application Program Interface(API)です。GDKによって、Javaの既存のグローバリゼーション機能が補完されます。中間層JavaアプリケーションとOracle Database間のロケール動作が同期化されます。

9.2 ユーザー・ロケールの判別

グローバル環境では、ロケール設定が異なるユーザーをアプリケーションで受け入れる必要がある場合があります。ユーザーの優先ロケールを判別します。優先ロケールがわかったら、アプリケーションはそのロケールの言語を使用してHTMLコンテンツを構築し、そのロケールの文化的な慣習に従う必要があります。

ユーザー・ロケールを判別する最も一般的な方法の1つは、ユーザーのブラウザのデフォルトのISOロケール設定に基づきます。通常、ブラウザはロケール設定をAccept-Language HTTPヘッダーを使用してHTTPサーバーに送信します。このヘッダーがNULLに設定されている場合、使用できるロケール設定情報がないため、アプリケーションは、理論上は事前定義されたアプリケーションのデフォルト・ロケールにフォールバックする必要があります。

JSPページとJavaサーブレットの両方で、例9-2に示すように、サーブレットAPIへのコールを使用してAccept-Language HTTPヘッダーを取得できます。

例9-2 JavaでのAccept-Languageヘッダーを使用したユーザー・ロケールの判別

String lang = request.getHeader("Accept-Language")
StringTokenizer st = new StringTokenizer(lang, ",")
if (st.hasMoreTokens()) userLocale = st.nextToken();

このコードはAccept-LanguageヘッダーをHTTPリクエストから取得し、最初のISOロケールを抽出した後、そのISOロケールをユーザー設定ロケールとして使用します。

9.2.1 Javaアプリケーションでのロケール認識

Javaロケール・オブジェクトは、対応するユーザーのロケールをJavaで表します。ロケールに使用されるJavaエンコーディングは、Java文字列とバイト・データ間で正しく変換する必要があります。Javaコードでユーザー・ロケールを認識する場合は、ロケールのJavaエンコーディングを考慮する必要があります。JavaメソッドでJavaロケールおよびエンコーディングを認識させるには、次の2つの方法があります。

- メソッドのデフォルトのJavaロケールおよびデフォルトのJavaエンコーディングを使用する

- メソッドのJavaロケールおよびJavaエンコーディングを明示的に指定する

グローバル・アプリケーションを開発する場合は、2番目の方法を採用し、現在のユーザー・ロケールに対応するJavaロケールおよびJavaエンコーディングを明示的に指定することをお薦めします。例9-3に示すように、getDateTimeInstanceメソッドで、ユーザー・ロケール(user_locale)に対応するJavaロケール・オブジェクトを指定できます。

例9-3 Javaでのユーザー・ロケールの明示的な指定

DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, user_locale);
dateString = df.format(date); /* Format a date */

9.3 HTMLページのエンコーディング

HTMLページのエンコーディングは、ブラウザおよびインターネット・アプリケーションにとって重要な情報です。ページ・エンコーディングは、インターネット・アプリケーションがサービスを提供するロケールに使用されるキャラクタ・セットです。ブラウザでは、正しいフォントおよびキャラクタ・セット・マッピング表を使用してHTMLページを表示できるように、ページ・エンコーディングを認識する必要があります。インターネット・アプリケーションでは、HTMLフォームからの入力を処理できるように、HTMLページ・エンコーディングを認識する必要があります。

異なるロケールに異なるネイティブ・エンコーディングを使用するかわりに、すべてのページ・エンコーディングにUTF-8(Unicodeエンコーディング)を使用することをお薦めします。UTF-8エンコーディングを使用すると、グローバル・アプリケーションのコーディングが簡単になるだけでなく、単一ページで多言語のコンテンツを配置できるようになります。

この項では、次の項目について説明します。

- HTMLページのページ・エンコーディングの指定

- JavaサーブレットおよびJSPページでのページ・エンコーディングの指定

9.3.1 HTMLページのページ・エンコーディングの指定

HTMLページのエンコーディングを指定するには、2つの方法があります。1つはHTTPヘッダーで指定する方法、もう1つはHTMLページ・ヘッダーで指定する方法です。

HTTPヘッダーでのエンコーディングの指定

Content-Type HTTPヘッダーをHTTP指定に含めます。例9-4に示すように、コンテンツ・タイプおよびキャラクタ・セットを指定します。

例9-4 HTTP指定でのページ・エンコーディングの指定

Content-Type: text/html; charset=utf-8

charsetパラメータでは、HTMLページのエンコーディングを指定します。charsetパラメータに指定できる値は、ブラウザがサポートする文字エンコーディングのIANA名です。

HTMLページ・ヘッダーでのエンコーディングの指定

この方法は、主に静的なHTMLページに対して使用します。例9-5に示すように、HTMLヘッダーで文字エンコーディングを指定します。

例9-5 HTMLページでのページ・エンコーディングの指定

<meta http-equiv="Content-Type" content="text/html;charset=utf-8">

charsetパラメータでは、HTMLページのエンコーディングを指定します。Content-Type HTTPヘッダーと同様に、charsetパラメータに指定できる値は、ブラウザがサポートする文字エンコーディングのIANA名です。

9.3.2 JavaサーブレットおよびJSPページでのページ・エンコーディングの指定

contentTypeページ・ディレクティブを使用して、JavaServer Pages (JSP)ファイルのContent-Type HTTPヘッダーでHTMLページのエンコーディングを指定できます。次に例を示します。

<%@ page contentType="text/html; charset=utf-8" %>

このエンコーディングは、クライアントへの応答用にJSPファイルが使用するMIMEタイプおよび文字エンコーディングです。JSPコンテナに有効な任意のMIMEタイプまたはIANAキャラクタ・セット名を使用できます。デフォルトのMIMEタイプはtext/htmlであり、デフォルトのキャラクタ・セットはISO-8859-1です。前述の例では、キャラクタ・セットはUTF-8に設定されています。contentTypeページ・ディレクティブのキャラクタ・セットによって、JSPエンジンに対し、動的なHTMLページをエンコードし、指定されたキャラクタ・セットでHTTP Content-Typeヘッダーを設定するように指示されます。

Javaサーブレットの場合、Servlet APIのsetContentTypeメソッドをコールして、HTTPヘッダーでページ・エンコーディングを指定できます。例9-6のdoGet関数は、このメソッドのコール方法を示しています。

例9-6 setContentTypeを使用したサーブレットでのページ・エンコーディングの指定

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{

// generate the MIME type and character set header
response.setContentType("text/html; charset=utf-8");

...

// generate the HTML page
Printwriter out = response.getWriter();
out.println("<HTML>");

...

out.println("</HTML>");
}

getWriterメソッドは、setContentTypeメソッド・コールで指定されたキャラクタ・セットを使用する出力ストリーム・ライターを初期化するので、getWriterメソッドの前にsetContentTypeメソッドをコールする必要があります。ライターに書き込まれ最終的にブラウザに書き込まれるすべてのHTMLコンテンツは、setContentTypeコールで指定されたエンコーディングによってエンコードされます。

9.4 HTMLページのコンテンツを翻訳するための構成

ユーザー・インタフェースをユーザーのローカル言語で表示できるようにすることは、アプリケーションのグローバル化に関する基本タスクの1つです。HTMLページのコンテンツの翻訳可能なソースは、次のカテゴリに分類されます。

- アプリケーション・コード内にハードコードされたテキスト文字列

- 静的なHTMLファイル、イメージ・ファイル、テンプレート・ファイル(CSSなど)

- データベースに格納された動的データ

この項では、翻訳可能なコンテンツの外部化について説明します。内容は次のとおりです。

- JavaサーブレットおよびJSPページの文字列

- 静的ファイル

- データベースからのデータ

9.4.1 JavaサーブレットおよびJSPページの文字列

JavaサーブレットとJSPページ内の翻訳可能な文字列をJavaリソース・バンドルに外部化して、これらのリソース・バンドルがJavaコードから独立して翻訳できるようにする必要があります。翻訳後、リソース・バンドルは英語のバンドルと同じベース・クラス名になりますが、Javaロケール名が接尾辞として付けられます。英語のリソース・バンドルと同じディレクトリにバンドルを配置して、Javaリソース・バンドルの参照メカニズムが正常に機能するようにする必要があります。

関連項目:

http://docs.oracle.com/javase/7/docs/api/java/util/ResourceBundle.html

多言語アプリケーションではユーザー・ロケールは固定ではないため、ユーザー・ロケールに対応するJavaロケール・オブジェクトを明示的に指定し、getBundleメソッドをコールする必要があります。次の例では、Javaロケール・オブジェクトはuser_localeです。

ResourceBundle rb = ResourceBundle.getBundle("resource", user_locale);
String helloStr = rb.getString("hello");

前述のコードは、ユーザー設定ロケールに対応するリソース・バンドルから、テキスト文字列helloのローカライズされたバージョンを取得します。

関連項目:
Javaでのリソース・バンドルの作成の詳細は、「JDeveloperでのJSPページのテキストのローカライズ」を参照してください。

9.4.2 静的ファイル

HTMLやGIFなどの静的ファイルは、すぐに翻訳できます。これらのファイルを翻訳するときは、UTF-8をファイル・エンコーディングとして、対応する言語に翻訳する必要があります。翻訳されたファイルの言語を区別する場合、異なる言語の静的ファイルは異なるディレクトリに格納するか、または異なるファイル名で格納することができます。

9.4.3 データベースからのデータ

JSPページを使用するかJavaサーブレットを使用するかに関係なく、製品名や製品の説明などの動的な情報は、多くの場合データベースに格納されています。様々な翻訳を区別するには、この情報を保持するデータベース・スキーマに情報の言語を示す列を含める必要があります。翻訳された情報を選択するには、問合せにWHERE句を含めて、問合せの希望する言語で情報を選択する必要があります。

9.5 ユーザー・ロケールの表記規則によるデータの表示

アプリケーション内のデータは、ユーザーが予期したとおりに表示される必要があります。そうでないと、データの意味が誤って解釈される可能性があります。たとえば、12/11/05は、アメリカ合衆国では2005年12月11日を意味するのに対して、イギリスでは2005年11月12日を意味します。このような混乱は、数値や通貨の書式にも存在します。たとえば、ピリオド(.)はアメリカ合衆国では小数区切りですが、ドイツでは3桁ごとの区切り文字として使用されています。

ソートのルールは言語によって異なり、アルファベットの文字の順序に従う言語、文字の画数に従う言語、単語の発音に従う言語などがあります。ユーザーが慣れている言語順序でソートされていないデータを表示すると、情報の検索が難しくなり、時間がかかることがあります。

アプリケーションのロジックおよびデータベースから取得されるデータ量によっては、アプリケーション・レベルではなくデータベース・レベルでデータを書式設定する方が適切な場合があります。Oracle Database 12c リリース1 (12.1)には、ユーザーのロケール設定がわかっているときにデータの表示を調整するのに役立つ多くの機能があります。次の項では、SQLでのロケールに依存する操作の例について説明します。

- Oracleの日付書式

- Oracleの数値書式

- Oracleの言語ソート

- Oracleのエラー・メッセージ

9.5.1 Oracleの日付書式

Oracle Database 12c リリース1 (12.1)には、3つの異なる日付表示書式があります。標準の日付、短い日付および長い日付です。例9-7に、アメリカ合衆国とドイツにおける短い日付書式と長い日付書式の違いを示します。

例9-7 ロケールによる日付書式の違い(アメリカ合衆国とドイツ)

SQL> ALTER SESSION SET NLS_TERRITORY=america NLS_LANGUAGE=american;

Session altered.

SQL> SELECT employee_id EmpID,
2  SUBSTR(first_name,1,1)||'.'||last_name "EmpName",
3  TO_CHAR(hire_date,'DS') "Hiredate",
4  TO_CHAR(hire_date,'DL') "Long HireDate"
5  FROM employees
6* WHERE employee_id <105;

EMPID EmpName                     Hiredate   Long HireDate
---------- --------------------------- ---------- -----------------------------
100 S.King                      06/17/1987 Wednesday, June 17, 1987
101 N.Kochhar                   09/21/1989 Thursday, September 21, 1989
102 L.De Haan                   01/13/1993 Wednesday, January 13, 1993
103 A.Hunold                    01/03/1990 Wednesday, January 3, 1990
104 B.Ernst                     05/21/1991 Tuesday, May 21, 1991

SQL> ALTER SESSION SET SET NLS_TERRITORY=germany NLS_LANGUAGE=german;

Session altered.

SQL> SELECT employee_id EmpID,
2  SUBSTR(first_name,1,1)||'.'||last_name "EmpName",
3  TO_CHAR(hire_date,'DS') "Hiredate",
4  TO_CHAR(hire_date,'DL') "Long HireDate"
5  FROM employees
6* WHERE employee_id <105;

EMPID EmpName                     Hiredate Long HireDate
---------- --------------------------- -------- ------------------------------
100 S.King                      17.06.87 Mittwoch, 17. Juni 1987
101 N.Kochhar                   21.09.89 Donnerstag, 21. September 1989
102 L.De Haan                   13.01.93 Mittwoch, 13. Januar 1993
103 A.Hunold                    03.01.90 Mittwoch, 3. Januar 1990
104 B.Ernst                     21.05.91 Dienstag, 21. Mai 1991

9.5.2 Oracleの数値書式

例9-8に、アメリカ合衆国とドイツでの小数点文字とグループのセパレータの違いを示します。

例9-8 ロケールによる数値書式の違い(アメリカ合衆国とドイツ)

SQL> ALTER SESSION SET SET NLS_TERRITORY=america;

Session altered.

SQL> SELECT employee_id EmpID,
2  SUBSTR(first_name,1,1)||'.'||last_name "EmpName",
3  TO_CHAR(salary, '99G999D99') "Salary"
4  FROM employees
5* WHERE employee_id <105

EMPID EmpName                     Salary
---------- --------------------------- ----------
100 S.King                       24,000.00
101 N.Kochhar                    17,000.00
102 L.De Haan                    17,000.00
103 A.Hunold                      9,000.00
104 B.Ernst                       6,000.00

SQL> ALTER SESSION SET SET NLS_TERRITORY=germany;

Session altered.

SQL> SELECT employee_id EmpID,
2  SUBSTR(first_name,1,1)||'.'||last_name "EmpName",
3  TO_CHAR(salary, '99G999D99') "Salary"
4  FROM employees
5* WHERE employee_id <105

EMPID EmpName                     Salary
---------- --------------------------- ----------
100 S.King                       24.000,00
101 N.Kochhar                    17.000,00
102 L.De Haan                    17.000,00
103 A.Hunold                      9.000,00
104 B.Ernst                       6.000,00

9.5.3 Oracleの言語ソート

スペインでは、従来から「ch」、「ll」および「ñ」を独自の文字として扱っており、順序としてはそれぞれc、lおよびnの後になります。例9-9に、従業員名ChenおよびChungに対してスペイン語のソートを使用した場合の結果を示します。

例9-9 言語ソートの違い(バイナリとスペイン語)

SQL> ALTER SESSION SET NLS_SORT=binary;

Session altered.

SQL> SELECT employee_id EmpID,
2         last_name "Last Name"
3  FROM employees
4  WHERE last_name LIKE 'C%'
5* ORDER BY last_name

EMPID Last Name
---------- -------------------------
187 Cabrio
148 Cambrault
154 Cambrault
110 Chen
188 Chung
119 Colmenares

6 rows selected.

SQL> ALTER SESSION SET NLS_SORT=spanish_m;

Session altered.

SQL> SELECT employee_id EmpID,
2         last_name "Last Name"
3  FROM employees
4  WHERE last_name LIKE 'C%'
5* ORDER BY last_name

EMPID Last Name
---------- -------------------------
187 Cabrio
148 Cambrault
154 Cambrault
119 Colmenares
110 Chen
188 Chung

6 rows selected.

9.5.4 Oracleのエラー・メッセージ

NLS_LANGUAGEパラメータによって、データベースから返されるデータベース・エラー・メッセージの言語も制御されます。SQL文を送信する前にこのパラメータを設定すると、ローカル言語固有のデータベース・エラー・メッセージがアプリケーションに返されます。

次のサーバー・メッセージについて考えてみます。

ORA-00942: table or view does not exist

NLS_LANGUAGEパラメータをフランス語に設定すると、サーバー・メッセージは次のように表示されます。

ORA-00942: table ou vue inexistante

関連項目:
Oracle Database 12c リリース1 (12.1)のグローバル・サポート機能の詳細は、『Oracle Database 2日でデータベース管理者』の「グローバル環境での作業」の章を参照してください。

9.6 JDeveloperでのJSPページのテキストのローカライズ

Javaアプリケーションでは、リソース・バンドルを使用して、JSPページで使用される、ローカライズされた様々なテキストが提供されています。

リソース・バンドルには、ロケール固有のオブジェクトが含まれています。ロケール固有のリソース(ページに表示するテキストなど)がプログラムで必要な場合は、現在のユーザー・ロケールに適したリソース・バンドルからロードできます。この方法では、実際のテキストをリソース・バンドルに分離することによって、大部分がユーザー・ロケールから独立したプログラム・コードを記述できます。

リソース・バンドル・テクノロジには、次のような特徴があります。

- リソース・バンドルは、メンバーで共通の基準名を共有するファミリに属しますが、名前にはロケールを示す構成要素も追加されます。たとえば、リソース・バンドルのファミリの基準名がMyResourcesであるとします。ドイツ語のロケール固有のバージョンは、MyResources_deなどとなります。

- ファミリ内の各リソース・バンドルには同じ項目が含まれていますが、項目はそのリソース・バンドルによって表されるロケール用に翻訳されています。たとえば、あるボタンで使用されるStringは、MyResourcesではCancelと定義されていますが、MyResources_deではAbbrechenと定義されている場合があります。

- 異なる国の異なるリソースを特殊化できます。たとえば、スイス(CH)のドイツ語(de)などです。

アプリケーションでリソース・バンドルを使用するには、次の手順を実行します。

1. リソース・バンドルを作成します。

2. ビジュアル・コンポーネントがあるページで、そのページで使用するリソース・バンドルを識別します。

3. ページに表示するテキストの各項目について、ハードコードされたテキストを使用するかわりに、リソース・バンドルからテキストを取得します。

関連項目:

http://docs.oracle.com/javase/7/docs/api/java/util/ResourceBundle.html

サンプル・アプリケーションでは、次の場所でリソース・バンドルを使用できます。

- JSPページの見出しおよびラベル。この場合、ページでテキストを直接入力するのではなく、スクリプトレットを使用してテキストを検索できます。

- ボタンなどのコントロールの値。この場合、ボタンのvalueプロパティを、リソース・バンドルからテキストを取得する式に設定します。

この項では、次のタスクについて説明します。

- リソース・バンドルの作成

- JSPページでのリソース・バンドル・テキストの使用

9.6.1 リソース・バンドルの作成

デフォルトのリソース・バンドルを作成するには、次の手順を実行します。

1. クラスjava.util.ListResourceBundleを拡張する新しいJavaクラスMyResourcesを作成します。

2. 次のようにgetContentsメソッドを変更します。

public Object[][] getContents() {
return contents;
}

3. 次のようにオブジェクト配列を宣言します。

static final Object[][] contents = {
};
}

4. ページに含めるテキスト項目1つに対してエントリを1つ追加し、キーおよびキーのテキストを指定します。たとえば次の例では、他の言語に翻訳する必要のある文字列をコメントで示しています。

static final Object[][] contents = {
// LOCALIZE THIS
{"CompanyName", "AnyCo Corporation"},
{"SiteName", "HR Application"},
{"FilterButton", "Filter"},
{"UpdateButton", "Update"},
// END OF MATERIAL TO LOCALIZE
};

完成したリソース・バンドル・クラスは、例9-10のようになります。

例9-10 リソース・バンドル・クラスの作成

public class MyResources extends ListResourceBundle {
public MyResources() {
super();
}

protected Object[][] getContents() {
return contents;
}
static final Object[][] contents = {
// LOCALIZE THIS
{"CompanyName", "AnyCo Corporation"},
{"SiteName", "HR Application"},
{"FilterButton", "Filter"},
{"UpdateButton", "Update this Record"},
// END OF MATERIAL TO LOCALIZE
};
}

アプリケーションをグローバル化するには、サポートする様々なロケールについて、各言語での項目のテキストを含む、ロケール固有のリソース・バンドルを作成する必要があります。

9.6.2 JSPページでのリソース・バンドル・テキストの使用

リソース・バンドルで定義されたテキストをJSPページで使用するには、次の手順を実行します。

1. 使用するJSPページ(edit.jspなど)をビジュアル・エディタで開きます。

2. 最初の見出しの前にjsp:usebeanタグを追加します。IDとしてmyResourcesを入力し、クラスとしてhr.MyResourcesを入力します。「有効範囲」を「セッション」に設定し、「OK」をクリックします。

注意:
この時点でMyResources.javaファイルをコンパイルしていない場合、MyResources.classがまだ作成されていないので、このBean上にエラー記号が表示されます。MyResources.javaファイルをオープンし、コンパイルします。

3. jsp:scriptletをページにドラッグします。最初の見出しのすぐ横など、リソース・バンドル・テキストを表示する場所にドラッグします。
「スクリプトレットの挿入」ダイアログ・ボックスで、次のように、リソース・バンドルからテキストを取得するスクリプトを入力します。

out.println(myResources.getString("CompanyName") + ": " +
myResources.getString("SiteName"));

4. ページの元の見出し(AnyCo Corporation: HR Application)を削除します。

5. ビジュアル・エディタの下の「ソース」タブを選択すると、次のようなページのコードが表示されます。

<jsp:useBean id="myResources" class="hr.MyResources" scope="session"/>
<h2 align="center">
<%  out.println(myResources.getString("CompanyName") + ": " +
myResources.getString("SiteName"));%>
</h2>

6. リソース・バンドル・テキストをボタンのラベルとして使用するには、ビジュアル・エディタでボタンをダブルクリックします。ボタンのプロパティ・ダイアログ・ボックスで、ボタンの「値」パラメータに、次のスクリプトを入力します。

<% out.println(myResources.getString("UpdateButton"));%>

7. ページのソース・コードを表示すると、次のようなコードが表示されます。

<input type="submit"
value=<% out.println(myResources.getString("UpdateButton"));%> />

ここでアプリケーションを実行すると、リソース・バンドルで定義したテキストがページに表示されます。

索引
A  B  C  D  E  F  G  H  I  J  L  N  O  P  Q  R  S  T  U  W  X

A

結果セットでの絶対位置指定, 4.1.3.1

アクセッサ・メソッド, 5.1.2

Apache Tomcat, 2.1.4

アプリケーション・ナビゲーション, 5.6

HTML送信ボタン, 5.6

jsp

forwardタグ, 5.6

アプリケーション・ナビゲータ, 3.2.1

使用, 3.2.1

B

バインド変数, 6.1.1

IN, OUTおよびIN OUTパラメータ, 6.1.3

OracleCallableStatement, 6.1.3

OraclePreparedStatement, 6.1.3

使用, 6.1.3

C

CLASSPATH, 2.2.2, 2.2.2

CLI, 1

オブジェクトのクローズ

アプリケーション, 7.2

closeAllメソッド, 7.1, 7.1, 7.2

Connection, 7.1

DataHandler, 7.1

DataHandler.java, 7.2

employees.jsp, 7.2

ResultSet, 7.1

Statement, 7.1

コンポーネント・パレット, 1.2.2 JDeveloperからの接続

ドライバ, 指定, 3.1.2

ホスト名, 指定, 3.1.2

JDBCポート, 指定, 3.1.2

サービス名, 指定, 3.1.2

Oracle Database 12c リリース1への接続

DataSourceオブジェクト, 3.3.1

デフォルト・サービス, 3.3.2.1

getDBConnection, 3.3.1

Javaの使用, 3.3, 3.3.1

JDeveloperの使用, 1.2

Oracle Database 12c リリース1への接続

概要, 3.3.1

Connectionオブジェクト

DataSource, 3.3.1

DriverManager, 3.3.1

CSS

コンポーネントのリスト, 4.3.4

カーソル変数

REF CURSOR, 6.3

使用, 6.3

D

データベース・ナビゲータ, 3.1.2

データの表示, 3.1.3

データベース・オブジェクト, 編集, 3.1.3

表のデータ, 表示, 3.1.3

表定義, 表示, 3.1.3

データベースURL, 3.3.2

database_specifier, 3.3.2

driver_type, 3.3.2

構文, 3.3.2

Thinスタイルのサービス名, 3.3.2

DataHandler.java, 1.3, 4.2.1 Datasourceオブジェクト

プロパティ, 3.3.1

urlプロパティ, 3.3.1

DataSourceオブジェクト, 3.3.1

databaseName, 3.3.1

dataSourceName, 3.3.1

説明, 3.3.1

driverType, 3.3.1

networkProtocol, 3.3.1

パスワード, 3.3.1

portNumber, 3.3.1

プロパティ, 3.3.1

serverName, 3.3.1

url, 3.3.1

ユーザー, 3.3.1

デフォルト・サービス

URL, 例, 3.3.2.1

デフォルト・サービス

構文, 3.3.2.1

使用, 3.3.2.1

delete_action.jsp, 1.3 データの削除, 5.4

メソッドの作成, 5.4.1

DataHandler.java, 5.4.1

delete_action.jsp, 5.4.2, 5.4.3

削除アクションの処理, 5.4.3

削除するリンク, 5.4.2

デプロイメント・ディスクリプタ・ファイル, 5.6 動的SQL

OracleCallableStatement, 6.1

OraclePreparedStatement, 4.1.1, 6.1

使用, 6.1

E

edit.jsp, 1.3

Employees.java, 1.3

employees.jsp, 1.3, 4.3.3

SQL-92のエントリ・レベル, 1

環境変数

指定, 2.2.2

環境変数, チェック,2.2.2 例外処理, 5.5

catchブロック, 5.5, 5.5.1

DataHandler.java, 5.5.2

deleteEmployee, 5.5.1

getAllEmployees, 5.5

SQLExceptionの処理, 5.5.2

SQLException, 5.5

tryブロック, 5.5, 5.5.1

実行, 4.1.2 executeBatch, 4.1.2 executeQuery, 4.1.2 executeUpdate, 4.1.2

F

データのフィルタ, 4.5

DataHandler.java, 4.5.1

G

getAllEmployees, 4.4.2

getCursorメソッド, 6.3.2

getDBConnection methodメソッド, 4.2.1

グローバリゼーション・クラス・ファイル, 2.2.2

H

HRアカウント

テスト, 2.1.1.1

HRユーザー・アカウント

サンプル・アプリケーション, 2.1.1.1

ロック解除, 2.1.1.1

HTMLフォーム, 4.3.1.4 HTMLタグ, 4.3.1.3

I

IBM WebSphere, 2.1.4

IDE, 1.2.1, 2.1.3

Oracle JDeveloper, 2.1.3

パッケージのインポート

「インポート」ダイアログ・ボックス, 4.4.2

INパラメータ, 6.1.2 index.jsp, 1.3 index.jsp, 作成, 5.6.1 insert_action.jsp, 1.3 データの挿入, 5.3

employees.jsp, 5.3.4

挿入アクションの処理, 5.3.4

insert_action.jsp, 5.3.3, 5.3.4

insert.jsp, 5.3.3

JSP, 5.3.3

挿入ページへのリンク, 5.3.2

メソッド, 作成, 5.3.1

新規データ, 入力, 5.3.3

insert.jsp, 1.3 インストール

ディレクトリおよびファイル, 2.2.1

データベースでの検証, 2.2

統合開発環境, 2.1.3

J

J2SE, 2.1.2

インストール, 2.1.2

Javaランタイム環境, 2.1.2

Javaクラス, 3.3.3

作成, 3.3.3

DataHandler, 3.3.3

Javaデータベース・コネクティビティ, 1 Javaライブラリ

JDeveloperでの追加, 3.3.4

JSPランタイム・ライブラリ, 3.3.4.2

Oracle JDBCライブラリ, 3.3.4.1

Javaビジュアル・エディタ, 1.2.2 JavaBean, 5.1

「Beanの作成」ダイアログ・ボックス, 5.1.1

作成, 5.1

JDeveloperでの作成, 5.1.1

定義, 5.1.2

Employee.java, 5.1.1

Employees表, 5.1.2

プロパティおよびメソッド, 作成, 5.1.2

サンプル・アプリケーション, 5.1

JavaClient.java, 1.3 JavaServer Pages, 2.1.4 java.sql, 1.1.2 JBoss, 2.1.4 JDBC, 1, 1.1 JDBCドライバ

ドライバ・バージョン, 確認, 2.2.3

JDBCエスケープ構文, 6.2 JDeveloper, 1.2, 1.2

Apache Tomcat, サポート, 2.1.4

APIサポート, 3.3.4

アプリケーション・テンプレート, 3.2

アプリケーション, 作成, 3.2.2

アプリケーション, 3.2

データの表示, 3.1.3

コンポーネント・パレット, 1.2.2

「Beanの作成」ダイアログ・ボックス, 5.1.1

Javaクラスの作成, 3.3.3

データベース, 接続, 3.1, 3.1.2

データベース, 切断, 3.1.2

データベース, 再接続, 3.1.2

デフォルトのレイアウト, 1.2.1

IBM WebSphere, サポート, 2.1.4

インストレーション・ガイド, 2.3

Javaコード・インサイト, 1.2.2

Javaソース・エディタ, 1.2.2

Javaビジュアル・エディタ, 1.2.2

JavaBean, 5.1.1

JBoss, サポート, 2.1.4

JDeveloperのデータベース・ナビゲータ, 3.1.1

ルック・アンド・フィール, 4.3.4

ナビゲータ, 1.2.1

オンライン・ドキュメント, 2.3

Oracle Application Server, サポート,2.1.4

Oracle WebLogicのサポート, 2.1.4

プラットフォーム・サポート, 2.3

プロジェクト, 作成, 3.2.2

プロジェクト, 3.2

プロパティ・インスペクタ, 1.2.2

ResultSetオブジェクト, 作成, 4.4.2

スクリプトレットの表示, 4.4.2

サーバー・サポート, 2.1.4

ツール, 1.2.2

ユーザー・インタフェース, 1.2.1, 1.2.1

ウィンドウ, 1.2.1, 1.2.1

JDeveloperのデータベース・ナビゲータ, 3.1.1

接続の表示, 3.1.1

データベース・オブジェクトの表示, 3.1.1

jsp

useBeanタグ, 4.4.1

JSP, 2.1.4 JSPページ

作成, 4.3, 4.3.2

カスタム・タグ・ライブラリ, 4.3

デプロイ, 2.1.4

使用される要素, 4.3.1

ログイン操作の処理, 4.6.5

HTMLフォーム, 4.3.1.4

HTMLタグ, 4.3, 4.3.1.3

Javaベースのスクリプトレット, 4.3

JSPタグ, 4.3

表示, 4.3.1

スクリプトレット, 4.3.1.2

標準JSPタグ, 4.3

静的コンテンツ, 追加, 4.3.3

スタイルシート, 追加, 4.3.4

データの更新, 5.2.4

JSPタグ, 4.3, 4.3.1.1, 4.3.1.1

L

ライブラリ

追加, 3.3.5

「プロジェクト・プロパティ」ダイアログ・ボックス, 3.3.5

login_action.jsp, 1.3 login.jsp, 1.3

N

nextメソッド, 4.1.3

O

ojdbc5.jar, 2.2.2, 2.2.2

Oracle Application Server, 2.1.4

Oracle Database 12c リリース1, 2.1.1, 3.3.2.1

オブジェクトのクローズ, 7

接続, 1.1

インストール, 2.2

インストレーション・ガイド, 2.1.1

リリース・ノート, 2.1.1

接続解除, 7

検証, 2.2

インストールの検証, 2.2

Oracle Database 12c リリース1のインストール

環境変数, 変数, 2.2.1

ディレクトリおよびファイルのインストール, 2.2.1

ORACLE_HOME/jlib, 2.2.1

ORACLE_HOME/jdbc, 2.2.1

プラットフォーム固有, 2.2

Oracle JDBCライブラリ

oracle.jdbc, 3.3.4.1

oracle.jdbc.pool, 3.3.4.1

oracle.sql, 3.3.4.1

Oracle JDBCパッケージ

oracle.jdbc, 1.1.2

oracle.sql, 1.1.2

Oracle JDBCパッケージ, 1.1.2 Oracle JDBCサポート, 1.1 Oracle JDBC Thinドライバ, 1.1.1

Type IV, 1.1.1

Oracle JDeveloper, 1.2

インストール, 2.3

Oracle JDeveloper Studio Edition, 2.3 OracleのREF CURSOR型, 6.3.1 Oracle Weblogic Server, 3.3.4.2 Oracle WebLogic Server, 2.1.4 ORACLE_HOMEディレクトリ, 2.2.1 OracleCallableStatement, 6.1, 6.1.2

作成, 6.1.2

IN, OUT, IN OUTパラメータ, 6.1.2

使用, 6.1.2

OracleDatabaseMetaData, 2.2.3 oracle.jdbc, 1.1.2, 1.1.2, 3.3.4.1

java.sql, 1.1.2

Oracle JDBCライブラリ, 3.3.4.1, 3.3.4.1

oracle.jdbc.pool, 3.3.4.1 OraclePreparedStatement, 4.1.1, 6.1

バインド変数, 6.1.1

作成, 6.1.1

プリコンパイル, 6.1.1

使用, 6.1.1

oracle.sql, 1.1.2

データ型, 1.1.2

Oracle JDBCライブラリ, 3.3.4.1

UCS-2キャラクタ・セット, 1.1.2

oracle.sql.Datum, 1.1.2 OracleTypes.CURSOR変数, 6.3.2 orai18n.jar, 2.2.2, 2.2.2

P

結果セットでの位置指定, 4.1.3.1

「プロジェクト・プロパティ」ダイアログ・ボックス, 3.3.5

プロパティ・インスペクタ, 1.2.2

Q

データの問合せ, 4.1, 4.1

DataHandler.java, 4.2.1

Javaアプリケーション, 4.2

JDBCの概念, 4.1

ログ・ウィンドウの出力, 4.2.2

出力, 4.2.2

queryメソッド, 4.1.2

結果, テスト, 4.2.1

トレース・メッセージ, 4.2.2

R

REF CURSOR, 6.3, 6.3.2

データへのアクセス, 6.3.2

CallableStatement, 6.3.2

宣言, 6.3.1

OracleのREF CURSOR型, 6.3.1

REF CURSOR, 6.3.1

結果セット・オブジェクトとしてマテリアライズ, 6.3.2

結果セットでの相対位置指定, 4.1.3.1 結果セットの拡張

位置指定, 4.1.3.1

スクロール可能性, 4.1.3.1

データベース変更の更新検出, 4.1.3.1

更新可能性, 4.1.3.1

結果セット

宣言, 4.1.3.2

機能, 4.1.3.1

ResultSetオブジェクト, 4.1.3

クローズ, 7.1

getBoolean, 4.1.3

getInt, 4.1.3

getLong, 4.1.3

JDeveloper, 作成, 4.4.2

nextメソッド, 4.1.3

S

サンプル・アプリケーション

クラス, 1.3

接続, 3.3.1

DataHandler.java, 1.3

delete_action.jsp, 1.3

edit.jsp, 1.3

Employees.java, 1.3

Employees.jsp, 1.3

エラー・メッセージ, 4.6.3

失敗したログイン, 4.6.3

HRユーザー・アカウント, 2.1.1.1

index.jsp, 1.3

insert_action.jsp, 1.3

insert.jsp, 1.3

JavaClient.java, 1.3

JSP, 1.3

ログイン機能, 4.6

ログイン・インタフェース, 4.6.4

ログイン・ページ, 4.6.2

login_action.jsp, 1.3

login.jsp, 1.3

概要, 1.3

セキュリティ機能, 4.6

テスト, 1.3

update_action.jsp, 1.3

ユーザー認証, 4.6

スクリプトレット, 4.3.1.2 スクリプトレット

JDeveloperでの表示, 4.4.2

スクリプトレット, 4.3.1.2, 4.3.1.2 結果セットでのスクロール可能性, 4.1.3.1 結果セットでのデータベース変更の更新検出, 4.1.3.1 SQLException, 5.5 Statementオブジェクト, 4.1.1

実行メソッド, 4.1.2

executeBatchメソッド, 4.1.2

executeQueryメソッド, 4.1.2

executeUpdateメソッド, 4.1.2

OraclePreparedStatement, 6.1.1

queryメソッド, 4.1.2

ストアド・ファンクション

コール, 6.2

ストアド・ファンクション, 作成, 6.2 ストアド・プロシージャ

コール, 6.2

作成, 6.2.1

データベース・ナビゲータ, 6.2.1

JDeveloper, 6.2.1

OracleCallableStatement, 6.1.2

スタイルシート, 使用, 4.3.1, 4.3.4

T

テスト

接続メソッド, 4.2.2

フィルタ・データ, 4.5.2

JavaClient.java, 4.5.2

ログイン機能, 4.7

問合せ結果, 4.2.2

U

UCP, 8

ucp.jar, 8.1

結果セットでの更新可能性, 4.1.3.1

update_action.jsp, 1.3

データの更新, 5.2.5

edit.jsp, 5.2.5

Javaクラス, 5.2

JSPページ, 5.2.4

更新アクション, 処理, 5.2.5

update_action.jsp, 5.2.5

ユーザー認証, 4.6.1

W

Webサーバー, 2.1.4

Apache Tomcat, 2.1.4

サーブレット・コンテナ, 2.1.4

web.xml, 5.6

X

X/Open SQLコール・レベル・インタフェース, 1

オラクル社の法律上の注意点について

コピーライトについて

Copyright © 1994-2014, Oracle and/or its affiliates.All rights reserved.

商標と登録商標について

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

制限付権利

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション（人的傷害を発生させる可能性があるアプリケーションを含む）への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性（redundancy）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

ドラフトのアルファ版およびベータ版ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。オラクル社およびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。