在 MyBatis 中,如何设置 <sql> 元素的范围以供重用

In MyBatis, how to set scope for an <sql> element for re-using

<sql> 这样的元素:

<sql id="update_fragment">
    <set>
        <if test="id != null">
            id = #{id},
        </if>
        <if test="name != null">
            id = #{name},
        </if>
        ...
    </set>
</sql>        

它被用在 <update>:

<update id="update" parameterType="MyTableBean">
    UPDATE MyTable
    <include refid="update_fragment"/>
    WHERE id =# {id}
</update>

在 DAO 中:

Integer update(MyTableBean myTableBean);

现在,我写一个 batchUpdate 方法:

Integer batchUpdate(@Param("ids")List<Integer> ids, @Param("bean")MyTableBean myTableBean);

我想重新使用 'update_fragment' <sql> 元素。

<update id="update">
    UPDATE MyTable
    <include refid="update_fragment"/>
    WHERE ids IN
    <foreach>...</foreach>
</update>

但是 'update_fragment' 中的范围似乎是错误的。
看来我必须重写一个 <sql>,将 #{id} 更改为 #{bean.id}

有什么方法可以在不重写新语句的情况下重新使用该语句<sql>

您可以尝试在您的更新方法中添加@Param注解:

Integer update(@Param("bean") MyTableBean myTableBean);

然后更正你的sql表达式:

<sql id="update_fragment">
<set>
    <if test="id != null">
        id = #{bean.id},
    </if>
    <if test="name != null">
        id = #{bean.name},
    </if>
    ...
</set>

因此,这将为您增加一些通用性。