SAK 図書館

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

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 編資料
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索



Copyright (C) 1999-2024 Y.SAK