javaibatismybatis

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


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>

Solution

  • This is exactly what a project I used to work on did. Common fragments were defined in a separate file which was included in the main iBATIS config file.

    We had a SQL map file at the root named Core.ism.xml which looked like this:

    <sqlMap namespace="Core" >
    
        <sql id="fragmentBasicAuditFieldNames">
            CreateDate, CreateUser, 
            UpdateDate, UpdateUser, UpdateCode 
        </sql>
    
        ....
    

    And then in our SQL map files we could reference it like this:

    <include refid="Core.fragmentBasicAuditFieldNames" />
    

    I hope I've understood what you were asking correctly!