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

pra*_*pes 20 java ibatis mybatis

我想将我的几个SQL Map XML文件使用的sql片段放在一个单独的文件中.目前,<sql>具有这些片段的元素与其他元素一起位于其中一个元素中<select>,这使得它们很难找到.
我是否可以使用仅定义几个<sql>元素的映射器,而不是用于生成接口的实现?这个映射器的正确名称空间是什么?

这是包含framents的SQL Map文件:

<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>
Run Code Online (Sandbox Code Playgroud)

我想分开这样的元素:
第一个Sql Map文件:

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

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

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

</mapper>
Run Code Online (Sandbox Code Playgroud)

第二个Sql Map文件:

<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>
Run Code Online (Sandbox Code Playgroud)

小智 28

这正是我以前工作过的项目.常见片段在单独的文件中定义,该文件包含在主iBATIS配置文件中.

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

<sqlMap namespace="Core" >

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

    ....
Run Code Online (Sandbox Code Playgroud)

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

<include refid="Core.fragmentBasicAuditFieldNames" />
Run Code Online (Sandbox Code Playgroud)

我希望我能理解你的要求!

  • 如果您使用的是MyBatis,请将"sqlMap"替换为"mapper".请参阅http://code.google.com/p/mybatis/wiki/DocUpgrade3.我直截了当地遵循了上述解决方案并遇到了其他问题.然后我意识到我正在使用MyBatis并且必须使用mapper而不是sqlMap. (3认同)

Ale*_*tov 6

说吧,你有一些

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

与另一个映射器相比,您可以像这样使用它:

<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>
Run Code Online (Sandbox Code Playgroud)

另外,你也可以在这里看看