MyBatis 的注解式开发
MyBatis 的注解式开发是除了 XML 映射之外的另一种主流方式。它把 SQL 直接写在 Java 接口的方法上省去了 XML 文件适合简单查询和快速开发。下面我从最基础的注解开始逐步深入到复杂的映射和动态 SQL一、为什么用注解式开发维度注解式XML 式代码密度高SQL 和 Java 在同一文件低需要单独维护 XML可读性简单查询清晰复杂查询更易读动态 SQL较复杂用SelectProvider非常灵活if、where维护成本低修改接口即改 SQL中等需同时维护接口和 XML适用场景简单 CRUD、快速开发复杂联表查询、动态条件多结论没有绝对的优劣实际项目中通常是注解和 XML 混合使用简单查询用注解复杂查询用 XML。二、基础 CRUD 注解1.Select/Insert/Update/DeletepublicinterfaceUserMapper{// 查询单条Select(SELECT * FROM user WHERE id #{id})UserselectById(Longid);// 查询列表Select(SELECT * FROM user WHERE name LIKE CONCAT(%, #{name}, %))ListUserselectByName(Stringname);// 插入使用 Options 返回自增主键Insert(INSERT INTO user(name, age, email) VALUES(#{name}, #{age}, #{email}))Options(useGeneratedKeystrue,keyPropertyid)intinsert(Useruser);// 更新Update(UPDATE user SET name #{name}, age #{age} WHERE id #{id})intupdate(Useruser);// 删除Delete(DELETE FROM user WHERE id #{id})intdeleteById(Longid);}2. 返回自增主键使用Options(useGeneratedKeys true, keyProperty id)插入后 MyBatis 会自动把生成的主键设置到对象的id属性中。UserusernewUser();user.setName(张三);userMapper.insert(user);System.out.println(新插入的IDuser.getId());// 自动回填三、参数传递1. 单个参数基本类型直接用#{参数名}即可。Select(SELECT * FROM user WHERE id #{id})UserselectById(Longid);2. 多个参数——使用Param多个参数时必须用Param注解给参数起别名。Select(SELECT * FROM user WHERE name LIKE CONCAT(%, #{name}, %) AND age #{age})ListUserselectByNameAndAge(Param(name)Stringname,Param(age)Integerage);如果没有ParamMyBatis 会用arg0、arg1或者param1、param2作为参数名非常不直观。3. 传入 POJO 对象直接用#{属性名}即可MyBatis 会自动读取对象的 getter 方法。Insert(INSERT INTO user(name, age, email) VALUES(#{name}, #{age}, #{email}))intinsert(Useruser);4. 传入 MapSelect(SELECT * FROM user WHERE name #{name} AND age #{age})ListUserselectByMap(MapString,Objectparams);调用时MapString,ObjectmapnewHashMap();map.put(name,张三);map.put(age,25);userMapper.selectByMap(map);四、结果映射——Results和Result当数据库字段名和 Java 属性名不一致时需要手动映射。Select(SELECT id, user_name, user_age FROM user WHERE id #{id})Results(iduserResultMap,value{Result(columnid,propertyid),Result(columnuser_name,propertyname),Result(columnuser_age,propertyage)})UserselectById(Longid);Results的id属性可以给这个映射起一个名字在其他方法中复用。Select(SELECT id, user_name, user_age FROM user)ResultMap(userResultMap)// 复用上面的映射ListUserselectAll();五、复杂关联查询——联表映射1. 一对一关联OnepublicclassUser{privateLongid;privateStringname;privateDeptdept;// 所属部门}// 查询用户时顺便查询部门信息Select(SELECT id, name, dept_id FROM user WHERE id #{id})Results({Result(columnid,propertyid),Result(columnname,propertyname),Result(columndept_id,propertydept,oneOne(selectcom.example.mapper.DeptMapper.selectById))})UserselectUserWithDept(Longid);2. 一对多关联ManypublicclassDept{privateLongid;privateStringname;privateListUserusers;// 部门下的所有用户}Select(SELECT * FROM dept WHERE id #{id})Results({Result(columnid,propertyid),Result(columnname,propertyname),Result(columnid,propertyusers,manyMany(selectcom.example.mapper.UserMapper.selectByDeptId))})DeptselectDeptWithUsers(Longid);六、动态 SQL——SelectProvider注解方式处理动态 SQLif、where等比较麻烦需要用SelectProvider、InsertProvider等注解。publicclassUserSqlProvider{publicStringselectByCondition(MapString,Objectparams){Stringname(String)params.get(name);Integerage(Integer)params.get(age);SQLsqlnewSQL(){{SELECT(*);FROM(user);if(name!null!name.isEmpty()){WHERE(name LIKE CONCAT(%, #{name}, %));}if(age!null){WHERE(age #{age});}ORDER_BY(id DESC);}};returnsql.toString();}}// Mapper 中使用SelectProvider(typeUserSqlProvider.class,methodselectByCondition)ListUserselectByCondition(MapString,Objectparams);注意SelectProvider的method方法返回值必须是 String即 SQL 语句。七、常用注解汇总注解用途Select查询Insert插入Update更新Delete删除Options配置选项如自增主键返回Param参数命名Results/Result结果字段映射One一对一关联查询Many一对多关联查询ResultMap复用已定义的ResultsSelectProvider动态 SQL 提供者InsertProvider/UpdateProvider/DeleteProvider同上八、注解 vs XML如何选择场景推荐方式单表 CRUD注解简单联表查询2-3张表注解复杂动态 SQL多个if、foreachXML5张表以上的复杂联表XML需要复用 SQL 片段sqlXML快速原型开发注解大型项目、长期维护混合注解XML九、混合使用的配置方式如果同时使用注解和 XMLMyBatis 会优先使用 XML如果接口方法和 XML 中的 id 相同XML 会覆盖注解。更好的做法是明确区分简单查询注解写在接口方法上复杂查询XML 写在对应的 Mapper XML 文件中接口中只声明方法不加注解// 接口中不写 Select完全由 XML 接管publicinterfaceUserMapper{ListUserselectComplex(MapString,Objectparams);}!-- XML 文件中定义复杂 SQL --selectidselectComplexresultTypeUserSELECT * FROM userwhereiftestname ! nullname LIKE CONCAT(%, #{name}, %)/if!-- 更多复杂条件 --/where/select十、最佳实践建议简单 CRUD 用注解复杂查询用 XML不要把注解搞得过于复杂。Results一定要复用通过id和ResultMap避免重复定义。动态 SQL 超过 5 行时果断用 XML可读性更好。Param不要省哪怕只有一个参数也养成习惯方便后期扩展。SelectProvider适合复杂动态 SQL但 SQL 构造逻辑建议单独放在一个类里保持 Mapper 接口的干净。

相关新闻

【TDengine】流计算(Stream)功能在 TDengine 中如何实现?

【TDengine】流计算(Stream)功能在 TDengine 中如何实现?

TDengine 3.4.x 流计算(Stream)功能深度解析:内嵌式实时处理引擎的架构与实战 问题原文:“流计算(Stream)功能在 TDengine 中如何实现?” 解析范围:本文将深入 TDengine 3.4.x 社区版的 SNode (Stream Node) 组件,系统性地剖析其内嵌式流计算引擎的设计原理、执行模型…

2026/8/26 16:48:46 阅读更多 →
中国技术大败局TBL-20260810-054深度解剖报告V2.1 决策迭代版

中国技术大败局TBL-20260810-054深度解剖报告V2.1 决策迭代版

中国技术大败局TBL-20260810-054深度解剖报告V2.1 决策迭代版技术溯源说明本报告依托合肥气链科技有限公司道息实验室 QiLinkOS 开源专利分析体系,采用 矩规双螺旋归因模型完成客观研判,其分析基准专利:CN2026109829751;全部数据公…

2026/8/26 16:48:46 阅读更多 →
关于欧盟CE认证的CPR建材指令认证

关于欧盟CE认证的CPR建材指令认证

‌欧盟CE认证CPR建材指令‌(Construction Products Regulation, CPR)是一项旨在确保建筑产品在欧盟市场内安全、环保和性能一致的法规,自2013年7月1日起取代旧的建筑产品指令(CPD),要求所有进入欧盟市场的建…

2026/8/26 16:47:44 阅读更多 →

最新新闻

2026 年 MCP 协议彻底火了:用 Python 从零搭建你的第一个 AI Agent 工具链

2026 年 MCP 协议彻底火了:用 Python 从零搭建你的第一个 AI Agent 工具链

2026 年 MCP 协议彻底火了:用 Python 从零搭建你的第一个 AI Agent 工具链如果 2024 年是 RAG 的元年,2025 年是 Function Calling 的普及年,那 2026 年毫无疑问属于 MCP(Model Context Protocol,模型上下文协议&#…

2026/8/26 17:57:31 阅读更多 →
嵌入式CAN通信学习记录(万字解析):从STM32到Linux双机联调实战

嵌入式CAN通信学习记录(万字解析):从STM32到Linux双机联调实战

1. 引言 CAN(Controller Area Network)总线是嵌入式系统中广泛使用的一种高可靠性、多主机的串行通信协议,尤其在汽车电子、工业控制等领域应用广泛。本文旨在记录我学习嵌入式CAN通信的完整过程,涵盖从STM32开发板的环回/静默模…

2026/8/26 17:57:31 阅读更多 →
当“问小白怎么复制表格”成为日常:从格式崩塌到一键归档的技术突围

当“问小白怎么复制表格”成为日常:从格式崩塌到一键归档的技术突围

当“问小白怎么复制表格”成为日常:从格式崩塌到一键归档的技术突围 问小白用户想必都经历过同一个噩梦:让AI生成了一份逻辑清晰的对比表格,对话框内完美渲染,复制到Word或Excel后,却变成了一堆挤在单元格里的竖线符号…

2026/8/26 17:57:31 阅读更多 →
【RAG实战】LlamaIndex 深度集成:常用 Reader 全解析与自定义 Reader

【RAG实战】LlamaIndex 深度集成:常用 Reader 全解析与自定义 Reader

LlamaIndex 深度集成:常用 Reader 全解析与自定义 Reader 实战 文章目录LlamaIndex 深度集成:常用 Reader 全解析与自定义 Reader 实战LlamaIndex 深度集成:常用 Reader 全解析与自定义 Reader 实战一、LlamaIndex Reader 体系架构1.1 BaseRe…

2026/8/26 17:57:31 阅读更多 →
【2026年】实验室补风系统热平衡与节能设计

【2026年】实验室补风系统热平衡与节能设计

实验室排风量大、换气频繁,若不妥善处理补风,容易造成室内负压过大、空调负荷失衡,甚至影响安全。补风系统的热平衡设计,直接关系到实验室能否在高效排风的同时保持舒适安全、降低能耗。合理的补风方案是实验室通风设计中容易被忽…

2026/8/26 17:57:31 阅读更多 →
TVA与VLA双系统驱动的具身智能导航技术研究

TVA与VLA双系统驱动的具身智能导航技术研究

前沿技术探索:TVA智能体(简称TVA) TVA智能体(亦称“AI智能体视觉”或“TVA视觉智能体”)是依托Transformer架构与“因式智能体”理论构建的系统级视觉技术框架。它融合深度强化学习(DRL)、卷积…

2026/8/26 17:56:29 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/26 14:45:33 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/26 17:46:43 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 14:46:37 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/26 17:46:39 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →