JDBC
2003.04.04 update.
「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を経由してデータベースにアクセスする方法を説明していきます。
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にアクセスするための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ソースのコンパイル方法です。
簡単です。
DOSプロンプトにて、以下でOKです。
javac jdbctest.java
まずはコマンドラインからの実行方法を説明します。
これはちょっとクセがあって、一番始めに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プログラムについては「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経由でデータベースにアクセスできるようになります。