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/11/6 2:31:02 阅读更多 →
中国技术大败局TBL-20260810-054深度解剖报告V2.1 决策迭代版

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

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

2026/10/24 9:48:10 阅读更多 →
关于欧盟CE认证的CPR建材指令认证

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

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

2026/11/3 10:59:35 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/14 5:13:29 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/14 5:13:29 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/14 5:13:29 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/13 22:08:41 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/14 2:41:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/14 5:13:29 阅读更多 →

日新闻

周新闻

月新闻