iBATIS 3試用手記3


最初の2つの手記はiBATIS 3のクエリー機能に重点を置いています.これは最大の変更点だからです.この手記ではiBATISのPersistance面での改善について説明します.
iBATIS 3は、データベースを永続化するためのラベルを提供しています.まずinsert操作を見てみましょう.
<insert id="insertNewsNotice" parameterType="org.newsnotice.domain.NewsNoticeModel" flushCache="true"
			statementType="PREPARED" timeout="20000">
		<selectKey keyProperty="nnId" order="BEFORE" resultType="long"> SELECT SEQ_NN_MSTR_ID.NEXTVAL FROM DUAL </selectKey>
		INSERT INTO NN_MSTR(
			NN_ID
			<if test="category != null">,CATEGORY</if>
			<if test="subject != null">,SUBJECT</if>
			,POSTED_DATE
			,EXPIRY_DATE
			<if test="alert != null">,ALERT</if>
			<if test="emailAlert != null">,EMAIL_ALERT</if>
			<if test="audience != null">,AUDIENCE</if>
			<if test="filter != null">,FILTER</if>
			<if test="filterValue != null">,FILTER_VALUE</if>
			<if test="subFilterValue != null">
				,SUB_FILTER_VALUE
			</if>
			<if test="excludeUserId != null">
				,EXCLUDE_USER_ID
			</if>
			<if test="department != null">,WF_DEPARTMENT</if>
			<if test="status != null">,WF_STATUS</if>
			<if test="notes != null">,WF_NOTES</if>
			<if test="createdBy != null">,WF_CREATED_BY</if>
			<if test="createdDate != null">,WF_CREATED_ON</if>
			<if test="modifiedBy != null">,WF_MODIFIED_BY</if>
			<if test="modifiedDate != null">
				,WF_MODIFIED_ON
			</if>
			<if test="approvedBy != null">,WF_APPROVED_BY</if>
			<if test="approvedOn != null">,WF_APPROVED_ON</if>
			<if test="version != null">,WF_VERSION</if>
		)VALUES(
			#{nnId}
			<if test="category != null">,#{category}</if>
			<if test="subject != null">,#{subject}</if>
			,sysdate
			,sysdate + 7
			<if test="alert != null">,#{alert}</if>
			<if test="emailAlert != null">,#{emailAlert}</if>
			<if test="audience != null">,#{audience}</if>
			<if test="filter != null">,#{filter}</if>
			<if test="filterValue != null">,#{filterValue}</if>
			<if test="subFilterValue != null">
				,#{subFilterValue}
			</if>
			<if test="excludeUserId != null">
				,#{excludeUserId}
			</if>
			<if test="department != null">,#{department}</if>
			<if test="status != null">,#{status}</if>
			<if test="notes != null">,#{notes}</if>
			<if test="createdBy != null">,#{createdBy}</if>
			<if test="createdDate != null">,#{createdDate}</if>
			<if test="modifiedBy != null">,#{modifiedBy}</if>
			<if test="modifiedDate != null">
				,#{modifiedDate}
			</if>
			<if test="approvedBy != null">,#{approvedBy}</if>
			<if test="approvedOn != null">,#{approvedOn}</if>
			)	
	</insert>

の場合、iBATIS 3には次の属性が追加されました.
  • useGeneratedKeys:trueに設定すると、このタイプのプライマリ・キー
  • が提供されるMySQL/MS SQL Serverのように、テーブルの自己増分列からプライマリ・キー値が自動的に取得されます.
  • keyProperty:プライマリ・キーを格納するプロパティ名
  • statementType:STATEMENT、PREPARED、CALLABLE、デフォルトはPREPAREDに設定でき、ストレージ・プロシージャを呼び出すときにCALLABLEタイプ
  • を使用できるようになります.
    もう1つの改良は、上記のコードに示すように、insert時にラベルを使用してプライマリ・キー値を取得することをサポートすることである.keyPropertyはプライマリ・キーを格納する属性名を指定し、orderはの実行順序を指定し、値はBEFOREまたはAFTERであり、BEFOREであればのSQLを先に実行してから操作を実行し、AFTERは逆です.
      
    次はupdate操作で、iBATIS 3はラベルを提供して操作を便利にし、SETキーワードを追加する必要があるかどうかを自動的に判断します.
    <update id="updateNewsNotice" parameterType="org.newsnotice.domain.NewsNoticeModel"
    			flushCache="true" statementType="PREPARED" timeout="20000">
    	UPDATE NN_MSTR
    	<set>
    		<if test="category != null">CATEGORY = #{category},</if>
    		<if test="subject != null">SUBJECT = #{subject}</if>
    	</set>
    	WHERE NN_ID = #{nnId}
    </update>

     
    Delete操作についてはiBATIS 2と同様であるが,ここでは詳しくは述べない.
     
    さらに、の2つの比較的役に立つラベルを紹介します.
    タグは、主に再利用可能なSQLを定義し、必要な場所でタグを使用して追加すればよい.次のようになります.
    <sql id="newsNoticeColumns">
    	A.NN_ID, A.CATEGORY, A.SUBJECT, A.POSTED_DATE, A.EXPIRY_DATE, A.ALERT, A.EMAIL_ALERT, A.AUDIENCE,
    	A.FILTER, A.FILTER_VALUE, A.SUB_FILTER_VALUE, A.EXCLUDE_USER_ID, A.WF_DEPARTMENT, A.WF_STATUS, A.WF_NOTES,
    	A.DEFUNCT_IND, A.APPROVER, B.ID CONTENT_ID, B.PARENT_NN_ID, B.CONTENT, C.ID MSG_BOX_ID, C.USER_ID, 
    	C.NN_ID MSG_BOX_NN_ID, C.FOLDER, C.READ, C.READ_ON, C.DEFUNCT_IND MSG_BOX_DEFUNCT_IND, C.PI_NO MSG_BOX_PI_NO
    </sql>

     
    <select id="getNewsNotice1" parameterType="org.newsnotice.domain.NewsNoticeModel" resultMap="resultMap-getNewsNotice1" >
    		SELECT <include refid="newsNoticeColumns"/>
    		FROM NN_MSTR A, NN_CONTENT B, NN_MSG_BOX C
    		WHERE A.NN_ID = B.PARENT_NN_ID
    		AND A.NN_ID = C.NN_ID
    
    ......

     
    一方、ラベルは反復集合または配列に使用され、IN操作でよく使用され、JSTLのに似ています.以下のようになります.
    <select id="foreachSelect" parameterType="org.newsnotice.domain.NewsNoticeModel"
    			resultType="int">
    	SELECT COUNT(*) FROM NN_MSTR
    	WHERE WF_STATUS IN
    	<foreach collection="statusArray" item="item" index="index" open="(" separator="," close=")">
    		#{item}
    	</foreach>
    </select>

    最終的に生成されるSQLは、次のようになります.WF_STATUS IN (value1, value2, ....)
     
    最後に、TransactionTypeがJDBCを設定場合、iBATIS 3はAutoCommitがfalseにデフォルト設定されているため、永続化操作が完了するとsessionを呼び出す必要がある.commit()メソッドは、トランザクションをコミットするか、sessionを最初に呼び出す.getConnection().settAutoCommit(autoCommit)は、AutoCommitポリシーを設定します.
     
    iBATIS 3の永続化の紹介はここまでで、次の手記ではiBATIS 3が提供するAnnotation操作を簡単に紹介します.Annotationは簡単なSQLアプリケーションの面ではあまりよくありません.効率が高く、xmlを定義する必要はありません.