目录
在 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 映射文件的简洁性和可维护性。