Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MyBatis/iBatis-在单独的sql映射文件中可重用的sql片段?_Java_Ibatis_Mybatis - Fatal编程技术网

Java MyBatis/iBatis-在单独的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

我想将几个sql映射XML文件使用的sql片段放在一个单独的文件中。目前,包含这些片段的元素与其他元素(如)一起位于一个映射器中,这使得它们很难找到

我可以有一个映射器,它只定义几个元素,不用于生成接口的实现吗?此映射程序的正确命名空间是什么

这是包含框架的SQL映射文件:

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