CommonTools (V0.4.1b) | 2014-06-06 23:24 |
sormap (V0.4.0.0) | 2014-06-06 23:13 |
バージョン0.3.0からSQLInterface(SQLXMLとリンクするSQL実行インタフェース)の生成方法が変わりました。 従来の方法では、「org.dyndns.nuda.mapper.JDBCQueryHandler」を用いてインスタンスの生成を行いました。 以下に従来の方法でのSQLInterfaceの生成方法を示します。
この方法では、SQLInterfaceとSQLXML/JDBCConnectionなどを結びつけるSQLInterfaceコンテナ に必要なパラメータが増える度に、getHandlerメソッドのシグニチャを修正する必要があり(オーバーロードする必要があり) 変化に対応しづらいことが問題でした
そこで、本バージョン0.3.0からはJDBCQueryHandlerの使用をやめ、新たに「org.dyndns.nuda.mapper.SQLInterfaceFactory」 クラスを導入しました。 このクラスはいわゆるBuilderクラスであり、SQLInterfaceコンテナの生成に必要なパラメータを適宜設定したあと 自然な形でSQLInterfaceを生成することができます。 以下にサンプルコードを示します。
- Connection con =
- DriverManager.getConnection("jdbc:sormap://localhost:3306/testdb?subProtocol=mysql");
- SampleInterface intf =
- SQLInterfaceFactory
- .newInstance()
- .connection(con) // コネクションオブジェクトを指定
- .useAutoCommit(false) // 自動コミットモードオフ
- .useManualTransaction(false) // ユーザベーストランザクション制御オフ
- .create(SampleInterface.class); // SQLInterfaceを生成
一行目のJDBCコネクションの生成部分で、接続文字列のサブプロトコル('mysql'や'postgresql'などが入る部分) が見慣れない形になっておりますが、今はあまり気にしないでください。 この接続文字列は、同じくバージョン0.3.0で導入されたトランザクションイベントをJDBCコネクション 経由で扱うための特別なJDBCドライバを呼び出すために使います。 (この接続文字列は、実際はローカルマシンのポート3306で待機しているMySQLサーバに接続を試みます) 4行目からのSampleInterfaceクラスの生成処理をご覧ください。 SQLInterfaceFactoryのstaticメソッドである「newInstance」をコールした後、各種メソッドでパラメータを設定していき 最終的に「create」メソッドでSQLInterfaceの生成を行います。 現在生成時に指定可能なパラメータは以下の通りです
No. | メソッド名 | 指定するオブジェクト | 概要 |
1 | connection | JDBCコネクションオブジェクト | SQLを発行する際に使用するJDBCコネクションを指定します |
2 | useAutoCommit | boolean | オートコミットモード:true マニュアルコミットモード:false |
3 | useManualTransaction | boolean | ユーザベーストランザクションを有効にする:true ユーザベーストランザクションを無効にする:false |
4 | currentClassLoader | クラスローダオブジェクト | SQLインタフェースを生成する際に用いるクラスローダを指定します 未指定の場合は、コンテキストクラスローダが用いられます |
5 | dataSource | JDBCデータソースオブジェクト | JDBCコネクションオブジェクトの代わりにjavax.sql.DataSourceクラスのインスタンスを用いることもできます。 サーブレットコンテナなどでJNDI経由でJDBCコネクションを利用する場合はこちらを使用してください。 |
useAutoCommitとuseManualTransactionは、ユーザベーストランザクション制御を行うためのフラグです。 useAutoCommitに関しては、通常JDBCで用いる自動コミットフラグと本質的に同様のものです。 useManualTransactionは、SQLInterfaceコンテナ外でユーザがトランザクションを制御したい場合に用います。 以下にuseAutoCommitとuseManualTransactionの組み合わせで何が起こるのかを示します
No. | useAutoCommit | useManualTransaction | 結果 |
(1) | true | true | トランザクション制御を行わずに、DMLが発行された時点で自動コミットを行うモードで、JDBCコネクションにて "setAutoCommit=true"を指定した場合と同様の挙動を示します |
(2) | true | false | 本質的に(1)と同様の結果が得られます |
(3) | false | true | トランザクションの制御をユーザに完全に委ねるモードです。 このモードではSQLInterfaceコンテナがコミットやロールバックを行うことはありません。 |
(4) | false | false | トランザクションの制御を完全にSQLInterfaceコンテナ任せにするモードです。 SQLInterfaceの更新系クエリに関して、メソッドを一回実行するごとにトランザクションがコミット/ロールバックされます |
最後に、ユーザベースでトランザクション制御をするサンプルコードを示します
- // コネクションオブジェクトを生成
- Connection con =
- DriverManager.getConnection("jdbc:sormap://localhost:3306/testdb?subProtocol=mysql");
- SampleInterface intf =
- SQLInterfaceFactory
- .newInstance()
- .connection(con) // コネクションオブジェクトを指定
- .useAutoCommit(false) // 自動コミットモードオフ
- .useManualTransaction(true) // ユーザベーストランザクション制御オフ
- .create(SampleInterface.class); // SQLInterfaceを生成
- intf.insert(new ArrayList<TestSchemeBean>()); // デモなのでデータは指定していない(あくまでイメージ)
- intf.update(new ArrayList<TestSchemeBean>()); // デモなのでデータは指定していない(あくまでイメージ)
- intf.delete(new ArrayList<TestSchemeBean>()); // デモなのでデータは指定していない(あくまでイメージ)
- // この時点で、上記3つのメソッドの実行結果はコミットされていない
- try {
- // 通常のJDBCプログラミングと全く同様の方法で
- // コミットを行う
- con.setAutoCommit(true);
- con.commit();
- } catch (SQLException e) {
- try {
- // 例外が発生したらロールバック
- con.rollback();
- } catch (SQLException e1) {
- // TODO 自動生成された catch ブロック
- e1.printStackTrace();
- }
- }