web-dev-qa-db-ja.com

MyBatis / iBatis-別のSQLマップファイル内の再利用可能なSQLフラグメント?

いくつかのSQLMapXMLファイルで使用されているSQLフラグメントを別のファイルに入れたいと思います。現時点では、これらのフラグメントを含む<sql>要素は、<select>などの他の要素と一緒にマッパーの1つに含まれているため、見つけるのが困難です。

いくつかの<sql>要素を定義し、インターフェイスへの実装を生成するために使用されないマッパーを使用できますか?このマッパーの正しい名前空間は何でしょうか?

これは、framentを含むSQLマップファイルです。

<mapper namespace="com.company.project.dao.someDao">

    <sql id="whereDate">
        WHERE date(`time`) BETWEEN #{startDate} AND #{endDate}
    </sql>  

    <sql id="someOtherSqlFragment">
        ...
    </sql>

    <select id="getSomeData" resultType="SomeClass" parameterType="DateParam" >
        SELECT some_column, another_column          
        FROM some_table
        <include refid="whereDate"/>
        <include refid="otherSqlFragment"/>
    </select>

</mapper>

このように要素を分離したいと思います:
最初のSQLマップファイル:

<mapper namespace="com.company.project.dao.???">

    <sql id="whereDate">
        WHERE date(`time`) BETWEEN #{startDate} AND #{endDate}
    </sql>  

    <sql id="someOtherSqlFragment">
        ...
    </sql>

</mapper>

2番目のSQLマップファイル:

<mapper namespace="com.company.project.dao.someDao">

    <select id="getSomeData" resultType="SomeClass" parameterType="DateParam" >
        SELECT some_column, another_column          
        FROM some_table     
        <include refid="whereDate"/>
        <include refid="otherSqlFragment"/>
    </select>

</mapper>
20
prasopes

これはまさに私が以前取り組んでいたプロジェクトが行ったことです。一般的なフラグメントは、メインのiBATIS構成ファイルに含まれている別のファイルで定義されました。

ルートにCore.ism.xmlという名前のSQLマップファイルがありました。これは次のようになります。

<sqlMap namespace="Core" >

    <sql id="fragmentBasicAuditFieldNames">
        CreateDate, CreateUser, 
        UpdateDate, UpdateUser, UpdateCode 
    </sql>

    ....

そして、SQLマップファイルでは、次のように参照できます。

<include refid="Core.fragmentBasicAuditFieldNames" />

私はあなたが正しく尋ねていたことを理解したと思います!

27
user7094

言う、あなたはいくつかを持っています

<mapper namespace="Common">
   <sql id="idsIn">
        ${column} IN
        <foreach item="id" collection="ids" separator="," open="(" close=")">
            #{id}
        </foreach>
    </sql>
</mapper>

別のマッパーよりも、次のように使用できます。

<mapper namespace="OtherMapper">
    <sql id="someSql">
        ...
        <include refid="Common.idsIn">
            <property name="column" value="${column}"/>
            <!-- OR hardcode: <property name="column" value="id"/> -->
            <property name="filterPksTable" value="${filterPksTable}"/>
        </include>
        ...
    </sql>
</mapper>

また、あなたは見ることができます ここ

2