Show page source of v030_generate_sqlinterface #90267

= 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();
		}
	}
}}}