!!!JDBC 「JDBC」とは、データベースをJava言語より操作するためのインターフェースです。 Java言語のAPIとして存在しています。 データベースは「Oracle」「SQL Server」「MySQL」などがありますが、 JDBCを使用することで、データベースの違いを意識することなくデータを操作することができるようになります。 {{ref_image jdbc_img.png}} これと同等の考えで「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(""); out.println(""); out.println("JDBCTest"); out.println(""); out.println(""); try { //ドライバのロード Class.forName("com.mysql.jdbc.Driver"); } catch(Exception e){ out.println("ドライバのロードに失敗しました。
"); out.println(e.getMessage()+"
"); out.println(""); 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)+"
"); } } rs.close(); stmt.close(); } catch(Exception e){ out.println(e.getMessage()+"
"); } out.println(""); 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で破棄するようにしてください。