JDBC は、データベースへの接続、SQL 文、結果の集合、 データベースメタデータ(データに関するデータ)などを表す Java クラスを定義します。 これによって、java プログラマはデータベースを読み書きする SQL 文を発行できます。
JDBC それ自身は完全に java で書かれており、どこでも実行できます。 異種 DB 接続を可能にするために、複数のドライバ接続をサポートします。
JDBC は数十個の java クラスを含むパッケージからなり、 これらのうちのいくつかはインタフェースであり、これらを実装したコードが、 ドライバと呼ばれるデータベース固有のソフトウェアで、 データベース・ベンダから提供されています。
java プログラムは、ドライバを通してデータベースに接続するために JDBC パッケージの中のメソッドを呼び出します。
| ユーザのコード | JDBC | ドライバ | データベース | |||
|---|---|---|---|---|---|---|
| import java.sql.*; class UseDB { } |
⇔ | データ処理 ユーティリティ |
⇔ | jdbc-odbcブリッジ⇔odbcドライバ |
⇔ | Oracle データベース |
JDBC のプログラマ・インタフェースは java.sql にあります。
| 機能 | ク ラ ス | 目 的 |
|---|---|---|
| 接続 | java.sql.DriverManager | 登録されたドライバを管理する |
| java.sql.Driver | 特定の型のデータベースを扱う | |
| java.sql.DriverPropertyInfo | コネクションのプロパティを取得、設定する | |
| java.sql.Connection | 特定のデータベースとのセッションを確立する | |
| データ 処理 |
java.sql.DatabaseMetaData | データベース全体に関する情報を与える |
| java.sql.Statement | 送信する SQL 文 | |
| java.sql.CallableStatement | Statement の一種 (SQL に納められた手続きを実行するのに使う) | |
| java.sql.PreparedStatement | Statement の一種でこちらの方が一般に効率がよい (あらかじめ静的にコンパイルされた SQL 文を保持する) | |
| java.sql.ResultSet | SQL 文の実行結果を保持する | |
| java.sql.ResultSetMetaData | ResultSet の型とプロパティ情報を与える | |
| ユーティリティ | java.sql.Types | SQL で使う定数 |
| java.sql.Numeric | 任意精度の数値をサポートする | |
| java.sql.Date | 日付をサポートする | |
| java.sql.Time | 時刻をサポートする | |
| java.sql.Timestamp | 日付と時刻を合わせたものサポートする | |
| java.sql.SQLException | エラーに関する情報が付加された データベースアクセスの例外クラス | |
| java.sql.SQLWarning | SQLException のサブクラス | |
| java.sql.SQLTruncation | SQLWarning のサブクラスで、 データの値が予期されない状態で丸められたときに生じる |
| type1 | java 実行環境に付属している JDBC-ODBC Bridge Driver を使用する方式 |
|---|---|
| type2 | JDBC ドライバから特定の DBMS 専用ネイティブドライバを使用する方式 |
| type3 | JDBC ネットドライバ方式 |
| type4 | 特定の DBMS の通信プロトコルを使用するダイレクトドライバ方式 |
オラクルの場合は、以下の2つの方式をサポートしています。
| 型 | 機 能 | 種 別 | ドライバ | パッケージ |
|---|---|---|---|---|
| type2 | oracle call interface 用 | jdbc oci | oci7 | java.sql |
| oci8 | java.sql | |||
| type4 | java applet 用 | jdbc thin | thin | java.sql |
type2 の oci は、java と c で作られているため、 oracle の提供する java jdbc パッケージと c で作られた共用ライブラリが必要です。 一方、type4 の thin は、100% java で書かれているため、 oracle の提供する java jdbc パッケージのみを使用します。
| 参考ページ |
| JDBC ドライバのの4つの型について |
Oracle の場合、CLASSPATH に oracle jdbc driver
のあるパッケージのパスを設定します。
通常、それは $ORACLE_HOME/jdbc/lib/classesXXX.zip です
( XXX は、JDK1.2 の場合は classes12.zip、JDK1.1 の場合は classes111.zip 、
JDK1.0 の場合は classes102.zip です)。
また、JDK1.1 以上の場合は、いろいろな文字セットをサポートするパッケージ
nls_charsetXX.zip も必要です。
( XXX は、JDK1.2 の場合は nls_charset12.zip、
JDK1.1 の場合は nls_charset11.zip です)。
これがないと、以下のエラーが出ます。
Java.sql.SQLException: Non supported character set: oracle-character-set-XXX
また、jdbc oci driver を使う場合は、 LD_LIBRAY_PATH に $ORACLE_HOME/lib を追加しなければなりません。 oci driver は、java 以外に c の共用ライブラリ (libocijdbc8.so) を含むためです。
上記の設定をしていないと、以下のエラーが出ます。
Exception in thread "main" java.lang.UnsatisfiedLinkError: no ocijdbc8 in
java.library.path
jdbc ドライバと oracle の提供する java パッケージには以下の関係があります。
尚、oracle jdbc ドライバ・パッケージは $ORACLE_HOME/jdbc/lib に、
oci 用の共用ライブラリは $ORACLE_HOME/lib にあります。
| jdk Version |
jdbc Version |
jdbc class |
nls class |
rowset class |
dms class ConnectionPooling |
oci 共用ライブラリ |
|---|---|---|---|---|---|---|
| 1.1 | 8.0.X | classes102.zip | nls_charset11.zip | - | - | liboci80Xjdbc.so |
| 1.1 | 8.1.X | classes111.zip | nls_charset11.zip | - | - | libocijdbc8.so |
| 1.2 | 8.1.X | classes12.zip | nls_charset12.zip | - | - | libocijdbc8.so |
| 1.2 ~ 1.3 | 9i | classes12.zip | nls_charset12.zip | ocrs12.jar | classes12dms.jar | libocijdbc9.so |
| 1.4 | 9i | ojdbc14.jar | nls_charset12.zip | ocrs12.jar | classes12dms.jar | libocijdbc9.so |
なお上記表の X は、oracle のバージョンの数字1文字です。
java のバージョンは、以下のコマンドで確認できます。
java -version
JDBC を使ってデータベースとやりとりをするには、次の4段階が必要です。
データベースには問い合わせを受け付けるドライバがあり、 これでデータベースの内部形式を受け取り、結果を返します。
URL 形式で使いたいデータベースを指定します。
これはドライバ依存の機能なのでドライバについてのドキュメント
を参照してください。
JDBC にプログラムを登録する。
接続のためのクラスを用いて、対象とするデータベースに接続します。
DriverManager クラスは、ドライバクラスをすべてロードし、 そのドライバの1つで URL へ接続を試みます。
接続の方法は、oracle の場合 oci と thin の2つありますが、 どちらで接続しても、結果は同じです。
形式1はローカル接続、形式2は tnsnames.ora に登録された方法で接続されます。
通常、結果は ResultSet のテーブルの形で返されます。
ResultSet クラスには、 SQL 文の実行結果にアクセスするメソッドが用意されています。
ResultSetMetaData クラスには、ResultSet に関する情報(行、列数、名前、 サイズなど)の型やプロパティを得るメソッドが用意されています。
なお、SQL 文内のシングルクオートはエスケープしなければなりません。
static String sel_stmt = "select ename from emp where job like \'CLERK%\'";
/*
* This sample shows how to list all the names from the EMP table
*
* It uses the JDBC OCI8 driver. See the same program in the
* thin or oci7 samples directories to see how to use the other drivers.
*/
// You need to import the java.sql package to use JDBC
import java.lang.*;
import java.sql.*;
import java.io.*;
class log {
public static void main (String args []) {
DbPro p = new DbPro();
try {
p.sql();
} catch (SQLException e) { System.out.println(e);
} catch (ClassNotFoundException e) { System.out.println(e); }
}
}
class DbPro {
static String jdbc_driver = "oracle.jdbc.driver.OracleDriver";
static String database_URL= "jdbc:oracle:oci8:@";
static String userid = "scott";
static String passwd = "tiger";
static String sel_stmt = "select ename from emp where job like \'CLERK%\'";
void sql() throws SQLException, ClassNotFoundException {
// Load the Oracle JDBC driver
Class.forName (jdbc_driver);
// Connect to the database
// You can put a database name after the @ sign in the connection URL.
DriverManager.setLogStream(System.err);
Connection conn =
DriverManager.getConnection (database_URL,userid,passwd);
// Create a Statement
Statement stmt = conn.createStatement ();
// Select the ENAME column from the EMP table
ResultSet rset = stmt.executeQuery (sel_stmt);
// Iterate through the result and print the employee names
while (rset.next ())
System.out.println (rset.getString (1));
}
}
|
上記のプログラムを作って実行してみましょう。 次に、setLogStream() メソッドを呼ぶ行をコメントにして実行してみましょう。 |
上記、database_URL を以下のように変更すればできます。
形式:jdbc:oracle:thin:@ホスト名:ポート番号:ORACLE_SID
static final String database_URL= "jdbc:oracle:thin:@osaka:1531:ora805";
jdbc のバージョンを知るプログラム Version.java を以下に示します。 以下で、使用法を知ることができます。
> java Version -
/*
* Version.java
*/
import java.util.Hashtable;
import java.math.BigDecimal;
import java.sql.*;
import oracle.jdbc.driver.*;
class Version {
static String jdbc_oci8_URL = "jdbc:oracle:oci8:@";
static String jdbc_thin_UNIX_URL = "jdbc:oracle:thin:@ozzy:1521:ora816";
static String jdbc_thin_NT_URL = "jdbc:oracle:thin:@keyaki:1522:Ora81";
static String opt[] = {"oci8","thin_UNIX","thin_NT",null};
static String jdbcURL_lst[] = {jdbc_oci8_URL,jdbc_thin_UNIX_URL,
jdbc_thin_NT_URL};
static String jdbcURL = jdbc_thin_UNIX_URL;
public static void main (String [] args) throws Exception {
int i=0;
String user = "scott";
String password = "tiger";
Connection conn,conn2;
// check input options
if (args.length == 1) {
for (i=0;;i++) {
if (opt[i] == null) usage();
if (opt[i].equals(args[0])) break;
}
} else if (args.length != 0) usage();
jdbcURL = jdbcURL_lst[i];
Version p = new Version();
DatabaseMetaData md;
// get Connection to Server 1
DriverManager.registerDriver(new OracleDriver());
conn = DriverManager.getConnection (jdbcURL, user, password);
md = conn.getMetaData();
System.out.println("jdbc Version : "+md.getDriverVersion());
System.out.println("jdbc DriverName : "+md.getDriverName());
System.out.println("jdbc Supported : "+md.supportsLimitedOuterJoins());
conn.close();
System.gc();
}
static void usage() {
StringBuffer option = new StringBuffer();
String use1 = "Usage : java Version [";
String use2 = "] (default:oci8)";
String optstr ;
for (int i=0; ; i++) {
if (opt[i] == null) break;
option = option.append(opt[i]).append("/");
}
optstr = option.toString();
System.out.println("\nVersion : Error : invalid option\n");
System.out.print(use1);
System.out.print(optstr.substring(0,optstr.length()-1));
System.out.println(use2);
System.exit(3);
}
}
Microsoft は、ODBC(Open Database Connectivity) 標準をデータベースベンダに提案しました。
ODBC(Open Database Connectivity) は、 cから SQL サーバを呼び出して結果を受け取るための API です。
JDBC-ODBC ブリッジは、対応する ODBC 標準のcの API を呼び出すように JDBC を実装しています。ブリッジは、java の型を受け取りcの型へ変換して ODBC ドライバに渡したり、逆の変換をします。 JDBC-ODBC ブリッジは、独立したcのライブラリであり、 これがコードからアクセスできなければなりません。
このブリッジは、java で書かれたブリッジのためのドライバマネージャと、 ネイティブコードのドライバ本体とで構成されています。
JDBC-ODBC ブリッジは、いまのところ Win32 と solaris 用しかないようです。
| 参考ページ |
| JDBC Note |
| Sun JDBC ガイド |
| Sun JDBC ドキュメント |
| Oracle8 JDBC Drivers |
| Oracle 8i jdbc API |
| まとめ |