MyBatis中include标签用法详解

在 MyBatis 中,<include> 标签用于重用 SQL 片段,通过引用已定义的 <sql> 片段来避免代码重复,提高可维护性。以下是详细用法和示例:


1. 定义 SQL 片段

使用 <sql> 标签定义可重用的 SQL 片段,并指定唯一 id

xml

复制

下载

运行

<!-- 定义公共字段 -->
<sql id="Base_Column_List">
    id, name, email, create_time
</sql>

<!-- 定义带条件的片段 -->
<sql id="Where_Clause">
    <where>
        status = 1
        <if test="name != null">
            AND name LIKE #{name}
        </if>
    </where>
</sql>

2. 引用 SQL 片段

通过 <include refid="片段id"/> 引用片段:

xml

复制

下载

运行

<!-- 查询时引用字段列表 -->
<select id="selectAll" resultType="User">
    SELECT 
        <include refid="Base_Column_List"/>  <!-- 插入字段 -->
    FROM user
</select>

<!-- 引用条件片段 -->
<select id="selectByCondition" resultType="User">
    SELECT * FROM user
    <include refid="Where_Clause"/>  <!-- 插入WHERE条件 -->
</select>

3. 传递参数到片段

可在 <include> 内通过 <property> 动态传递参数

xml

复制

下载

运行

<!-- 定义带参数的片段 -->
<sql id="Order_By">
    ORDER BY ${orderColumn} ${orderDirection}
</sql>

<!-- 引用时传递参数 -->
<select id="selectUsers" resultType="User">
    SELECT * FROM user
    <include refid="Order_By">
        <property name="orderColumn" value="create_time"/>  <!-- 动态值 -->
        <property name="orderDirection" value="DESC"/>
    </include>
</select>

注意:片段内使用 ${} 接收参数(非 #{}),因 #{} 会添加引号导致 SQL 语法错误。


4. 跨 XML 文件引用

若片段定义在其他 Mapper 文件,需添加命名空间

xml

复制

下载

运行

<!-- 引用 OtherMapper.xml 中的片段 -->
<include refid="com.example.OtherMapper.Base_Column_List"/>

5. 最佳实践与注意事项

  • 减少重复:将重复的字段、条件、排序逻辑抽象为片段。

  • 谨慎传递参数${} 有 SQL 注入风险,确保参数值可信。

  • 片段中避免动态标签<sql> 内不支持 <if> 等动态标签(需在引用处处理)。

  • 清晰命名:使用如 Base_Column_ListWhere_Clause 等语义化 ID。


完整示例

xml

复制

下载

运行

<!-- 定义片段 -->
<sql id="Base_Column_List">id, name, email</sql>
<sql id="Where_Status">status = #{status}</sql>

<!-- 引用片段 -->
<select id="selectActiveUsers" resultType="User">
    SELECT 
        <include refid="Base_Column_List"/>
    FROM user
    WHERE 
        <include refid="Where_Status"/>  <!-- 插入条件 -->
        AND deleted = 0
</select>

通过 <include> 实现 SQL 片段复用,可显著提升代码整洁性和可维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值