JDBC 基礎

JDBC 基礎

  1. Java とデータベース
  2. JDBC のクラス
  3. JDBC ドライバのタイプ
  4. JDBC ドライバを使うための設定
  5. JDBC ドライバと oracle java パッケージの関係
  6. JDBC の使い方
  7. 例: oracle jdbc OCI8 ドライバでの接続:log
  8. 例: oracle jdbc THIN ドライバでの接続
  9. JDBC のバージョンを知るには?
  10. JDBC-ODBC ブリッジ

JDBC 応用

  1. JDBC の ConnectionPooling を使う
  2. JDBC での様々な接続の仕方
  3. JDBC のいろいろな使い方
    1. Connect.java
    2. DBInfo.java
    3. Resources.java
    4. Register.java
    5. tydbpj2/util/resources/dbinfo.properties
  4. JDBC 固有の oracle エラー一覧  

  1. Java とデータベース
  2. JDBC は、データベースへの接続、SQL 文、結果の集合、 データベースメタデータ(データに関するデータ)などを表す Java クラスを定義します。 これによって、java プログラマはデータベースを読み書きする SQL 文を発行できます。

    JDBC それ自身は完全に java で書かれており、どこでも実行できます。 異種 DB 接続を可能にするために、複数のドライバ接続をサポートします。

    JDBC は数十個の java クラスを含むパッケージからなり、 これらのうちのいくつかはインタフェースであり、これらを実装したコードが、 ドライバと呼ばれるデータベース固有のソフトウェアで、 データベース・ベンダから提供されています。

    java プログラムは、ドライバを通してデータベースに接続するために JDBC パッケージの中のメソッドを呼び出します。


    ユーザのコード JDBC ドライバ データベース
    import java.sql.*;
    class UseDB {

    }
    接続

    データ処理
    ユーティリティ
    Oracle ドライバ

    jdbc-odbcブリッジodbcドライバ
    Oracle
    データベース

    JDBC の位置         

  3. JDBC のクラス
  4. 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.ResultSetSQL 文の実行結果を保持する
    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 のサブクラスで、 データの値が予期されない状態で丸められたときに生じる

  5. JDBC ドライバのタイプ
  6. 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 thinthin java.sql

    type2 の oci は、java と c で作られているため、 oracle の提供する java jdbc パッケージと c で作られた共用ライブラリが必要です。 一方、type4 の thin は、100% java で書かれているため、 oracle の提供する java jdbc パッケージのみを使用します。


    参考ページ
    JDBC ドライバのの4つの型について


  7. JDBC ドライバを使うための設定
  8. 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
    

  9. JDBC ドライバと oracle java パッケージの関係
  10. 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
    

  11. JDBC の使い方
  12. JDBC を使ってデータベースとやりとりをするには、次の4段階が必要です。

    1. 必要なドライバをロードします。
    2. 使用するデータベースを指定します。
    3. データベースに接続します。
    4. コネクションを通して SQL 文を送り、結果を受け取ります。

    1. 必要なドライバをロードします。
      static メソッド Class.forName("DriverName") を実際のドライバ名を引数に呼び出すだけでよい。 この forName メソッドは、ランタイムクラス記述子を取得するメソッドですが、 同時に関連するライブラリやクラスを実行中の java システムにロードします。

      データベースには問い合わせを受け付けるドライバがあり、 これでデータベースの内部形式を受け取り、結果を返します。

    2. 使用するデータベースを指定します。
      URL 形式で使いたいデータベースを指定します。
      これはドライバ依存の機能なのでドライバについてのドキュメント を参照してください。

    3. データベースに接続します。
      JDBC にプログラムを登録する。
      接続のためのクラスを用いて、対象とするデータベースに接続します。

      DriverManager クラスは、ドライバクラスをすべてロードし、 そのドライバの1つで URL へ接続を試みます。

      接続の方法は、oracle の場合 oci と thin の2つありますが、 どちらで接続しても、結果は同じです。

      1. oci
        形式1:jdbc:oracle:oci8:@
        形式2:jdbc:oracle:oci8:@tns 登録名

        形式1はローカル接続、形式2は tnsnames.ora に登録された方法で接続されます。

      2. thin
        形式:jdbc:oracle:thin:@ホスト名:ポート番号:$ORACLE_SID

    4. コネクションを通して SQL 文を送り、結果を受け取ります。
      通常、結果は ResultSet のテーブルの形で返されます。

      ResultSet クラスには、 SQL 文の実行結果にアクセスするメソッドが用意されています。

      ResultSetMetaData クラスには、ResultSet に関する情報(行、列数、名前、 サイズなど)の型やプロパティを得るメソッドが用意されています。

      なお、SQL 文内のシングルクオートはエスケープしなければなりません。
      static String sel_stmt = "select ename from emp where job like \'CLERK%\'";

  13. 例: oracle jdbc OCI8 ドライバでの接続log
  14. /*
     * 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() メソッドを呼ぶ行をコメントにして実行してみましょう。

  15. 例: oracle jdbc THIN ドライバでの接続
  16. 上記、database_URL を以下のように変更すればできます。

    形式:jdbc:oracle:thin:@ホスト名:ポート番号:ORACLE_SID
    
    static final String database_URL= "jdbc:oracle:thin:@osaka:1531:ora805";
    

  17. JDBC のバージョンを知るには?
  18. 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);
      }
    }
    

  19. JDBC-ODBC ブリッジ
  20. 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


まとめ

JDBC の使い方

  1. 必要なドライバをロードします。
  2. 使用するデータベースを指定します。
  3. データベースに接続します。
  4. コネクションを通して SQL 文を送り、結果を受け取ります。