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/17 8:18:30

uniapp+python基于微信小程序的付费厨房管理系统的设计与实现

文章目录摘要概述技术架构核心功能模块创新点与优势应用价值系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要概述 该系统基于UniApp框架与Python后端技术&#xff0c;结合微信小程序平台&…

作者头像 李华
网站建设 2026/4/17 14:22:45

uniapp+python房屋租赁租房需求的数据分析系统小程序

文章目录 系统概述技术架构核心功能数据处理流程安全与扩展性应用场景 系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 系统概述 该系统基于UniApp框架与Python后端技术&#xff0c;构建一个房屋…

作者头像 李华
网站建设 2026/4/17 22:48:17

GitHub 热榜项目 - 日榜(2026-01-30)

GitHub 热榜项目 - 日榜(2026-01-30) 生成于&#xff1a;2026-01-30 统计摘要 共发现热门项目&#xff1a; 14 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜显示AI智能体开发依然是绝对焦点&#xff0c;跨平台个人助手、多智能体协作平台和专业化工具链项…

作者头像 李华
网站建设 2026/4/22 10:51:18

一文吃透ClaudeBox:AI编码开发的安全隔离与高效协作神器

在AI驱动开发的浪潮下&#xff0c;开发者既要追求高效的编码辅助&#xff0c;又要保障开发环境的稳定性、安全性与可复用性。Anthropic推出的Claude系列模型在编码领域的表现已得到行业认可&#xff0c;而ClaudeBox作为适配Claude的专属开发环境工具&#xff0c;更是凭借容器化…

作者头像 李华