トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

JDBC

JDBC

「JDBC」とは、データベースをJava言語より操作するためのインターフェースです。Java言語のAPIとして存在しています。データベースは「Oracle」「SQL Server」「MySQL」などがありますが、 JDBCを使用することで、データベースの違いを意識することなくデータを操作することができるようになります。

これと同等の考えで「ODBC」というのがあります。これはC言語などからデータベースの違いを意識することなく操作することができるインターフェースです。「JDBC」は「ODBC」のJava版、ということになります。また、「JDBC-ODBCブリッジ」というのも存在します。これにより、Javaを使うことであらゆるデータベースを操作することができます。

さて、「JDBC」からデータベースにアクセスするには、各データベース用の「ブリッジ」というのが必要です。これは「JDBC」とデータベースの橋渡しをするモジュール(ドライバ)です。これがないと、Javaとデータベースは情報をやりとりすることができません。このドライバは、各データベースベンダー(または有志)から提供されている場合が多いですので、確認してみてください。Oracleの場合は、Oracle製品自体にドライバが付属していると思います。MySQLの場合は、「MySQL Connector/J」という名称で「http://mmmysql.sourceforge.net/」で公開されています。

以下で、MySQLの場合のJavaからJDBCを経由してデータベースにアクセスする方法を説明していきます。

MySQLのJDBCドライバのインストール

http://mmmysql.sourceforge.net/より、「MySQL Connector/J」の最新版をダウンロードしてきます。なお、JDBCドライバは、Javaのjar形式(複数の中間ファイルが1つに圧縮されている形です)で提供されていますので、基本的にはOSを意識することなくそのままの形で使用することができます。バイナリとソースが同梱されているzip(またはtar.gz)形式でダウンロードできますので、これを解凍して「mysql-connector-java-3.0.6-stable-bin.jar」を取り出します。これが、ドライバのバイナリになります。このjarファイルを適当な位置に配置してください。ここでは「D:\WinApp\j2sdk1.4.1」に配置しているとします。

JDBCのプログラム

JDBCにアクセスするためのJavaソースは以下のような感じになります。

[jdbctest.java]

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

public class jdbctest {
  public static void main(String argv[]){
 
    try {
      //ドライバのロード
      Class.forName("com.mysql.jdbc.Driver");

    } catch(Exception e){
      System.out.println("ドライバのロードに失敗しました。");
      System.out.println(e.getMessage());
      return;
    }
		
    try {
      //MySQLのデータベース名「mysql」を日本語を有効にして接続
      String url = "jdbc:mysql://localhost/mysql?"
               + "useUnicode=true&characterEncoding=SJIS";
 
      Connection con = DriverManager.getConnection(url);
      Statement stmt = con.createStatement();
      int cou,i;
      ResultSetMetaData meta;

      //テーブル「testyy」のすべてのレコード情報を列挙
      ResultSet rs = stmt.executeQuery("select * from testyy");
      meta = rs.getMetaData();

      //列数の取得
      cou = meta.getColumnCount();

      //レコードの各列ごと(1からcouまで)の内容を取得して表示
      while(rs.next()){
        for(i=1;i<=cou;i++){
          System.out.println(rs.getString(i));
        }
      }
      rs.close();
      stmt.close();

    } catch(Exception e){
      System.out.println(e.getMessage());
      return;
    }
  }
}

この場合は、「Class.forName("com.mysql.jdbc.Driver");」にてMySQLのドライバを指定しています。これは、各JDBCドライバにより指定が変わります。ちなみにOracleの場合だと「Class.forName("oracle.jdbc.driver.OracleDriver");」のようになります。(ただし、OracleのはJDK1.2の時代の指定ですので、今は別の指定かもしれません)。

「DriverManager.getConnection(url);」にて、データベースに接続します。MySQLの場合は、「jdbc:mysql://ホスト名/データベース名?useUnicode=true&characterEncoding=SJIS」のように指定します。ホスト名は、遠隔地にデータベースがある場合のホスト名(ローカルにデータベースがある場合は「localhost」、または記述なしでいいです)、データベース名は、MySQL内の使用するデータベース名、その後の「useUnicode=true&characterEncoding=SJIS」は、文字コードセットとして「Shift-JIS」を使用する、という指定です。「DriverManager.getConnection(url);」は、実際は「DriverManager.getConnection(url,"ユーザー名","パスワード");」なのですが、特にユーザー設定がない場合は、省略も可能です。

Oracleの場合は、

String url = "jdbc:oracle:thin:@localhost:1521:ORCL";
Connection con = DriverManager.getConnection(url,"system","manager");

のように指定できます。urlの指定は「jdbc:oracle:thin:@ホスト名:ポート番号:SID識別子」となり、getConnectionでは、 「DriverManager.getConnection(url,ユーザー名,パスワード);」を指定しています。

以上の「Class.forName」のドライバロード部と「DriverManager.getConnection」によるデータベースへの接続部の2カ所を除いては、すべてのデータベースで同じ記述で制御できます。後は、SQL文を記述しての操作なのですがこれは後ほど。

では、次はこのJavaソースのコンパイル方法です。

JDBCのプログラムコンパイル方法

簡単です。DOSプロンプトにて、以下でOKです。

javac jdbctest.java 

JDBCのプログラム実行方法

まずはコマンドラインからの実行方法を説明します。

これはちょっとクセがあって、一番始めにMySQLをインストールしたときに取り出したJDBCドライバ 「mysql-connector-java-3.0.6-stable-bin.jar」を Javaに認識させる必要があります。このjarファイルを置いている位置を「D:\WinApp\j2sdk1.4.1」とすると、

java -classpath "D:\WinApp\j2sdk1.4.1\mysql-connector-java-3.0.6-stable-bin.jar";. jdbctest

のようにして実行します。これで、JDBC経由でMySQLに接続して実行結果が返ってきます。

「-classpath」の指定は、Javaが理解するモジュールとして、MySQLのJDBCドライバと(セミコロン区切りの)「.」つまり現在のカレントディレクトリ自身のファイル(jdbctest.class自身)を追加で認識させる、という意味になります。

なお、Windowsでは区切りのセパレータは「;」セミコロンなのですが、UNIX環境では「:」コロンとなります。ご注意ください。

[ UNIX環境の場合のJDBCプログラムの実行例 ]

java -classpath "/usr/java/mysql-connector-java-3.0.6-stable-bin.jar":. jdbctest

実行時にこれらのCLASSPATH指定が面倒な場合は、環境変数に追加してしまいましょう。Windowsの場合ですが、

CLASSPATH=D:\WinApp\j2sdk1.4.1\lib\tools.jar;;D:\WinApp\j2sdk1.4.1\mysql-connector-java-3.0.6-stable-bin.jar

でOKです。tools.jarは、JDKのインストールディレクトリの「lib」内に存在します。区切りのセパレータとして「;;」(セミコロン2つ)なのに注意してください。

ServletでのJDBCプログラム

この場合は、もう少し単純になります。Servletプログラムについては「TomcatでのServlet実行環境構築方法」を参照してください。

例えば、Servlet+JDBCのプログラム「JDBCServlet.java」を以下のように書いたとします。

[JDBCServlet.java]

import java.io.*;
import java.text.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

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

public class JDBCServlet extends HttpServlet {

  public void doGet(HttpServletRequest request,
      HttpServletResponse response)
      throws IOException, ServletException {

      response.setContentType("text/html; charset=SHIFT_JIS");
		
      PrintWriter out = response.getWriter();

      out.println("<html>");
      out.println("<head>");

      out.println("<title>JDBCTest</title>");
      out.println("</head>");
      out.println("<body bgcolor=\"white\">");

      try {
          //ドライバのロード
          Class.forName("com.mysql.jdbc.Driver");
			
      } catch(Exception e){
          out.println("ドライバのロードに失敗しました。<br>");
          out.println(e.getMessage()+"<br>");
          out.println("</body></html>");
          out.close();
          return;
      }

      try {
          //MySQLのデータベース名「mysql」を日本語を有効にして接続
          String url = "jdbc:mysql://localhost/mysql?useUnicode=true&" +
                     "characterEncoding=SJIS";

          Connection con = DriverManager.getConnection(url);
          Statement stmt = con.createStatement();
          int cou,i;
          ResultSetMetaData meta;
			
          ResultSet rs = stmt.executeQuery("select * from testyy");
          meta = rs.getMetaData();
          cou = meta.getColumnCount();
          while(rs.next()){
              for(i=1;i<=cou;i++){
                  out.print(meta.getColumnName(i)+" = ");
                  out.println(rs.getString(i)+"<br>");
              }
          }
          rs.close();
          stmt.close();

      } catch(Exception e){
          out.println(e.getMessage()+"<br>");
      }

      out.println("</body></html>");

      out.close();
  }
}

コンパイルは、「servlet.jar」をCLASSPATHに追加するようにして、以下の感じで行います。

javac -classpath "D:\WinApp\Apache Group\Tomcat 4.1\common\lib\servlet.jar" JDBCServlet.java

これで、「JDBCServlet.class」が生成されますので、Tomcatの任意のディレクトリの「WEB-INF\classes」に配置します。さて、ここで、JDBCにアクセスするのでそのJDBCドライバをTomcatで認識させておく必要があります。

Tomcatディレクトリの「shared\lib」内に「mysql-connector-java-3.0.6-stable-bin.jar」を放り込んで Tomcatを再起動してください。この「shared\lib」には、Tomcat全体で参照されるモジュール(jarファイル)を配置します。個々のフォルダごとにモジュールを分けておきたいときは、「webapps\xxxx\WEB-INF\lib」ディレクトリを作成して、そこにjarファイルを放り込んでおいてください。

[Tomcat 4.1]
  +[bin]
  +[common]
  +[conf]
  +[logs]
  +[server]
  +[shared]
      +[classes]
      +[lib]   ← ココ
  ...
  +[webapps]
      +[examples]
      +[ROOT]
      +[tomcat-docs]
      +[webdav]

後は、「Tomcat 4.1\webapps\mydir\WEB-INF\classes」に「JDBCServlet.class」を放り込んだ場合は、 Webブラウザより「http://localhost:8080/mydir/servlet/JDBCServlet」と実行すると、 ServletでJDBC経由でデータベースにアクセスできるようになります。

JDBCでのSQL実行処理

JDBC経由でSQL文を実行する場合、大きく問い合わせ系(select)と実行系(insert/updateなど)分かれます。それぞれ、実行する命令が違います。

SQLの実行処理(insert/updateなど)を行う場合

Statement stmt = con.CreateStatement();
 ...
stmt.executeUpdate("insert into testtbl values(7,'test','wk')");
 ...

executeUpdate命令により処理を「実行」します。いわゆる、一発モノの命令を投げます。insert/update/drop tableなどを実行することができます。

SQLの問い合わせ処理(select)を行う場合

Statement stmt = con.CreateStatement();
 ...
ResultSet rs = stmt.executeQuery("select count(*) from testtbl");
if(rs.next()) {
  System.out.println("testtblのレコード数:" + rs.getString(1));
}
rs.close();
 ...

SQLのselect文を実行して結果を返してもらう場合は、executeQuery命令により、結果をResultSet型に返します。ResultSetより情報を取得します。使用後はcloseで破棄するようにしてください。

Future's Laboratory 技術格納庫 2004-2013 Yutaka Yoshisaka.