教育サーバーのページ
オンラインテキスト目次
システムプログラミング演習

JDBCの基礎 (Java アプリケーション)

1. JDBCとは

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は、以下のような特徴をもっている。

Javaアプリケーションがデータベースにアクセスするためには、次のような 仕組みを利用する。

1.1 JDBC API

JDBC APIは、JavaアプリケーションとJDBCドライバを接続するインターフェイス である。JDBC APIには、以下のような機能がある。

JDBC APIより下位の層にあるものが、JDBCドライバマネージャと JDBCドライバAPIである。

1.2 JDBCドライバマネージャ

JDBCドライバマネージャは、JDBCドライバの管理をおこない、 JDBCドライバを使用して、実際にデータベースに接続する。 アプリケーションにおいてJDBCによる接続が必要な場合、 JDBCドライバは、目的のデータベースに対応したJDBCドライバを 選択し、接続するために使用する。

1.3 JDBC ドライバ

JDBCドライバは、データベースに直接アクセスするために使用する。 通常、JDBCドライバはデータベースベンダー自身により提供され、 DBMSとの接続形態は、以下の4種類に分類できる。

JDBCドライバの種類

JDBCドライバには、以下のような4つの種類がある。

2. Javaアプリケーションの基本形

Javaアプリケーションは、以下のような手順をとる。

  1. パッケージのインポート
  2. JDBCドライバの登録
  3. データベースへの接続
  4. データベースの操作
  5. データベース接続のクローズ

2.1 JDBCドライバの登録

以下のプログラム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ドライバの登録に失敗しました"というメッセージが表示される。

2.2 登録されている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() を使用して求める。

2.3 データベースとの接続 (1)

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 = "tuis2015system";

			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 = "tuis2015system";
			
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();
では、取得された接続オブジェクトをクローズしている。

3. 演習問題

問題-1

データベースを連携させるJavaアプリケーション におけるJDBCの仕組みを説明せよ。

問題-2

Javaアプリケーションである、JdbcTest1.java を実行し、その結果を表示せよ。

問題-3

Javaアプリケーションである、JdbcTest2.java を実行し、その結果を表示せよ。また、他の JDBCドライバである、sun.jdbc.odbc.JdbcOdbcDriver に置き換えて実行して、その結果がどうなるかを示せ。

問題-4

Javaアプリケーションである、JdbcTest3.java を実行し、その結果を表示せよ。その場合、 接続するデータベースは、以前作成した データベース(fruitテーブルをもつtest_1データベース) とすること。

システムプログラミング演習


Yasuo NAGAI