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

Java 学习笔记 --MyBatis 增强篇

作者:zinghoWU

时间:2026-01-27 22:07:17 星期二

前言

MyBatis 作为持久层框架,简化了 JDBC 操作的同时,也提供了丰富的增强特性来应对复杂的业务场景。本文整理了 MyBatis 中参数处理、动态 SQL、关联关系映射等核心增强知识点,结合实际业务场景和核心代码,帮助理解 MyBatis 进阶用法。

一、MyBatis 参数处理

在 MyBatis 中,参数传递是高频操作,不同的参数类型有不同的处理方式,核心目标是让 SQL 能精准获取到参数值。

1.1 核心场景:登录功能(用户名 + 密码比对)

需求:通过传入的用户名和密码,查询数据库中是否存在匹配的用户,核心是参数的正确传递。

1.2 三种常用参数传递方式

方式 1:封装 Map 传递参数

点击查看代码
// 1. 测试代码(Service/测试类)
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("username", "admin");
paramMap.put("password", "123456");
User user = userMapper.loginByMap(paramMap);// 2. Mapper接口
User loginByMap(Map<String, Object> paramMap);// 3. Mapper映射文件
<select id="loginByMap" resultType="com.zingho.pojo.User">select * from user where username = #{username} and password = #{password}
</select>

方式 2:封装实体类传递参数
定义实体类封装参数,Mapper 映射文件通过实体类属性名取值

点击查看代码
// 1. 实体类
@Data
public class User {private String username;private String password;
}// 2. Mapper接口
User loginByUser(User user);// 3. Mapper映射文件
<select id="loginByUser" resultType="com.zingho.pojo.User">select * from user where username = #{username} and password = #{password}
</select>

方式 3:@Param 注解传递参数

点击查看代码
// 1. Mapper接口
User loginByParam(@Param("username") String username, @Param("password") String password);// 2. Mapper映射文件
<select id="loginByParam" resultType="com.zingho.pojo.User">select * from user where username = #{username} and password = #{password}
</select>

1.3 补充:

List / 数组参数处理
MyBatis 会自动将 List / 数组封装到 Map 中:
List 类型:默认 Key 为 list
数组类型:默认 Key 为 array

可通过 @Param 自定义 Key,示例如下:

点击查看代码
// Mapper接口
List<User> getUserByIds(@Param("ids") List<Long> ids);// Mapper映射文件
<select id="getUserByIds" resultType="com.zingho.pojo.User">select * from user where id in<foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach>
</select>

二、#{} 与 ${} 的核心区别

特性 #{} ${}
取值逻辑 预编译,自动给值加单引号 直接拼接,值作为 SQL 一部分
安全性 防 SQL 注入 存在 SQL 注入风险
适用场景 普通参数传递(字段值) 动态字段(order by/group by)

三、动态 SQL

动态 SQL 是 MyBatis 核心增强特性,能根据参数动态拼接 SQL,解决多条件查询、动态更新等场景

3.1 if + where:多条件查询

需求:查询工资大于等于指定值的员工,若参数为空则查询所有员工。

点击查看代码
<select id="getEmpBySal" resultType="com.zingho.pojo.Emp">select * from emp<where><if test="minSal != null">sal >= #{minSal}</if></where>
</select>

where 标签:自动去除拼接后多余的 and/or,避免 SQL 语法错误。

3.2 set:动态更新

点击查看代码
<update id="updateEmp">update emp<set><if test="name != null">name = #{name},</if><if test="sal != null">sal = #{sal},</if></set>where id = #{id}
</update>

set 标签:自动去除最后一个字段后的逗号,保证 UPDATE 语法正确

3.3 foreach:批量删除

点击查看代码
<delete id="batchDeleteEmp">delete from emp where id in<foreach collection="array" item="id" open="(" separator="," close=")">#{id}</foreach>
</delete>
1. collection:数组填array,List 填list(或 @Param 自定义名); 2. item:遍历的单个元素; 3. open/close:包裹遍历结果的字符; 4. separator:元素间分隔符。

四、关联关系映射

实际业务中,实体间存在一对一、一对多、多对多关联,MyBatis 提供了关联查询的解决方案。

总结

MyBatis 增强特性围绕 “灵活适配业务场景” 展开:参数处理解决不同类型参数的传递问题,动态 SQL 解决 SQL 拼接的繁琐,关联关系映射解决实体间的关联查询。掌握这些特性,能大幅提升 MyBatis 开发效率,应对复杂的业务需求。

http://www.jsqmd.com/news/309970/

相关文章:

  • 个人简历网站
  • 〔重庆理工大学〕计算机网络实验报告【实验一 双绞线的制作与测试】
  • TCN-LSTM回归+特征贡献SHAP分析+新数据预测+多输出附MATLAB代码
  • TCN-BiLSTM回归+特征贡献SHAP分析+新数据预测+多输出附MATLAB代码
  • 【开题答辩全过程】以 基于SpringBoot和vue的篮球比赛管理系统为例,包含答辩的问题和答案
  • 【开题答辩全过程】以 基于Java的图书馆座位预约系统的设计与实现为例,包含答辩的问题和答案
  • 人工智能发展史:关键人物 里程碑
  • 完整教程:数学图论的艺术:解码最小公倍数图中的连通奥秘
  • 美国《科学》杂志历年十大科学突破(2000-2025)
  • 函数的深入
  • 扎耶德可持续发展奖启动2027年度全球申报 奖金总额增至720万美元
  • 赛程已过半,第五届瑞云渲染大赛作品抢先看
  • 炫彩活体检测技术:通过动态彩色光斑序列主动验证人脸生物特征,有效抵御各类伪造攻击
  • Java毕设项目推荐-基于springboot实现的erp企业资源管理系统基于Spring Boot的ERP仓储管理信息系统设计与实现【附源码+文档,调试定制服务】
  • 2026必备!MBA毕业论文神器TOP10:一键生成论文工具深度测评
  • Datalogic推出Gryphon™ 4600系列和智能视觉套件,重塑手持扫描标杆,加速零售与全行业智能升级
  • Java_ElasticSearch(ES)——分布式搜索引擎 - 实践
  • TOURISE在达沃斯重新定义旅游业:迈向16万亿美元规模的全球经济引擎
  • Java毕设选题推荐:基于springboot的城市轨道交通安全管理系统java-springboot某城市的地铁综合服务管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Fortitude Biomedicines正式完成1300万美元融资,致力于开发治疗自免和癌症的新型抗体疗法
  • AI 语音克隆技术详解:从原理到应用的完整实战指南
  • 【计算机毕业设计案例】基于SpringBoot3+Vue3的erp仓储管理系统基于springboot的erp仓储管理系统(程序+文档+讲解+定制)
  • 【计算机毕业设计案例】基于springboot的宠物医院管理系统喵喵宠物医院管理系统(程序+文档+讲解+定制)
  • 【Linux开发六】进程概念|进程终止|进程中环境变量|进程创建|父子进程文件共享和竞争关系|监视子进程|孤儿进程和僵尸进程|执行新程序|进程状态与进程关系|父进程信号处理机制对子进程影响|守护进程
  • OpenCV 学习:文档扫描与视频运动检测与跟踪
  • 学会这两个方法,你能读懂所有生信文献图表
  • AI都能读文献了,我们还需要自己读吗?
  • 【2026最新】网络安全从入门到精通(超详细)学习路线!
  • 航电oj:统计字符串中汉字的个数
  • 深入解析:tauri:tauri2.0+vue3+vite打包案例