
新人SEのためのJava講座
Javaデータアクセスの基礎
佐藤直生
日本オラクル
2001/7/11
| 本記事は2001年に執筆されたものです。JDBC全般の最新情報は@IT Java Solutuionのカテゴリ「DB連携」をご参照ください。 |
| 第2回 JDBCによるDBへの接続と検索の実行 |
|
この連載では、Javaのデータベース・アクセスAPIである「JDBC」の機能を、サンプルコードを交えて解説していきます。また、J2EEにおけるJDBCの位置付けや、JDBCを利用するさまざまなテクノロジについても解説していく予定です。前提知識としては、Javaとリレーショナル・データベースに関するベーシックな知識があれば十分です。 |
|
今回の内容 |
| |
前回は、JDBCの概要とそのアーキテクチャについて解説しました。今回は、さっそくJDBCを使った簡単なサンプルアプリケーションを紹介しながら、JDBCによるデータベース接続と、データ型のマッピング、検索処理について解説します。
それでは、簡単なJDBCアプリケーションのコードを見てみましょう。これは、同じマシンで動作しているOracle8iデータベースにユーザー名“SCOTT”で接続し、EMP表に対して問い合わせを実行し、その結果を標準出力に出力します。
// Javaデータアクセスの基礎
サンプルコード(1) |
リスト JavaDataAccess01.java |
そして、このコードの実行結果は、次のようになります。
C:\JDBC>java JavaDataAccess01 |
ここで、本連載で紹介していくサンプルコードを実行するための環境を構築しておきましょう。サンプルコードの実行のためには、J2SEおよびデータベースを利用できる環境を準備する必要があります。本連載では、データベースにOracle8iを使用します。Oracle8iが用意できない方は、サイトからトライアル版をダウンロードして使用してください。
- J2SE 1.3(http://java.sun.com/j2se/1.3/ja/)
- Oracle8i Database
(http://otn.oracle.co.jp/software/iserver/oracle8i/oracle8i.html)
- Oracle JDBC Driver(http://otn.oracle.co.jp/software/db_connect/jdbc/jdbc.html)
※Oracle8iにも同梱されています
CLASSPATHに、Oracle JDBC Driverのファイルclasses12.zipを追加しておきましょう。このファイルは、次の位置にあります。
<ORACLE_HOME>\jdbc\lib\classes12.zip
※<ORACLE_HOME>は、Oracle8iをインストールしたホーム・ディレクトリ
サンプルコードでは、データベースのSID、リスナの構成などにデフォルトの値を使用しているので、環境に合わせて変更しましょう。また、データベースの動作するマシンに合わせて、ホスト名も変更しましょう。
また、SCOTTスキーマが作成されていない場合や再作成したい場合には、次のSQLスクリプトを実行しましょう。
<ORACLE_HOME>\RDBMS\ADMIN\utlsampl.sql
なお、本連載では、サンプルコードの実行結果やファイル・パス表記として、Windows NTのものを使いますが、UNIXプラットフォームでも、当然実行可能です(WORAですね!)。
Oracle8i以外でも、JDBC 2.0 API対応のJDBCドライバを持つデータベースであれば、サンプルコードを多少修正するだけで実行可能になるので、ぜひチャレンジしてみてください。
■JDBCドライバのロードとデータベース接続の確立
では、サンプルコードをもう一度見てみましょう。JDBCドライバのロードとデータベースの接続をどう行っているかを見ていきます。
// Oracle
JDBC Driverのロード |
まず、現行のクラス・ローダを使って、JDBCドライバのクラスをロードします。ここでは、Oracle JDBC Driverのクラスoracle.jdbc.driver.OracleDriverを指定しています。
// Oracle8iに接続 |
次に、java.sql.DriverManagerクラスのgetConnection()メソッドを用いて、データベースへ接続します。getConnection()メソッドの第1パラメータは、接続先のデータベース情報を表しており、「データベースURL」と呼ばれます。第2、第3パラメータには、それぞれデータベース・ユーザーとそのパスワードを指定します。
データベースURLは、次のフォーマットで指定します。
jdbc:<サブプロトコル>:<サブネーム>
Oracle JDBC Driverのサブプロトコルは、サンプルコードを見れば分かるようにoracleです。ところで、JDBC-ODBCブリッジ・ドライバのサブプロトコルは、odbcです。このように、それぞれのJDBCドライバは固有のサブプロトコルを持っています。
サブネーム部分の構文は、JDBCドライバが独自に定義できるためドライバによって異なります。
例えば、JDBC-ODBCブリッジ・ドライバの場合には、次のように、ODBCデータ・ソース名を指定します(“xyz”は、ODBCデータ・ソース名)。
jdbc:odbc:xyz
Oracle JDBC Thin Driverの場合には、次のようなフォーマットとなります。
jdbc:oracle:thin:@<ホスト名>:<リスナのポート番号>:<Oracle
SID>
詳細は、使用するJDBCドライバのドキュメントを参考にしてください。
■データ型のマッピング
ここで、SQLのデータ型とJavaのデータ型の間のマッピングについて、簡単に見ておきましょう。
JDBCを利用して、データベースからデータを取得する場合、SQLデータ型で表現されているデータを、特定のJavaデータ型で表現する必要があります。逆に、データベース内のデータを更新する場合、Javaデータ型で表現されているデータを、特定のSQLデータ型のデータとして扱う必要があります。
JDBCでは、SQL-92で定義されている標準的なSQLデータ型を、JDBCデータ型として定義しています。そして、このJDBCデータ型とJavaデータ型の間のデフォルト・マッピングも定義しています。このマッピングを表1に示します。
これらの標準的なSQLデータ型に加えて、独自に定義したSQLデータ型を使用しているデータベースは、少なくありません。例えば、Oracle8iでは、254バイト以下の可変長文字列を表すデータ型 “VARCHAR”を拡張して、4000バイト以下の可変長文字列を表すデータ型 “VARCHAR2” を定義しています。
データベース独自のSQLデータ型とJDBCデータ型の間のマッピングは、JDBCドライバが暗黙的に行います。そのため、Java開発者は、データベース独自のSQLデータ型を利用するデータベースにアクセスする場合でも、Javaデータ型とJDBCデータ型だけを考慮するだけでよくなるわけです。
Oracle JDBC Driverで定義されている、Oracle8i SQLデータ型とJDBCデータ型の間のデフォルト・マッピングも、表1に合わせて示します。
利用可能なSQLデータ型と対応するJavaデータ型の詳細は、使用するデータベース、およびJDBCドライバのドキュメントを参考にしてください。表1
| Javaデータ型 | JDBCデータ型 | Oracle8i SQLデータ型 |
| String | CHAR | CHAR |
| String | VARCHAR | VARCHAR2 |
| String | LONGVARCHAR | LONG |
| java.math.BigDecimal | NUMERIC | NUMBER |
| java.math.BigDecimal | DECIMAL | NUMBER |
| boolean | BIT | NUMBER |
| byte | TINYINT | NUMBER |
| short | SMALLINT | NUMBER |
| int | INTEGER | NUMBER |
| long | BIGINT | NUMBER |
| float | REAL | NUMBER |
| double | FLOAT | NUMBER |
| double | DOUBLE | NUMBER |
| byte[] | BINARY | RAW |
| byte[] | VARBINARY | RAW |
| byte[] | LONGVARBINARY | LONGRAW |
| java.sql.Date | DATE | DATE |
| java.sql.Time | TIME | DATE |
| javal.sql.Timestamp | TIMESTAMP | DATE |
ここで再び、サンプルコードに戻りましょう。JDBCでの検索処理の部分を見ていきます。
// ステートメントを作成 |
データベース接続を表すjava.sql.ConnectionオブジェクトのcreateStatement()メソッドを用いて、SQL文を表すjava.sql.Statementオブジェクトを作成します。
// 問合せの実行 |
問い合わせ(SELECT文)を実行する場合には、java.sql.StatementオブジェクトのexecuteQuery()メソッドを使用します。パラメータとして、SELECT文を指定します。このメソッドの戻り値は、問い合わせの結果セットを表すjava.sql.ResultSetオブジェクトになります。
// 問合せ結果の表示 |
結果セットは、問い合わせ結果の複数行を表しています。結果セットでは、処理対象の行を表すためにカーソルを用います。カーソルは、結果セット作成直後は1行目の前に位置しています。next()メソッドにより、カーソルを1行ずつ下に移動して、問い合わせ結果を1行ずつ処理していきます。カーソルが最終行を超えると、next()メソッドがfalseを返すため、サンプルコードのように、whileループを利用すれば、結果セットのすべての行を処理できます。
![]() |
| 図1 結果セットとカーソルのイメージ |
カーソルのある処理対象行のデータを取り出すためには、getXXX()メソッドを用います。SQLデータ型がNUMBER(4)、つまり4けたの整数であるEMP表のEMPNO列に対して、getInt()メソッドを用いています。また、SQLデータ型がVARCHAR2(10)であるEMP表のENAME列に対しては、getString()メソッドを用いています。マッピング・テーブルを見直してみれば、これらが、SQLデータ型に対応するデフォルトのJavaデータ型のgetXXX()メソッドになっていることが分かるでしょう。マッピング・テーブルは、サンのサイト(http://java.sun.com/docs/books/tutorial/jdbc/basics/retrieving.html)の表を参考にしてください。
デフォルト・マッピングのJavaデータ型以外のデータ型でデータを取り出すことも可能ですが、特に理由がなければ、デフォルトのデータ型で取り出しましょう。
getXXX()メソッドで列を指定するには、2つの方法があります。(1から始まる)列番号を用いて指定することもできるし、あるいは、列名を用いて以下のように指定することも可能です。
System.out.println(rset.getInt("EMPNO")
+ "\t" + |
“select * from EMP” のように、列名を指定しないSELECT文の場合には、列番号を用いる方がコーディングが簡単になります。
これらのオブジェクトは、ガベージ・コレクションされる際に、自動的にクローズされ、データベースやJDBCのリソースを解放します。ですが、以下のリストのように、オブジェクトが不要になった時点で、明示的にクローズしリソースを直ちに解放する、という習慣を身に付けておく方がいいでしょう。
// 結果セットをクローズ |
第3回は、JDBCによる更新処理を取り上げる予定です。
| ■参考リファレンス
|
次回、「Javaデータアクセスの基礎」の掲載は7月下旬頃になります
| 連載記事一覧 |
ホワイトペーパー(TechTargetジャパン)
- Android NDKでJNIを使用してアプリを高速化するには (2010/3/17)
C/C++やOpenGL ESといったネイティブコードを使うためのNDKとJNIを紹介し、その使い方や注意点を徹底解説します - 調査の難しい「OutOfMemoryError」事例、5選 (2010/3/11)
Java開発者が避けて通れないメモリ不足エラーの基本的な問題切り分け方法と発生につながる事例、対処法を解説 - 究極の問題解析ツール、逆コンパイラJD-Eclipseとは (2010/3/8)
ライブラリ内で例外が発生! そのクラスのソースコードを調べたい!! 自動で逆コンパイルしてくれる無料Eclipseプラグインがあります - いまさら聞けない「Webサービス」の常識 (2010/2/26)
昨今では企業システムでも使われる「Webサービス」の概念やJava標準のJAX-WSを紹介しJBoss WSでサンプルを作成
|
|
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
- - PR -
| 「いつかは壊れるサーバ」そんな故障に 迅速で安価に手軽に対応する方法とは? New! |
| 「特権ユーザー」の事件を防げ! 万能権限を持つユーザーの管理方法とは? New! |
| 仮想環境の構築とデータ保護の特効薬?! 実績と信頼性の高いパッケージで安心運用 |
| 仮想環境のバックアップもこれまでどおり 「まるごと取ってまるごと戻す」簡単運用 |
| おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |
| その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |
| 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |
| 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |
- - PR -
お勧め求人情報

**先週の人気講座ランキング**
〜CCNA編〜
| ◆ | TomcatやJBossなどAPサーバ環境に関する 情報を集約! “業務”用APサーバ大百科 New! |
| ◆ | 一気に解説! 最新のクラスタストレージ 「RAIDを超えたストレージ基準」……など New! |
| ◆ | クラウド的ユーザー体験の変化は脅威か? 仮想化技術を使いこなす運用管理術を紹介 New! |

| ◆ | 上司や部下、部署内メンバーとの情報共有 を“ガラッ”と変えるコラボツールとは? New! |
| ◆ | おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| ◆ | 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |

| ◆ | Twitterのアカウントはなぜ突破された? メールによる新手の攻撃手法とその対策 |
| ◆ | もう仮想化のお試しフェイズは終わりだ! Hyper-V 2.0が基幹システムも仮想化 |
| ◆ | 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |

| ◆ | クライアント企業から求められる人材 ⇒IT技術と経営戦略を併せ持つ「戦略家」 |
| ◆ | .NET編集長が実践する「技術情報検索術」 サンプル・コードを簡単に探す“技”は? |
| ◆ | 業務効率と情報セキュリティ対策を両立! 手間なく確実に機密情報を守る方法とは? |

| ◆ | 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| ◆ | 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |

| ◆ | 【CTC事例】約30の基幹システムを統合! 膨大なバッジジョブを制御した方法は? |
| ◆ | 仮想化すればコストは削減できるか? 仮想化に必要な「3つの視点」を解説する |
| ◆ | その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |







