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

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("org.gjt.mm.mysql.Driver");
			System.out.println("JDBCドライバの登録に成功しました");
		} catch(ClassNotFoundException e) {
			System.out.println("JDBCドライバの登録に失敗しました");
			e.printStackTrace();
		}
	}
}

プログラム JdbcTest1.java の説明

JdbcTest1.javaは、 MySQL用に提供されているJDBCドライバ("org.gjt.mm.mysql.Driver")を ドライバマネージャに登録するプログラムである。

import java.sql.*;
では、JDBC2.0 APIのコアAPIであるjava.sqlパッケージをインポートしている。

Class.forName("org.gjt.mm.mysql.Driver");
System.out.println("JDBCドライバの登録に成功しました");
では、Class.forName("org.gjt.mm.mysql.Driver");により MySQL用に提供されているJDBCドライバ("org.gjt.mm.mysql.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("org.gjt.mm.mysql.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("org.gjt.mm.mysql.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("org.gjt.mm.mysql.Driver");
			
			String url = "jdbc:mysql://pcxxxx.edu.tuis.ac.jp/test_1";
			String user = "";
			String password = "";
			
			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://pcxxxx.edu.tuis.ac.jp/test_1";
String user = "";
String password = "";
			
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://pcxxxx.edu.tuis.ac.jp/test_1" となる。つまり、サブプロトコルは"mysql"、サブネームは"//pcxxxx.edu.tuis.ac.jp/test_1" となる。

Connection conn = DriverManager.getConnection(url, user, password);
では、上記のURL、ユーザ名、パスワードの情報を引数として getConnection()メソッドに渡すことで、指定されたデータベースへの接続 をおこない、接続オブジェクトを取得する。

conn.close();
では、取得された接続オブジェクトをクローズしている。

2.4 データベースとの接続 (2)

以下のJdbcTest4.javaは、指定されたホストにあるデータベースサーバと接続する プログラムである。この場合のプログラムには、引数としてユーザ名を 匿名ユーザ、パスワードを省略して与えられ実行されることになる。

import java.net.*;
import java.sql.*;

public class JdbcTest4 {
  public static void main( String args[] ) throws Exception {
    String servername     = args[0]; 
    // // 接続先サーバー名は,第1引数として与える。
    String urlprefix      = "jdbc:mysql://";
    //    String databasename   = "mysql";
    String databasename   = "test";
    //    String user           = "root";
    String user           = "";
	StringBuffer temp = null;
    if(args.length == 2) temp = new StringBuffer( args[1] ); else temp = new StringBuffer( "" );
	String password = temp.toString(); 
        // パスワードは,第2引数として与える。
    // String serverencoding = "EUC_JP";
    String serverencoding = "SJIS";
  
    String url =  urlprefix + servername + "/" + databasename
               + "?useUnicode=true&characterEncoding=" + serverencoding;
  
    Connection con = null;
    try {
      Class.forName( "org.gjt.mm.mysql.Driver" );               
      // Loading Driver
      con = DriverManager.getConnection( url, user, password ); // Connecting MySQL server
      System.out.println( "Connected...." );
      con.close();
    }
    catch( SQLException e ) {
      System.out.println( "Connection Failed. : " + e.toString() );
      throw new Exception();
    }
    catch( Exception e ) {
      System.out.println( "Exception! :" + e.toString() );  
      throw new Exception();
    }
    finally {
      try {
        if ( con != null ) con.close();
      }
      catch(Exception e){
        System.out.println( "Exception! :" + e.toString() );
        throw new Exception();
      }
    }
  }
}

JdbcTest4.javaは、

java JdbcTest4 pcXXXX  ↓
により、pcXXXXにあるデータベースサーバと接続し、JdbcTest1.java プログラムを実行する。この場合のプログラムには、引数としてユーザ名を 匿名ユーザ、パスワードを省略して与えられ実行されることになる。

プログラム JdbcTest4.java の説明

JdbcTest4.javaは、 pcXXXXにあるデータベースサーバと接続し、 プログラムを実行する。この場合のプログラムには、引数として 接続サーバ名が与えられる。ここでは、引数としては接続サーバ名 であるpcXXXXが与えられる。また、ユーザ名は匿名ユーザ、パスワード は省略されている。

まず、

import java.net.*;
import java.sql.*;
では、java.netパッケージとJDBC2.0 Core APIであるjava.sqlパッケージが インポートされる。

    String servername     = args[0]; 
では、プログラムの第1引数は、接続先サーバー名として 与えることを示している。

    String user           = "";
では、データベースの接続に用いるユーザ名を指定しており、ここでは 匿名ユーザをあらわしている。

    StringBuffer temp = null;
    if(args.length == 2) temp = new StringBuffer( args[1] ); else temp = new StringBuffer( "" );
    String password = temp.toString(); 
では、データベースの接続に用いるユーザのパスワードを指定しており、 第2引数として与えられる。第2引数が与えられない場合には、文字列""として 指定される。

    String serverencoding = "SJIS";
    String url =  urlprefix + servername + "/" + databasename
               + "?useUnicode=true&characterEncoding=" + serverencoding;
では、取り扱う文字コードをSJIS文字とし、データベースをあらわすURLを 設定している。

データベースをあらわすURL(データベースURL)は、データベースに接続する場合に 必要となる情報をセットした文字列である。この文字列の構造は、"jdbc"、 サブプロトコル、サブネームの3つの部分から構成される。

jdbc:サブプロトコル:サブネーム

サブプロトコルは、ドライバやデータベースによる決まる名前である。 一般には、データベースソフトウエアの名称が指定される。 サブネームは、サブプロトコルにより規定されるデータソース、一般には データベース名やデータベースソフトウエアが動作するホスト名、ポート 番号などが記述される。

データベースURLのサブネームのパラメータにより、使用する文字をUnicode、 サーバの文字コードをSJIS文字であると指定している。

 Class.forName( "org.gjt.mm.mysql.Driver" );    
では、クラスローダによりJDBCドライバを読み込んでいることを 示している。引数は、データベースにアクセスするためのJDBCドライバ のクラス名である。

con = DriverManager.getConnection( url, user, password ); // Connecting MySQL server
では、DriverManagerクラスのgetConnectionメソッドを使ってデータベースに 接続する。ここで、第一引数に与えているものが、上記のデータベースURL である。実行されたメソッドの戻り値は、接続を表すConnectionオブジェクトである。

con.close();
では、データベース接続のためのConnectionオブジェクトをクローズする。

3. 演習問題

問題-1

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

問題-2

MySQLを利用するために、必要なJDBCドライバは Type1〜4のどのドライバに該当するかを説明せよ。

問題-3

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

問題-4

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

問題-5

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

問題-6

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

問題-7

Javaアプリケーションである、JdbcTest4.java を実行し、その結果を表示せよ。その場合、 接続するデータベースを作成した(データベース サーバがある)ホストを指定せよ。 また、それ以外のホストを引数として与えて実行した場合の 実行結果についても示せ。

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


nagai@rsch.tuis.ac.jp (Based upon mizutani@rsch.tuis.ac.jp's style sheets & results)