MyBatis/iBatis - 在单独的 SQL Map 文件中提供可重用的 sql 片段?

2022-09-02 03:17:09

我想将我的几个 SQL Map XML 文件使用的 sql 片段放在一个单独的文件中。目前,具有这些片段的元素与其他元素(如)一起位于其中一个映射器中,这使得它们很难找到。<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          
        FROM some_table
        <include refid="whereDate"/>
        <include refid="otherSqlFragment"/>
    </select>

</mapper>

我想像这样分离元素:
第一个Sql Map文件:

<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          
        FROM some_table     
        <include refid="whereDate"/>
        <include refid="otherSqlFragment"/>
    </select>

</mapper>

答案 1

这正是我曾经从事的一个项目所做的。公共片段在一个单独的文件中定义,该文件包含在主iBATIS配置文件中。

我们在名为“根目录”的根目录下有一个 SQL 映射文件,如下所示:Core.ism.xml

<sqlMap namespace="Core" >

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

    ....

然后在我们的SQL映射文件中,我们可以像这样引用它:

<include refid="Core.fragmentBasicAuditFieldNames" />

我希望我正确地理解了你问的问题!


答案 2

说,你有一些

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

另外,你可以看看这里


推荐