在 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_List、Where_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 片段复用,可显著提升代码整洁性和可维护性。



1873

被折叠的 条评论
为什么被折叠?



