当前位置: 首页 > news >正文

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_ListWhere_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 片段复用,可显著提升代码整洁性和可维护性。

相关文章:

  • ARM SMMUv3 STE表和CD表数据格式分析(三)
  • 利用Pandas AI完成Excel大模型的结合实现自然语言问数
  • AtCoder Beginner Contest 409
  • OD 算法题 B卷【正整数到Excel编号之间的转换】
  • BERT
  • 自然语言处理——文本表示
  • NLP学习路线图(三十四): 命名实体识别(NER)
  • Mac M芯片 RAG 极简流程 安装 ragflow + LM studio
  • 嵌入式面试提纲
  • 网约车平台(预约打车)
  • 【Elasticsearch】映射:详解 _source store 字段
  • 【医疗电子技术】新型医疗电子和医学人工智能发展现状和趋势
  • 大数据赋能行业智能化升级:从数据价值到战略落地的全景透视
  • 听写流程自动化实践,轻量级教育辅助
  • AI书签管理工具开发全记录(十六):Sun-Panel接口分析
  • WEB3技术重要吗,还是可有可无?
  • xtp+ctp 交易系统接口简介
  • 会计-合并-5- 处置交易在合报与个报会计处理
  • C-Equilateral Triangle
  • ffmpeg(五):裁剪与合并命令
  • 网站建设服务费怎么做会计分录/聊城优化seo
  • 政务网站系统/百度推广平台首页
  • 网站恶意刷/外包网络推广营销
  • 做网站最好选什么语言/游戏推广平台
  • 阿里云绑定wordpress/临沂seo建站
  • 企业 php网站建设/百度推广怎么收费