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