SAK 図書館
MySQL 編5 - JDBC + JAVA Servlet、JSP、レコード更新、レコード参照
MySQL の JDBC ドライバは、
mysql-connector-java-3.0.8-stable.zip
のパッケージから、mysql-connector-java-3.0.8-stable-bin.jar を lib に
配置した。2.0.14 の JDBC ドライバでは日本語が扱えなかった。
3.0.8 の JDBC ドライバは日本語が正常に扱える。
■J2SDK1.4.1 でのシフトJIS の扱い変更に伴う問題
・JDBC で Oracle9i の文字データをアクセスすると記号文字「〜」、「−」
関係が ? になる。次のコード回避した。
MySQL では時間がなく検証していないので注意のこと。
s = rs.getString(fld);
s = new String(s.getBytes("SJIS"), "MS932");
但し、UNIX-Tomcat + Windows-Oracle の組み合わせでは、getBytes を
使用すると逆におかしくなる。
UNIX-Tomcat + Windows-Oracle、Windows-Tomcat + Windows-Oracle 共通で
処理するには、次のように「〜」だけ特別な変換をするしかないのかも。
s = rs.getString(fld);
s = s.replace('\u301c', '\uff5e');
・charset= も以前の SJIS、Shift_JIS、iso-2022-jp は MS932 に
しないと記号文字関係が ? になる。
詳しくは、
JAVA Servlet、JSP 基礎編12 - Tomcat4.1.24、J2SDK1.4.1_02、web.xml
を参照下さい。
■MySQL JDBC + JAVA Servlet、JSP レコード更新
・レコード追加で、日本語データが指定できるかテストする。
問題なく追加できる。
<%@ page import="java.util.*,java.sql.*;" contentType="text/html; charset=Shift_JIS"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>JAVA Server Page(JSP) - MySQL JDBC Test</TITLE>
</HEAD>
<BODY>
<P>JAVA Server Page(JSP) - MySQL JDBC Test</P>
<%
String drv = "com.mysql.jdbc.Driver";
String dsn = "jdbc:MySQL://localhost:3306/sak?user=sak&password=";
Connection cn = null;
Statement st = null;
ResultSet rs = null;
// MySQL JDBC ドライバロード
try {
Class.forName(drv);
} catch (Exception e) {
out.println("<P>JDBC ドライバロードエラー<BR>" + e.toString() + "</P>");
}
// MySQL JDBC 接続
try {
cn = DriverManager.getConnection(dsn);
} catch (Exception e) {
out.println("<P>JDBC 接続エラー<BR>" + e.toString() + "</P>");
}
// オートコミット解除
try {
cn.setAutoCommit(false);
} catch (Exception e) {
out.println("<P>オートコミット解除エラー<BR>" + e.toString() + "</P>");
}
// MySQL JDBC ステートメント作成
try {
st = cn.createStatement();
} catch (Exception e) {
out.println("<P>JDBC ステートメント作成エラー<BR>" + e.toString() + "</P>");
}
// MySQL JDBC レコード追加
try {
int ct = 0;
int i;
for (i = 1; i <= 10; i++) {
ct += st.executeUpdate("insert into testm values ('x001', 1, 2, 3)");
ct += st.executeUpdate("insert into testm values ('x002', 10, 20, 30)");
ct += st.executeUpdate("insert into testm values ('日本語1', 1, 2, 3)");
ct += st.executeUpdate("insert into testm values ('日本語2', 1, 2, 3)");
ct += st.executeUpdate("insert into testm values ('日本語3', 1, 2, 3)");
cn.commit();
}
// MySQL 更新件数表示
out.println("<P>count = " + ct + "</P>");
} catch (Exception e) {
out.println("<P>JDBC レコード追加エラー<BR>" + e.toString() + "</P>");
}
// MySQL JDBC ステートメントクローズ
try {
st.close();
} catch (Exception e) {}
// MySQL JDBC 接続クローズ
try {
cn.close();
} catch (Exception e) {}
%>
</BODY>
</HTML>
■MySQL JDBC + JAVA Servlet、JSP トランザクションロールバックテスト
・昔の MySQL はトランザクションをサポートしていなくて悲しかったが、
最近のはトランザクションを利用する設定は面倒であるが、ちゃんと
ロールバックすることができる。
<%@ page import="java.util.*,java.sql.*;" contentType="text/html; charset=Shift_JIS"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>JAVA Server Page(JSP) - MySQL JDBC Test</TITLE>
</HEAD>
<BODY>
<P>JAVA Server Page(JSP) - MySQL JDBC Test</P>
<%
String drv = "com.mysql.jdbc.Driver";
String dsn = "jdbc:MySQL://localhost:3306/sak?user=sak&password=";
Connection cn = null;
Statement st = null;
ResultSet rs = null;
// MySQL JDBC ドライバロード
try {
Class.forName(drv);
} catch (Exception e) {
out.println("<P>JDBC ドライバロードエラー<BR>" + e.toString() + "</P>");
}
// MySQL JDBC 接続
try {
cn = DriverManager.getConnection(dsn);
} catch (Exception e) {
out.println("<P>JDBC 接続エラー<BR>" + e.toString() + "</P>");
}
// オートコミット解除
try {
cn.setAutoCommit(false);
} catch (Exception e) {
out.println("<P>オートコミット解除エラー<BR>" + e.toString() + "</P>");
}
// MySQL JDBC ステートメント作成
try {
st = cn.createStatement();
} catch (Exception e) {
out.println("<P>JDBC ステートメント作成エラー<BR>" + e.toString() + "</P>");
}
// MySQL JDBC レコード追加
try {
int ct = 0;
int i;
for (i = 1; i <= 10; i++) {
ct += st.executeUpdate("insert into testm values ('x001', 1, 2, 3)");
ct += st.executeUpdate("insert into testm values ('x002', 10, 20, 30)");
ct += st.executeUpdate("insert into testm values ('トラン1', 1, 2, 3)");
ct += st.executeUpdate("insert into testm values ('トラン2', 1, 2, 3)");
ct += st.executeUpdate("insert into testm values ('トラン3', 1, 2, 3)");
cn.rollback(); // トランザクションキャンセル
}
// MySQL 更新件数表示
out.println("<P>count = " + ct + "</P>");
} catch (Exception e) {
out.println("<P>JDBC レコード追加エラー<BR>" + e.toString() + "</P>");
}
// MySQL JDBC ステートメントクローズ
try {
st.close();
} catch (Exception e) {}
// MySQL JDBC 接続クローズ
try {
cn.close();
} catch (Exception e) {}
%>
</BODY>
</HTML>
■ロールバック確認
select * from testm;
+--------+---------+---------+---------+
| キー | データ1 | データ2 | データ3 |
+--------+---------+---------+---------+
...
...
| x001 | 1 | 2 | 3 |
| x002 | 10 | 20 | 30 |
| 日本語1 | 1 | 2 | 3 |
| 日本語2 | 1 | 2 | 3 |
| 日本語3 | 1 | 2 | 3 |
+--------+---------+---------+---------+
■MySQL JDBC + JAVA Servlet、JSP レコード参照
・レコード参照で、日本語項目、日本語データが参照できるかテストする。
問題なく参照できる。
<%@ page import="java.util.*,java.sql.*;" contentType="text/html; charset=Shift_JIS"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>JAVA Server Page(JSP) - MySQL JDBC Test</TITLE>
</HEAD>
<BODY>
<P>JAVA Server Page(JSP) - MySQL JDBC Test</P>
<%
String drv = "com.mysql.jdbc.Driver";
String dsn = "jdbc:MySQL://localhost:3306/sak?user=sak&password=";
String sql = "select * from testm";
Connection cn = null;
Statement st = null;
ResultSet rs = null;
// MySQL JDBC ドライバロード
try {
Class.forName(drv);
} catch (Exception e) {
out.println("<P>JDBC ドライバロードエラー<BR>" + e.toString() + "</P>");
}
// MySQL JDBC 接続
try {
cn = DriverManager.getConnection(dsn);
} catch (Exception e) {
out.println("<P>JDBC 接続エラー<BR>" + e.toString() + "</P>");
}
// MySQL JDBC 問い合わせ SQL 作成
try {
st = cn.createStatement();
} catch (Exception e) {
out.println("<P>JDBC 問い合わせ SQL 作成エラー<BR>" + e.toString() + "</P>");
}
// MySQL JDBC レコードセットオープン
try {
rs = st.executeQuery(sql);
} catch (Exception e) {
out.println("<P>JDBC レコードセットオープンエラー<BR>" + e.toString() + "</P>");
}
// MySQL JDBC レコードセットリード
try {
while (rs.next()) {
out.println("<P>" + rs.getString(1) + "</P>");
}
} catch (Exception e) {
out.println("<P>JDBC レコードセットリードエラー<BR>" + e.toString() + "</P>");
}
// MySQL JDBC レコードセットクローズ
try {
rs.close();
} catch (Exception e) {}
// MySQL JDBC ステートメントクローズ
try {
st.close();
} catch (Exception e) {}
// MySQL JDBC 接続クローズ
try {
cn.close();
} catch (Exception e) {}
%>
</BODY>
</HTML>
■その他 JDBC 操作
・SQL に多少の違いはあっても、JDBC そのものの操作は PostgreSQL や
Oracle と変わらない。
『JAVA Servlet、JSP + PostgreSQL 編』、『JAVA Servlet、JSP + Oracle9i 編』
を参考にして下さい。
■MySQL 編資料
■PostgreSQL 編、JAVA Servlet、JSP 編資料
■SQL 基礎編資料
■SQL 基礎実地編資料
■SQL チューニング編資料
■Oracle PL/SQL 編資料