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