SQLInterface生成手順の変更 <バージョン0.3.0の概要へ戻る>

 バージョン0.3.0からSQLInterface(SQLXMLとリンクするSQL実行インタフェース)の生成方法が変わりました。
 従来の方法では、「org.dyndns.nuda.mapper.JDBCQueryHandler」を用いてインスタンスの生成を行いました。
 以下に従来の方法でのSQLInterfaceの生成方法を示します。
  1. // JDBCコネクションを作成
  2. Connection con = DriverManager.getConnection("[Insert Connect String]");
  3. // SQLXMLインタフェースを生成
  4. // 第一引数:コネクションオブジェクト
  5. // 第二引数:SQLXMLインタフェースクラスオブジェクト
  6. SampleInterface intf =
  7. JDBCQueryHandler.getHandler(con, SampleInterface.class);
 この方法では、SQLInterfaceとSQLXML/JDBCConnectionなどを結びつけるSQLInterfaceコンテナ
 に必要なパラメータが増える度に、getHandlerメソッドのシグニチャを修正する必要があり(オーバーロードする必要があり)
 変化に対応しづらいことが問題でした
 そこで、本バージョン0.3.0からはJDBCQueryHandlerの使用をやめ、新たに「org.dyndns.nuda.mapper.SQLInterfaceFactory」
 クラスを導入しました。
 
 このクラスはいわゆるBuilderクラスであり、SQLInterfaceコンテナの生成に必要なパラメータを適宜設定したあと
 自然な形でSQLInterfaceを生成することができます。
 
 以下にサンプルコードを示します。
  1. Connection con =
  2. DriverManager.getConnection("jdbc:sormap://localhost:3306/testdb?subProtocol=mysql");
  3. SampleInterface intf =
  4. SQLInterfaceFactory
  5. .newInstance()
  6. .connection(con) // コネクションオブジェクトを指定
  7. .useAutoCommit(false) // 自動コミットモードオフ
  8. .useManualTransaction(false) // ユーザベーストランザクション制御オフ
  9. .create(SampleInterface.class); // SQLInterfaceを生成
 一行目のJDBCコネクションの生成部分で、接続文字列のサブプロトコル('mysql'や'postgresql'などが入る部分)
 が見慣れない形になっておりますが、今はあまり気にしないでください。
 
 この接続文字列は、同じくバージョン0.3.0で導入されたトランザクションイベントをJDBCコネクション
 経由で扱うための特別なJDBCドライバを呼び出すために使います。
 (この接続文字列は、実際はローカルマシンのポート3306で待機しているMySQLサーバに接続を試みます)
 
 4行目からのSampleInterfaceクラスの生成処理をご覧ください。
 SQLInterfaceFactoryのstaticメソッドである「newInstance」をコールした後、各種メソッドでパラメータを設定していき
 最終的に「create」メソッドでSQLInterfaceの生成を行います。
 
 現在生成時に指定可能なパラメータは以下の通りです
No.メソッド名指定するオブジェクト概要
1connectionJDBCコネクションオブジェクトSQLを発行する際に使用するJDBCコネクションを指定します
2useAutoCommitbooleanオートコミットモード:true
マニュアルコミットモード:false
3useManualTransactionbooleanユーザベーストランザクションを有効にする:true
ユーザベーストランザクションを無効にする:false
4currentClassLoaderクラスローダオブジェクトSQLインタフェースを生成する際に用いるクラスローダを指定します
未指定の場合は、コンテキストクラスローダが用いられます
5dataSourceJDBCデータソースオブジェクトJDBCコネクションオブジェクトの代わりにjavax.sql.DataSourceクラスのインスタンスを用いることもできます。
サーブレットコンテナなどでJNDI経由でJDBCコネクションを利用する場合はこちらを使用してください。

「useAutoCommit」と「useManualTransaction」

 useAutoCommitとuseManualTransactionは、ユーザベーストランザクション制御を行うためのフラグです。
 useAutoCommitに関しては、通常JDBCで用いる自動コミットフラグと本質的に同様のものです。
 
 useManualTransactionは、SQLInterfaceコンテナ外でユーザがトランザクションを制御したい場合に用います。
 以下にuseAutoCommitとuseManualTransactionの組み合わせで何が起こるのかを示します
No.useAutoCommituseManualTransaction結果
(1)truetrueトランザクション制御を行わずに、DMLが発行された時点で自動コミットを行うモードで、JDBCコネクションにて
"setAutoCommit=true"を指定した場合と同様の挙動を示します
(2)truefalse本質的に(1)と同様の結果が得られます
(3)falsetrueトランザクションの制御をユーザに完全に委ねるモードです。
このモードではSQLInterfaceコンテナがコミットやロールバックを行うことはありません。
(4)falsefalseトランザクションの制御を完全にSQLInterfaceコンテナ任せにするモードです。
SQLInterfaceの更新系クエリに関して、メソッドを一回実行するごとにトランザクションがコミット/ロールバックされます

最後に、ユーザベースでトランザクション制御をするサンプルコードを示します

  1. // コネクションオブジェクトを生成
  2. Connection con =
  3. DriverManager.getConnection("jdbc:sormap://localhost:3306/testdb?subProtocol=mysql");
  4. SampleInterface intf =
  5. SQLInterfaceFactory
  6. .newInstance()
  7. .connection(con) // コネクションオブジェクトを指定
  8. .useAutoCommit(false) // 自動コミットモードオフ
  9. .useManualTransaction(true) // ユーザベーストランザクション制御オフ
  10. .create(SampleInterface.class); // SQLInterfaceを生成
  11. intf.insert(new ArrayList<TestSchemeBean>()); // デモなのでデータは指定していない(あくまでイメージ)
  12. intf.update(new ArrayList<TestSchemeBean>()); // デモなのでデータは指定していない(あくまでイメージ)
  13. intf.delete(new ArrayList<TestSchemeBean>()); // デモなのでデータは指定していない(あくまでイメージ)
  14. // この時点で、上記3つのメソッドの実行結果はコミットされていない
  15. try {
  16. // 通常のJDBCプログラミングと全く同様の方法で
  17. // コミットを行う
  18. con.setAutoCommit(true);
  19. con.commit();
  20. } catch (SQLException e) {
  21. try {
  22. // 例外が発生したらロールバック
  23. con.rollback();
  24. } catch (SQLException e1) {
  25. // TODO 自動生成された catch ブロック
  26. e1.printStackTrace();
  27. }
  28. }