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
Author by
prasopes
Updated on July 09, 2022Comments
-
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>