6.トランザクション |
(1) JDBC API ( Transaction ) |
・public void commit() throws SQLException
直前のコミット/ロールバック以降に行われた変更をすべて有効とし、Connection が現在保持するデータベースロックをすべて解除します(一連の更新処理を完結)。
・public void rollback() throws SQLException
直前のコミット/ロールバック以降に行われた変更をすべて無効とし、Connection が現在保持するデータベースロックをすべて解除します(更新前に復元される)。
// HelloWorldTranMySQLJDBC.java for MySQL import java.sql.*; // java.sql 必須 public class HelloWorldTranMySQLJDBC { public static void main(String[] args) { Connection con = null; Statement stmt = null; String german = "ドイツ語"; String spain = "0x83588379834383938cea"; // スペイン語 String fran = "Bonjour, tout le monde"; try { Class.forName("org.gjt.mm.mysql.Driver"); // ドライバクラスロード // データベースへ接続 con = DriverManager.getConnection ("jdbc:mysql:///hellodb?useUnicode=true&characterEncoding=SJIS"); System.out.println("comit=" + con.getAutoCommit()); // true を表示 con.setAutoCommit(false); // 自動コミットモードを解除 stmt = con.createStatement(); // ステートメントオブジェクト生成 /** 処理1 変数 **/ String sql = "INSERT INTO hello_world_table VALUES(3,'" + german + "','Hallo Welt')"; stmt.addBatch(sql); /** 処理2 リテラル **/ stmt.addBatch ("INSERT INTO hello_world_table VALUES(4,'フランス語','"+fran+"')"); /** 処理3 16 進 スペイン語 **/ stmt.addBatch("INSERT INTO hello_world_table VALUES(5," + spain + ",'Hola Mundo')"); stmt.executeBatch(); // バッチを実行 con.commit(); // コミット } catch (Exception e) { e.printStackTrace(); try { con.rollback(); // ロールバック } catch (SQLException ex) { e.printStackTrace(); } } finally { // データベースへの接続をクローズ try { if (stmt!=null) { stmt.close(); } if (con!=null) { con.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } |
※?useUnicode=true&characterEncoding=文字コード サーバの文字コードを指定するオプションです。マルチバイトを含んだSQL文は指定する必要があります。日本語を扱う場合、 windows 環境では、シフトJIS( SJIS )、UNIX では、EUC ( EUC_JP )です。 ※con.getAutoCommit , con.setAutoCommit 自動コミットモードを参照したり、更新できます。「 mysql> SET AUTOCOMMIT=0; 」でも解除できます。デフォルトで、commit を勝手に行うモードになっているので、例のように true が表示されます。 ※addBatch(String sql) Statement の現在のコマンドのバッチに SQL 文を追加します。 ※public int[] executeBatch() コマンドのバッチをデータベースに送信して実行します。戻り値はバッチ内のコマンドごとに 1 つの要素が格納されている更新カウントの配列です。この配列はコマンドがバッチに挿入された順序で並べられています。 ※MySQL テーブル 定義の内容 ==> hello_world_table |
実行結果 C:\java_test> javac HelloWorldTranMySQLJDBC.java C:\java_test> java HelloWorldTranMySQLJDBC commit true C:\java_test> mysql mysql> use hellodb Database changed mysql> select * from hello_world_table; +----+------------+------------------------+ | NO | LANGUAGE | MESSAGE | +----+------------+------------------------+ | 1 | 日本語 | こんにちわ 世界 | | 2 | 英語 | Hello World | | 3 | ドイツ語 | Hallo Welt | | 4 | フランス語 | Bonjour, tout le monde | | 5 | スペイン語 | Hola Mundo | +----+------------+------------------------+ 5 rows in set (0.13 sec) mysql> |
mysql の insert コマンドで、日本語指定はOKでした。Java からINSERT するときは、文字コードを指定しないと文字化けします。また、SQL文中に「'」「"」「\」を含ませる場合はエスケープ文字を用いて「\'」「\"」「\\」とします。