オブジェクト指向でやる場合の最初から最後までの流れを、実際の例を挙げて書いていくシリーズ「オブジェクト指向で開発の最初から最後までの手順例」、今、「(4)フレームワークにもとづき、クラスなどの開発手順、雛形の確定」です。
どんな雛形、仕様書を作らないといけないか、については、前回書きました。
今回は、そのなかでも、DBの共通部分です。
■DB共通部分の機能
DB共通部分では、トランザクション処理を行うために、
1.コネクションを生成し
2.コミットする
3.ロールバックする
という機能を提供するのでした。。
1で生成した後、それを使って、各データベースアクセスプログラムが、トランザクション内の1処理(更新など)を行い、最後までうまくいけば2、エラーが起きたら、起きた時点で3を実行するのでした。
ということで、1、2、3のメソッドを提供するクラスを考えます。
■クラスとその概要
今回、そのクラスをMyConnectionとして、コンストラクタ、すなわち、MyConnection()で1、commit()で2、rollback()で3を行うとします。
mySQLの場合とします。
■ソース
で、ソースは、こんなかんじ
import java.util.*; import java.sql.*; /* * トランザクション用のコネクション生成 */ public class MyConnection { /* * JDBC ドライバクラス名 */ public static final String MyDriverName = "org.gjt.mm.mysql.Driver"; /* * JDBC 接続URL(カスタマイズ必要) */ public static final String MyURL = "jdbc:mysql://localhost/mydb?useUnicode=true&characterEncoding=utf8"; /* * ユーザー名(カスタマイズ必要) */ public static final String MyUserName = "admin"; /* * パスワード(カスタマイズ必要) */ public static final String MyPassword = "password"; /* * コネクション */ Connection con = null; /* * ステートメント */ Statement stmt = null; /* * エラー */ Exception err = null; /* * コネクションの生成 */ public MyConnection() { try { // ドライバクラスをロード Class.forName(MyDriverName); // データベースへ接続 con = DriverManager.getConnection (MyURL,MyUserName,MyPassword); // 自動コミットモードを解除します con.setAutoCommit(false); // ステートメントオブジェクトを生成 stmt = con.createStatement(); } catch(Exception e) { err = e; return; } } /* * コミット */ public int commit() { err = null; try { // バッチを実行します stmt.executeBatch(); // コミットします con.commit(); // System.out.println("commit"); } catch (Exception e) { err = e; try { // ロールバックします con.rollback(); // System.out.println("rollback1"); } catch (SQLException ex) { err = ex; } } finally { // データベースへの接続をクローズします try { if (stmt!=null) { stmt.close(); } if (con!=null) { con.close(); } } catch (SQLException e) { err = e; } } if ( err != null ) return -1; return 0; } /* * ロールバック */ public int rollback() { err = null; try { // ロールバックします con.rollback(); // System.out.println("rollback2"); } catch (SQLException ex) { err = ex; } finally { // データベースへの接続をクローズします try { if (stmt!=null) { stmt.close(); } if (con!=null) { con.close(); } } catch (SQLException e) { err = e; } } if ( err != null ) { err.printStackTrace(); return -1; } return 0; } } |
(上記< > ¥は、本当は半角)
■カスタマイズ必要なところ
MyURL,MyUserName,MyPasswordは、それぞれの環境に合わせて、直してください。
(MyDriverNameは、MySQLなら同じだと思います)
System.out.printlnのところは、デバック用でコメントしてありますけど、
いらなかったら消していいところです。
ということで、データベースの共通部分は、これでおしまい。