目录
在 MyBatis 的 mapper.xml
文件中,<include>
标签用于引用可复用的 SQL 代码片段,通常与 <sql>
标签配合使用。它的核心作用是减少重复代码,提高 SQL 的可维护性。
基本用法
定义 SQL 片段
使用<sql>
标签定义一个可复用的 SQL 片段,并为其指定唯一id
:xml
<sql id="userColumns">
id, username, email, create_time
</sql>
通过
<include>
引用片段
在需要的地方通过<include>
标签引用该片段:xml
<select id="selectUsers" resultType="User">
SELECT
<include refid="userColumns"/>
FROM users
WHERE status = 1
</select>
核心优势
代码复用
避免在多个 SQL 语句中重复编写相同的列名、条件或复杂逻辑。统一维护
修改<sql>
片段后,所有引用该片段的 SQL 会自动生效,无需逐个修改。动态参数支持
可以结合<property>
标签传递参数,实现动态 SQL 片段:xml
<sql id="dynamicWhere">
WHERE status = #{status}
<if test="name != null">
AND name LIKE #{name}
</if>
</sql>
<select id="selectByCondition" resultType="User">
SELECT * FROM users
<include refid="dynamicWhere">
<property name="status" value="1"/>
<property name="name" value="John"/>
</include>
</select>
注意事项
作用域限制
默认只能引用同一文件中定义的<sql>
片段。若需跨文件引用,需通过命名空间(namespace
)指定:xml
<include refid="com.example.mapper.UserMapper.userColumns"/>
避免循环引用
确保<sql>
片段之间没有相互引用,否则会导致解析错误。优先级规则
如果<include>
中定义了<property>
,会覆盖外部传入的同名参数。
典型场景
- 复用列名
多个查询需要返回相同字段时,定义列名片段。 - 统一条件逻辑
如分页参数、软删除条件(status=1
)等。 - 动态拼接 SQL
结合<if>
、<foreach>
等标签实现条件分支。
通过合理使用 <include>
,可以显著提升 MyBatis 映射文件的简洁性和可维护性。