iBatisを使用してストアド・プロシージャを呼び出す場合のXMLファイル構成


iBatis(現在myBatisに改名されている)は、「半自動化」されたORMツール(sql-mapperを介して)と見なすことができ、あるいはより厳密にはJDBC APIに関する強力なパッケージである.簡単で学びやすいのが利点です.これは、多くのプロジェクトでiBatisを使用する傾向があり、特に複雑なクエリーやレポート機能を多く提供するアプリケーションでは、なぜですか.
<>この本では、iBatisの様々な使い方について説明していますが、著者は特に、Dataaccessという層では、ストレージプロセスを呼び出すことで逆モードであり、使用を推奨しないことを強調しています.そこでiBatisを介してストレージ・プロシージャを呼び出すことについては、非常に簡単なものにすぎません.
しかし、ストレージ・プロシージャを使用する場合も多くあります.ストレージ・プロシージャ自体について、Oracleストレージ・プロシージャを例に挙げると、jdbcトランザクションで、前後依存ステップが複数ある複雑なデータベース・アクセスを完了することができ、アプリケーションとデータベース間の往復通信を削減できます.
ここでは、Oracleデータベースを例に、iBatisを使用してOracleストレージ・プロシージャを呼び出す際の構成の考え方について説明します.ここでは、この文書を読んだ人がiBatisの使用経験があると仮定し、詳細な説明を省略することができます.
Oracleストアド・プロシージャ・インタフェースを参照してください.

  PROCEDURE r_process_order(is_oid       IN VARCHAR2, --    
                          is_taskid       in varchar2, --    
                          is_price         in number, --  
                          is_gap          in number, --    
                          is_notes        in varchar2, --  
                          is_timelimit    in number, --        
                          is_userid       in varchar2, --     
                          is_deptid     in varchar2, --       id

                          oi_flag         OUT INTEGER, --0     -1   
                          os_msg          OUT VARCHAR2, --    
                          os_finish       out varchar2, --         0  1 
                          or_order_item_list  out sys_refcursor, --        
                          or_task_item_list out sys_refcursor, --         
                          or_userlist     out sys_refcursor --         
                          );

これに対応して、ibatisのxmlプロファイルでは、このストレージ・プロシージャに対して呼び出される構成は、以下のように構成される.

	<!--   :   -->
	<parameterMap id="map_r_process_order" class="doRfqReply">
		<parameter property="orderId" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />
		<parameter property="taskId" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />
		<parameter property="price" jdbcType="DOUBLE" javaType="java.math.BigDecimal" mode="IN" />
		<parameter property="gap" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />
		<parameter property="notes" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />
		<parameter property="userId" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />
		<parameter property="deptId" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />

		<parameter property="flag" jdbcType="INTEGER" javaType="int" mode="OUT" />
		<parameter property="msg" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT" />
		<parameter property="strFinish" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT" />
		<parameter property="orderItemList" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" 

resultMap="orderItemListResult" />
		<parameter property="taskItemList" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" 

resultMap="taskItemListResult" />
		<parameter property="processUserIds" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" 

resultMap="processUserId" />	
	</parameterMap>
	<procedure id="r_process_order" parameterMap="map_r_rfq_reply">
		{ call p_foo_bar_manager.r_process_order(?,?,?,?,?,?,?,?,?,?,?,?,?)}
	</procedure>

上記のコードには2つの点が含まれています.idは「map_r_process_order」であり、入力パラメータとOracleストレージ・プロシージャ・インタフェース・パラメータとのマッピング関係を宣言し、順序に従って対応します.
idは、「r_process_order」のストレージプロシージャ呼び出しを実行する.ストアドプロシージャのINパラメータタイプとOUTパラメータタイプは、合計13個ですので?番号の個数も13で、順番に対応しています.
Javaコードはここで省略します:基本的に、比較的簡単な方法は、INとOUTタイプに対して、2つのVOオブジェクトを用意して、それぞれストレージプロセスの転送パラメータと転送パラメータを包装します.
入力パラメータのプロパティ構造は簡単です.
flag(integer)、msg(String)、複合タイプなどの基本タイプも含む出力パラメータ.ここでorderItemListは、jdbcTypeをORACLECURSORと指定すると、ResultSetとPOJOのデータバインド(ここでのPOJOはOrderItem)を自動的に完了させるために、ストレージ・プロシージャがカーソルでList結果セットを返すことを望んでいることを示します.もちろん、ここではカーソル・ロー・セットの各ローとOrderItemとのマッピング関係を記述するresultMapを提供する必要があります.