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 編資料