MyBatis / iBatis - повторно используемые фрагменты SQL в отдельном файле карты SQL? - PullRequest
20 голосов
/ 20 мая 2011

Я хотел бы поместить фрагменты sql, используемые несколькими моими XML-файлами SQL Map, в отдельный файл.На данный момент элементы <sql> с этими фрагментами находятся в одном из картографов вместе с другими элементами, такими как <select>, что затрудняет их поиск.
Могу ли я иметь картограф, который определяет только несколько <sql>элементы и не используется для генерации реализации интерфейса?Каково будет правильное пространство имен этого преобразователя?

Это файл карты 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
    </select>

        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>

Второй файл карты Sql:

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

    <select id="getSomeData"
            resultType="SomeClass"
            parameterType="DateParam" >
        SELECT some_column, another_column
    </select>

        FROM some_table

        <include refid="whereDate"/>

        <include refid="otherSqlFragment"/>

    </select>

</mapper>

Ответы [ 2 ]

27 голосов
/ 20 мая 2011

Это именно то, что сделал проект, над которым я работал.Общие фрагменты были определены в отдельном файле, который был включен в основной файл конфигурации iBATIS.

У нас был файл карты SQL в корне с именем Core.ism.xml, который выглядел так:

<sqlMap namespace="Core" >

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

    ....

А затем в наших файлах карт SQL мы могли бы ссылаться на это так:

<include refid="Core.fragmentBasicAuditFieldNames" />

Надеюсь, я правильно понял, что вы спрашивали!

2 голосов
/ 12 апреля 2017

Скажите, у вас есть

<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>

Также вы можете посмотреть здесь

...