教育サーバーのページ
オンラインテキスト目次
システムプログラミング演習
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("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ドライバの登録に失敗しました"というメッセージが表示される。
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() を使用して求める。
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();では、取得された接続オブジェクトをクローズしている。
以下の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オブジェクトをクローズする。
問題-1
問題-2
問題-3
問題-4
問題-5
問題-6
問題-7