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_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 userWHERE <include refid="Where_Status"/> <!-- 插入条件 -->AND deleted = 0 </select>
通过 <include>
实现 SQL 片段复用,可显著提升代码整洁性和可维护性。