= SQLInterface生成手順の変更 <[v030desc バージョン0.3.0の概要へ戻る]> =
{{{
バージョン0.3.0からSQLInterface(SQLXMLとリンクするSQL実行インタフェース)の生成方法が変わりました。
従来の方法では、「org.dyndns.nuda.mapper.JDBCQueryHandler」を用いてインスタンスの生成を行いました。
以下に従来の方法でのSQLInterfaceの生成方法を示します。
}}}
{{{ code java
// JDBCコネクションを作成
Connection con = DriverManager.getConnection("[Insert Connect String]");
// SQLXMLインタフェースを生成
// 第一引数:コネクションオブジェクト
// 第二引数:SQLXMLインタフェースクラスオブジェクト
SampleInterface intf =
JDBCQueryHandler.getHandler(con, SampleInterface.class);
}}}
{{{
この方法では、SQLInterfaceとSQLXML/JDBCConnectionなどを結びつけるSQLInterfaceコンテナ
に必要なパラメータが増える度に、getHandlerメソッドのシグニチャを修正する必要があり(オーバーロードする必要があり)
変化に対応しづらいことが問題でした
}}}
{{{
そこで、本バージョン0.3.0からはJDBCQueryHandlerの使用をやめ、新たに「org.dyndns.nuda.mapper.SQLInterfaceFactory」
クラスを導入しました。
このクラスはいわゆるBuilderクラスであり、SQLInterfaceコンテナの生成に必要なパラメータを適宜設定したあと
自然な形でSQLInterfaceを生成することができます。
以下にサンプルコードを示します。
}}}
{{{ code java
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 [[BR]]マニュアルコミットモード:false||
||3||useManualTransaction||boolean||ユーザベーストランザクションを有効にする:true [[BR]]ユーザベーストランザクションを無効にする:false||
||4||currentClassLoader||クラスローダオブジェクト||SQLインタフェースを生成する際に用いるクラスローダを指定します[[BR]]未指定の場合は、コンテキストクラスローダが用いられます||
||5||dataSource||JDBCデータソースオブジェクト||JDBCコネクションオブジェクトの代わりにjavax.sql.!DataSourceクラスのインスタンスを用いることもできます。[[BR]]サーブレットコンテナなどでJNDI経由でJDBCコネクションを利用する場合はこちらを使用してください。||
== '''「useAutoCommit」と「useManualTransaction」''' ==
{{{
useAutoCommitとuseManualTransactionは、ユーザベーストランザクション制御を行うためのフラグです。
useAutoCommitに関しては、通常JDBCで用いる自動コミットフラグと本質的に同様のものです。
useManualTransactionは、SQLInterfaceコンテナ外でユーザがトランザクションを制御したい場合に用います。
以下にuseAutoCommitとuseManualTransactionの組み合わせで何が起こるのかを示します
}}}
||No.||useAutoCommit||useManualTransaction||結果||
||(1)||true||true||トランザクション制御を行わずに、DMLが発行された時点で自動コミットを行うモードで、JDBCコネクションにて[[BR]]"setAutoCommit=true"を指定した場合と同様の挙動を示します||
||(2)||true||false||本質的に(1)と同様の結果が得られます||
||(3)||false||true||トランザクションの制御をユーザに完全に委ねるモードです。[[BR]]このモードではSQLInterfaceコンテナがコミットやロールバックを行うことはありません。||
||(4)||false||false||トランザクションの制御を完全にSQLInterfaceコンテナ任せにするモードです。[[BR]]SQLInterfaceの更新系クエリに関して、メソッドを一回実行するごとにトランザクションがコミット/ロールバックされます||
最後に、ユーザベースでトランザクション制御をするサンプルコードを示します
{{{ code java
// コネクションオブジェクトを生成
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();
}
}
}}}