Java MyBatis/iBatis-在单独的sql映射文件中可重用的sql片段?
我想将几个sql映射XML文件使用的sql片段放在一个单独的文件中。目前,包含这些片段的元素与其他元素(如)一起位于一个映射器中,这使得它们很难找到 我可以有一个映射器,它只定义几个元素,不用于生成接口的实现吗?此映射程序的正确命名空间是什么 这是包含框架的SQL映射文件:Java MyBatis/iBatis-在单独的sql映射文件中可重用的sql片段?,java,ibatis,mybatis,Java,Ibatis,Mybatis,我想将几个sql映射XML文件使用的sql片段放在一个单独的文件中。目前,包含这些片段的元素与其他元素(如)一起位于一个映射器中,这使得它们很难找到 我可以有一个映射器,它只定义几个元素,不用于生成接口的实现吗?此映射程序的正确命名空间是什么 这是包含框架的SQL映射文件: <mapper namespace="com.company.project.dao.someDao"> <sql id="whereDate"> WHERE date(`t
<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映射文件:
<mapper namespace="com.company.project.dao.???">
<sql id="whereDate">
WHERE date(`time`) BETWEEN #{startDate} AND #{endDate}
</sql>
<sql id="someOtherSqlFragment">
...
</sql>
</mapper>
<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>
第二个Sql映射文件:
<mapper namespace="com.company.project.dao.???">
<sql id="whereDate">
WHERE date(`time`) BETWEEN #{startDate} AND #{endDate}
</sql>
<sql id="someOtherSqlFragment">
...
</sql>
</mapper>
<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>
这正是我过去从事的一个项目所做的。公共片段在一个单独的文件中定义,该文件包含在主iBATIS配置文件中 我们在根目录下有一个名为Core.ism.xml的SQL映射文件,如下所示:
<sqlMap namespace="Core" >
<sql id="fragmentBasicAuditFieldNames">
CreateDate, CreateUser,
UpdateDate, UpdateUser, UpdateCode
</sql>
....
<include refid="Core.fragmentBasicAuditFieldNames" />
然后在我们的SQL映射文件中,我们可以这样引用它:
<sqlMap namespace="Core" >
<sql id="fragmentBasicAuditFieldNames">
CreateDate, CreateUser,
UpdateDate, UpdateUser, UpdateCode
</sql>
....
<include refid="Core.fragmentBasicAuditFieldNames" />
我希望我正确地理解了你的要求 说吧,你有一些
<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>
另外,您也可以看看谢谢!我还注意到,我正在使用mybatis spring中的MapperFactoryBean类加载其他SQL映射文件。带有公共片段的文件没有加载到任何地方,因此我必须手动将其添加到mybatis配置文件中。如果核心映射器文件是mybatis配置文件中的唯一内容,则使用SqlSessionFactoryBean中的mapperLocations属性加载公共映射器文件可能更有意义。如果您使用的是mybatis,用映射器替换sqlMap。看见我直截了当地遵循了上述解决方案,并遇到了其他问题。然后我意识到我在使用MyBatis,必须使用mapper而不是sqlMap。