教育サーバーのページ
オンラインテキスト目次
システムプログラミング演習
JDBC (Java DataBase Connectivity)とは、リレーショナルデータベース (RDB)にアクセスするための標準的なAPIである。 JDBCはJavaによるエンタープライズシステムの基礎をなす重要なAPIである。 JDBC2.0 APIは、コアAPI(java.sqlパッケージ)とオプションパッケージAPI (javax.sqlパッケージ)から構成されている。 コアAPIは、java.sqlパッケージ内に実装され、JDBCの基本的なAPIが含まれて おり、特定のベンダーやメーカーに依存せずにデータベースに接続できる。 Javaが対応するさまざまなデータベース群を、Drivermanagerクラスによって管理 している。なお、java.sqlパッケージは、Java2 SDK Standard Editionに含まれて いる。
JDBCは、以下のような特徴をもっている。
JDBCは、Javaアプリケーションから使用するJDBCドライバマネージャと DBMSに依存するJDBCドライバを分離することで、DBMSに依存しないように している。
JDBCには、高機能で洗練されたメソッドが提供されているので、 容易にプログラムを作成できる。SQLを実行できるメソッドを もっているので、DBMSに依存しないで開発可能である。
多くのDBMSベンダからJDBCドライバが提供されているので、 すでにあるデータベースなどの資源がそのまま利用できる。
Javaアプリケーションがデータベースにアクセスするためには、次のような 仕組みを利用する。
JDBC APIは、JavaアプリケーションとJDBCドライバを接続するインターフェイス である。JDBC APIには、以下のような機能がある。
JDBC APIより下位の層にあるものが、JDBCドライバマネージャと JDBCドライバAPIである。
JDBCドライバマネージャは、JDBCドライバの管理をおこない、 JDBCドライバを使用して、実際にデータベースに接続する。 アプリケーションにおいてJDBCによる接続が必要な場合、 JDBCドライバは、目的のデータベースに対応したJDBCドライバを 選択し、接続するために使用する。
JDBCドライバは、データベースに直接アクセスするために使用する。 通常、JDBCドライバはデータベースベンダー自身により提供され、 DBMSとの接続形態は、以下の4種類に分類できる。
JDBCドライバには、以下のような4つの種類がある。
TYPE 1のJDBCドライバは、JDBC-ODBCブリッジドライバと呼ばれる。 JDBC APIの呼び出しをODBC (Open DataBase Connectivity) APIの呼び出しに変換するブリッジコンポーネントである。 ODBCドライバを経由してDBMSに接続することになるので、JDBC-ODBC ブリッジドライバを使用するクライアントマシンに、ODBCドライバが インストールされている必要がある。
TYPE 2のJDBCドライバは、JDBC APIの呼び出しをDBMS固有の クライアントAPI呼び出しに変換する。つまり、DBMS(DataBase) ベンダーが固有に持つデータベースアクセスのためのミドルウエア を利用して、データベースへの接続をおこなう。 このようなJDBCドライバをネイティブブリッジドライバとよぶ。 この場合には、TYPE 2のJDBCドライバのほかに、データベース接続 に必要なデータベース固有の仕組み(ミドルウエア)が必要になる。
TYPE 3のJDBCドライバは、JDBCドライバの中で最も柔軟性をもつ ものである。TYPE 2のJDBCドライバではデータベース専用の ミドルウエアを必要として使用しているが、TYPE 3ではミドルウエア の部分を中継サーバと呼ばれる層を作って実装している。つまり、 JDBCドライバと中継サーバ間は、データベースに依存しない、Pure Java形式で実装できる。一方、中継サーバでは、データベース固有 の環境に変換して通信をおこなうことになる。
TYPE 4 JDBCドライバは、TYPE 2 やTYPE 3で行っていたデータベース 固有のミドルウエア部分をすべて、JDBCドライバ内部に実装した、 Pure Javaのドライバである。ただし、JDBCドライバ内部にデータベース 固有のミドルウエア部分を実装しているため、ドライバのサイズが大きく なる。
Javaアプリケーションは、以下のような手順をとる。
以下のプログラムJdbcTest1.javaは、JDBCドライバをドライバマネージャに登録する プログラムである。
import java.sql.*; public class JdbcTest1 { public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); System.out.println("JDBCドライバの登録に成功しました"); } catch(ClassNotFoundException e) { System.out.println("JDBCドライバの登録に失敗しました"); e.printStackTrace(); } } }
プログラム JdbcTest1.java の説明:
JdbcTest1.javaは、 MySQL用に提供されているJDBCドライバ("com.mysql.jdbc.Driver")をドライバマネージャに登録するプログラムである。
import java.sql.*;では、JDBC2.0 APIのコアAPIであるjava.sqlパッケージをインポートしている。
Class.forName("com.mysql.jdbc.Driver"); System.out.println("JDBCドライバの登録に成功しました");では、Class.forName("com.mysql.jdbc.Driver");により MySQL用に提供されているJDBCドライバ("com.mysql.jdbc.Driver")を ドライバマネージャに登録する。登録に成功すれば、"JDBCドライバの登録に 成功しました"というメッセージが表示される。forName()メソッドの引数となる クラス名は、JDBCドライバごとに異なる。
} catch(ClassNotFoundException e) { System.out.println("JDBCドライバの登録に失敗しました"); e.printStackTrace(); }では、try節の実行時にドライバが見つからない場合に、ClassNotFoundException例外が 発生し、"JDBCドライバの登録に失敗しました"というメッセージが表示される。
JdbcTest2.javaは、 ドライバマネージャに登録されているJDBCドライバを表示する プログラムである。
import java.sql.*; import java.util.Enumeration; public class JdbcTest2 { public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); Enumeration e = DriverManager.getDrivers(); while(e.hasMoreElements()) { Object obj = e.nextElement(); String driverName = obj.getClass().getName(); System.out.println(driverName); } } catch(Exception e) { e.printStackTrace(); } } }
プログラム JdbcTest2.java の説明:
import java.sql.*; import java.util.Enumeration;では、java.sqlパッケージとEnumerationクラスをインポートしている。
Class.forName("com.mysql.jdbc.Driver"); // Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Class.forName("intersolv.jdbc.sequelink.SequeLinkDriver");では、JDBCドライバを登録している。
Enumeration e = DriverManager.getDrivers();では、登録されているドライバ名をリスト形式で取得している。 getDrivers()メソッドの戻り値は、Enumerationオブジェクトである。
while(e.hasMoreElements()) { Object obj = e.nextElement(); String driverName = obj.getClass().getName(); System.out.println(driverName); }では、登録されているドライバのリストにあるクラス名を表示している。 ドライバのリストはEnumerationオブジェクト形式になっており、 それぞれの要素へのアクセスにはhasMoreElements()メソッドとnextElement() メソッドを利用している。また、ドライバのクラス名は、getClass().getName() を使用して求める。
JdbcTest3.javaは、 登録されたJDBCドライバを使用してデータベースに接続する プログラムである。
import java.sql.*; public class JdbcTest3 { public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost/test"; String user = "root"; String password = "tuis2019system"; System.out.println("URL :" + url); System.out.println("USER :" + user); System.out.println("PASSWORD :" + password); System.out.println("データベースに接続します..."); Connection conn = DriverManager.getConnection(url, user, password); System.out.println("データベースと接続しました"); conn.close(); } catch(SQLException e) { e.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } } }
プログラム JdbcTest3.java の説明:
String url = "jdbc:mysql://localhost/test"; String user = "root"; String password = "tuis2019system"; System.out.println("URL :" + url); System.out.println("USER :" + user); System.out.println("PASSWORD :" + password);では、指定されたデータベースに接続するために、データベースをあらわす URL、接続に用いるユーザ名、ユーザのパスワードを指定している。
データベースをあらわすURL(データベースURL)は、データベースに接続する場合に 必要となる情報をセットした文字列である。この文字列の構造は、"jdbc"、 サブプロトコル、サブネームの3つの部分から構成される。
jdbc:サブプロトコル:サブネーム
サブプロトコルは、ドライバやデータベースによる決まる名前である。 一般には、データベースソフトウエアの名称が指定される。 サブネームは、サブプロトコルにより規定されるデータソース、一般には データベース名やデータベースソフトウエアが動作するホスト名、ポート 番号などが記述される。JdbcTest3.javaでは、urlは"jdbc:mysql://localhost/test" となる。つまり、サブプロトコルは"mysql"、サブネームは"//localhost/test" となる。
Connection conn = DriverManager.getConnection(url, user, password);では、上記のURL、ユーザ名、パスワードの情報を引数として getConnection()メソッドに渡すことで、指定されたデータベースへの接続 をおこない、接続オブジェクトを取得する。
conn.close();では、取得された接続オブジェクトをクローズしている。
問題-1
問題-2
問題-3
問題-4