news 2026/4/23 9:22:45

HoRain云--MyBatis多参数查询最佳实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HoRain云--MyBatis多参数查询最佳实践

🎬 HoRain 云小助手:个人主页

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

目录

⛳️ 推荐

1. 使用 @Param 注解(推荐用于参数较少场景)

2. 使用 Map 传参(适合动态查询)

3. 使用 Java Bean 对象(推荐用于复杂查询)

4. MyBatis-Plus QueryWrapper(现代化选择)

动态 SQL 标签详解

实用建议


在 MyBatis 中进行多参数查询有多种灵活的方式,下面我为你详细介绍最常用的几种方法及其适用场景。

方法

适用场景

优点

缺点

@Param 注解

参数数量较少(2-5个)的固定查询

代码直观,参数名明确,可读性强

参数过多时代码冗长

Map 传参

动态条件查询,参数不固定

灵活性高,适合条件动态变化

类型不安全,key容易拼写错误

Java Bean 对象

参数较多且有明确业务含义

结构清晰,类型安全,易于维护

需要创建额外的类

MyBatis-Plus QueryWrapper

使用 MyBatis-Plus 框架的项目

链式调用,编程式构建条件

仅适用于 MyBatis-Plus

1. 使用 @Param 注解(推荐用于参数较少场景)

这是最常用的多参数传递方式,通过在接口方法参数前添加@Param注解来为参数命名。

Mapper 接口:

public interface UserMapper { User findByUsernameAndEmail( @Param("username") String username, @Param("email") String email ); // 用于 IN 查询的列表参数 List<User> findUsersByIds(@Param("ids") List<Long> ids); }

XML 映射文件:

<select id="findByUsernameAndEmail" resultType="User"> SELECT * FROM users WHERE username = #{username} AND email = #{email} </select> <select id="findUsersByIds" resultType="User"> SELECT * FROM users WHERE id IN <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} </foreach> </select>

2. 使用 Map 传参(适合动态查询)

当查询条件不固定时,使用 Map 可以灵活地传递参数。

Mapper 接口:

public interface UserMapper { List<User> findUsersByCondition(Map<String, Object> params); }

Service 层调用:

public List<User> searchUsers(String name, Integer age, String email) { Map<String, Object> params = new HashMap<>(); if (name != null) params.put("name", name); if (age != null) params.put("age", age); if (email != null) params.put("email", email); return userMapper.findUsersByCondition(params); }

XML 映射文件(使用动态 SQL):

<select id="findUsersByCondition" parameterType="map" resultType="User"> SELECT * FROM users <where> <if test="name != null"> AND name LIKE CONCAT('%', #{name}, '%') </if> <if test="age != null"> AND age = #{age} </if> <if test="email != null"> AND email = #{email} </if> </where> </select>

3. 使用 Java Bean 对象(推荐用于复杂查询)

当参数较多且有明确业务含义时,创建一个专门的查询参数对象是最佳选择。

查询参数类:

public class UserQueryParams { private String username; private String email; private Integer minAge; private Integer maxAge; private Date createTimeStart; private Date createTimeEnd; // getter 和 setter 方法 }

Mapper 接口:

public interface UserMapper { List<User> findUsersByQueryParams(UserQueryParams params); }

XML 映射文件:

<select id="findUsersByQueryParams" parameterType="UserQueryParams" resultType="User"> SELECT * FROM users <where> <if test="username != null"> AND username = #{username} </if> <if test="email != null"> AND email = #{email} </if> <if test="minAge != null"> AND age >= #{minAge} </if> <if test="maxAge != null"> AND age <= #{maxAge} </if> <if test="createTimeStart != null"> AND create_time >= #{createTimeStart} </if> <if test="createTimeEnd != null"> AND create_time <= #{createTimeEnd} </if> </where> ORDER BY create_time DESC </select>

4. MyBatis-Plus QueryWrapper(现代化选择)

如果你使用 MyBatis-Plus,QueryWrapper 提供了更简洁的链式编程方式。

使用示例:

@Service public class UserService { @Autowired private UserMapper userMapper; public List<User> findUsers(String username, Integer minAge, Integer maxAge) { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); if (username != null) { queryWrapper.like("username", username); } if (minAge != null) { queryWrapper.ge("age", minAge); } if (maxAge != null) { queryWrapper.le("age", maxAge); } queryWrapper.orderByDesc("create_time"); return userMapper.selectList(queryWrapper); } // 分页查询 public Page<User> findUsersWithPage(Page<User> page, UserQueryParams params) { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); // 构建查询条件... return userMapper.selectPage(page, queryWrapper); } }

动态 SQL 标签详解

MyBatis 提供了强大的动态 SQL 功能,让多条件查询更加灵活:

实用建议

  1. 简单查询(2-3个参数)优先使用@Param 注解

  2. 动态条件查询使用Map​ 或QueryWrapper

  3. 复杂业务查询使用Java Bean 对象

  4. 列表查询结合<foreach>​ 标签

  5. 新项目推荐使用MyBatis-Plus​ 简化开发

选择哪种方式主要取决于你的具体需求:参数数量、是否动态变化、代码可维护性要求等。希望这些示例能帮助你更好地使用 MyBatis 进行多参数查询!

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 13:43:31

2005-2024年上市公司股权激励数据

数据简介 股权激励是一种通过授予员工&#xff08;或特定对象&#xff09;公司股权&#xff08;或股权相关权益&#xff09;&#xff0c;使其与公司利益绑定&#xff0c;从而激励其为公司长期发展贡献力量的制度安排。其核心在于将员工的个人收益与公司的股价、业绩或长期价值…

作者头像 李华
网站建设 2026/4/23 12:16:00

HoRain云--JSON数组:从入门到精通

&#x1f3ac; HoRain云小助手&#xff1a;个人主页 &#x1f525; 个人专栏: 《Linux 系列教程》《c语言教程》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;…

作者头像 李华
网站建设 2026/4/23 13:44:13

uniapp+python基于微信小程序的美文小说阅读书架系统的设计与实现

文章目录系统设计目标技术架构核心功能模块数据处理与优化安全与性能保障应用价值系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统设计目标 该系统基于UniApp框架与Python后端技术&#xff0c…

作者头像 李华
网站建设 2026/4/23 13:45:20

uniapp+python宁波旅游微信小程序 功能全

文章目录功能模块设计技术实现方案特色功能集成数据交互流程部署与优化系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;功能模块设计 景点展示与推荐 整合宁波热门景点&#xff08;如天一阁、东钱…

作者头像 李华
网站建设 2026/4/23 12:19:01

物理安防沦陷:dormakaba门禁20+漏洞撕开关键基础设施安全缺口

2026年1月26日&#xff0c;知名网络安全研究机构SEC Consult Vulnerability Lab发布重磅安全报告&#xff0c;披露全球知名安防企业dormakaba旗下exos 9300门禁控制系统存在20余个高风险及临界级安全漏洞&#xff0c;涵盖未授权访问、硬编码凭证、命令注入、本地提权等多个类型…

作者头像 李华
网站建设 2026/4/23 10:46:29

Palantir的未来十年:从政府到商业,从集中到去中心化的数据革命

Predictions for Palantirs Next Decade: What the Future Could Hold for This Groundbreaking Company 文章摘要 本文深入探讨了Palantir Technologies在未来十年的发展前景&#xff0c;涵盖商业扩张、全球化战略、人工智能集成、去中心化技术适应以及伦理合规挑战等关键领…

作者头像 李华