MyBatis/iBatis - reusable sql fragments in a separate SQL Map file?

31,640

Say, you have some

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

Than in another mapper you can use it like:

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

Also, you can have a look here

Share:
31,640
prasopes
Author by

prasopes

Updated on July 09, 2022

Comments

  • prasopes
    prasopes almost 2 years

    I would like to put sql fragments used by several of my SQL Map XML files in a separate file. At the moment, the <sql> elements with these fragments are in one of the mappers together with other elements like <select>, which makes them hard to find.

    Can I have a mapper that defines just a few <sql> elements and is not used to generate an implementation to an interface? What would be the correct namespace of this mapper?

    This is the SQL Map file with the framents:

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

    I'd like to separate the elements like this:
    First Sql Map file:

    <mapper namespace="com.company.project.dao.???">
    
        <sql id="whereDate">
            WHERE date(`time`) BETWEEN #{startDate} AND #{endDate}
        </sql>  
    
        <sql id="someOtherSqlFragment">
            ...
        </sql>
    
    </mapper>
    

    Second Sql Map file:

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