MyBatisとSpringの統合について


MyBatisは、永続化層のORMとして実現され、オブジェクトモデルからリレーショナルデータモデルへの変換が完了し、オブジェクトモデルとリレーショナルモデルとの間の不調和が調整され、従来jdbcでプログラミングされていたコードの大部分が減少し、アプリケーション開発者がビジネスロジック層コードの作成に集中し、作業効率が大幅に向上した.MyBatisは半自動化された永続層フレームワークであり、従来のプロファイルのほか、ドメインオブジェクトのマッピングファイルや、プラグインによって最終的なSQLマッピングを完了する補助機能、例えばページングブロックプラグイン、マッピングファイルには一連の動的SQLが定義されており、各所定のSQL文の上には対応するパラメータと最終的な戻り結果があります.実行時に入力されたパラメータに基づいて、その属性を判断すると、SQL文の生成が動的に完了し、必要な結果セットが生成されます.ドメイン・オブジェクトから最終的な戻りまで、結果セット・マッピング、SQLマッピングを定義する必要があります.結果セット・マッピングでは、ドメイン・オブジェクトとリレーショナル・データ行とのマッピング関係が定義されます.javaオブジェクトに基づく属性とリレーショナル・モデルに基づくデータ列とのマッピングが定義され、元の結果セットを取得した後、反射技術を使用してターゲット・エンティティ・オブジェクトを正確に合成できます.動的SQLの定義は、コンフィギュレーションよりも大きく設定されています.MyBatisマッピング・ファイルのマッピング・ファイルの要素に関するDTD宣言では、0つ以上のresultMapおよびその他の言及要素を定義できるように、そのマッピング・ファイルでは、0つ以上のresultMapおよびその他の言及要素を定義できるように、所定の数の要素しか定義できないことが規定されています.一般的なMyBatisマッピングファイルは、ドメインオブジェクトモデルが次のように仮定されます.
public class DomainData{
	 private Integer id;

	 private String name;

	 private java.util.Date birthday;

	 private AuthUser createBy;

	 //  setters and getters

	}

 
<mapper namespace="DomainData">
	   
		   <resultMap id="DomainData_Result" type="DomainData">
			   <result property="id column="ID" jdbcType ="NUMERIC" />
			   <result property="name" column="NAME" jdbcType="VARCHAR" />
			   <result property="birthday" column="BIRTHDAY" jdbcType="TIMESTAMP"/>
			   <association property="createBy" column="CREATE_BY" select="AuthUser.queryById"/>
		   </resultMap>

		   <!--    -->
		   <insert id="insert" parameterType="DomainData">
			   <selectKey resultType="java.lang.Integer" keyProperty="id" order="BEFORE">
				      SELECT SEQ_DOMAIN_DATA.nextual from dual
			   </selectKey>
			   insert into DOMAIN_DATA(
				   ID,
				   NAME,
				   BIRTHDAY,
				   CREATE_BY
				   )
			   VALUES
				   (
				   #{id,jdbcType=NUMERIC},
				   #{title,jdbcType=VARCHAR},
				   #{birthday,jdbcType=TIMESTAMP},
				   #{createBy.id,jdbcType=NUMERIC}
				   )
		   </insert>

		   <!--    -->
		   <update id="update" parameterType="DomainData">
			   update DOMAIN_DATA
			   <set>
			       <if test="name!=null">
				    NAME=#{name,jdbcType=VARCHAR},
			       </if>
			       <if test="birthday!=null">
				    BIRTHDAY = #{birthday,jdbcType=TIMESTAMP},
			       </if>
			       <if test="createBy != null and createBy.id != null" >
				    CREATE_BY=#{createBy.id,jdbcType=NUMERIC},
			       </if>
			    </set>
			    WHERE 
				ID = #{id,jdbcType=NUMERIC}
		    </update>

		    <!--      -->
		    <delete id="delete" parameterType="java.lang.Integer">
			delete from DOMAIN_DATA where ID = #{id,jdbcType=NUMERIC}
		    </delete>

		    <!--      -->
		    <delete id="logicDelete" parameterType="java.lang.Integer">
			update DOMAIN_DATA set ENABLE_FLAG=0 where ID = #{id,jdbcType=NUMERIC}
		    </delete>

		    <!--      -->
		    <select id="query" parameterType="FeedbackData" resultMap="FeedbackData_Result">
			SELECT 
				*
			FROM DOMAIN_DATA
			<where>
				<if test="id != null" >
					AND ID=#{id,jdbcType=NUMERIC}
				</if>
				<if test="name != null" >
					AND NAME like  CONCAT(CONCAT('%', #{name}), '%')
				</if>
				<if test="birthday != null" >
					AND BIRTHDAY=#{birthday,jdbcType=TIMESTAMP}
				</if>
				<if test="isHandle != null" >
					AND CREATE_BY=#{createBy,jdbcType=VARCHAR}
				</if>
			</where>
		    </select>
	</mapper>

マッピングファイルの例が終わり、Springの統合を実証します.1.Springのプロファイルで、データソース、BasicDataSource、DriverManagerDataSourceを構成する
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
			<property name="driverClassName">
				<value>${jdbc.driverClassName}</value>
			</property>
			<property name="url">
				<value>${jdbc.url}</value>  //     placeHolder
			</property>
			<property name="username">
				<value>${jdbc.username}</value>
			</property>
			<property name="password">
				<value>${jdbc.password}</value>
			</property>
		</bean>

2、SqlSessionFactoryBeanの構成
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
			<property name="dataSource" ref="dataSource" />
			<!--   sqlMapConfig     ,   environment spring       -->
			<property name="configLocation">
				<value>classpath:SqlMapConfig.xml</value>    //mybatis            MyBaits             ,       (    )
			</property>
			<property name="typeAliasesPackage">   //   java     
				<value>
					com.demo.www.test.bo
				</value>
			</property>
			<!--   mybatis     -->
			<property name="mapperLocations">     //       
		    <list>
			<value>classpath*:mapper/**/*.xml</value>
		    </list>
		</property>
		</bean>

   3.MyBatis永続層操作テンプレートクラスの構成(構造および注入)
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
			<constructor-arg index="0" ref="sqlSessionFactory" />
		</bean>

  4.トランザクションの構成(宣言トランザクションを使用して、コアビジネスロジックとトランザクションロジックを剥離し、高集約、低結合)
<!--      -->
		<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		     <property name="dataSource" ref="dataSource" />
		</bean>

		<tx:annotation-driven transaction-manager="transactionManager" />
		<!--     cglib      false spring     -->
		<aop:aspectj-autoproxy proxy-target-class="true" />

	        <!--  Spring  Annotation -->
                <context:annotation-config/>

5、持久層Mybatis操作テンプレート参照の注入関連DAO任務を完成する