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

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 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

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

相关文章:

  • UG/NX过量采购许可证的内部调剂与盘活策略
  • 石家庄市鹿泉区农村自建房一站式服务攻略,2026年石家庄市鹿泉区全流程自建房平台权威榜单
  • 5种高效Nginx+Tomcat Session共享方案
  • 2026年重庆深圳等地充电桩安装来样定制推荐,性价比之选
  • 中小型企业SolidWorks许可证成本控制与优化实用技巧
  • 磷酸化Tau抗体如何揭示蛋白质修饰的双重生物学意义?
  • FastAPI参数大全:从路径查询到请求体,一篇搞定所有传参方式
  • 价值百万的案例:某车企Abaqus许可优化年度节省报告
  • 无线讲解器多少钱,鹰米讲解性价比高还好用
  • 曹妃甸新区潮汐表查询2026-01-31
  • 告别熬夜爆肝!百考通AI全流程拆解本科毕业论文,从选题到答辩的效率攻略
  • 景县昊硕金属制品靠谱吗,分析其口碑传播度和市场份额情况
  • HoRain云--SOME/IP协议TTL机制全解析
  • 散户在牛市是如何大亏的?
  • 2026年重庆高性价比碳纤维加固供应企业盘点,怎么选择
  • 电价革命!2026年,高精度气象预测正在成为新能源电站的“利润中心”
  • 智驾计算平台榜单!谁在低阶领跑,谁在高阶爆发
  • 学术革新:百考通AI如何助力论文“双率”达标与内容焕新
  • HoRain云--ECMAScript与JavaScript:核心差异解析
  • Seyond图达通斩获福田汽车独家定点,共筑智能重卡新标杆!
  • 基于Matlab Simulink的双闭环三相和五相永磁同步电机仿真模型探索
  • 2026年西藏地区有定制经验的防爆不锈钢波纹软管制造商哪家好
  • 毕业生的新选择:实测9款AI论文工具,这款“全能搭子”让我从选题到定稿不再愁
  • 2026年杭州遗产继承纠纷律师推荐:婚姻律师/劳动纠纷律师/离婚律师精选
  • 宽检测范围ELISA技术在生物检测中有何独特价值?
  • 2026年目前知名的纸盒直销厂家口碑排行,工业纸箱/彩印包装/纸箱/工业纸盒/纸盒/农产品纸箱,纸盒厂商推荐排行
  • 计算机毕设java在线药店管理系统 基于Java的在线药房综合管理系统设计与实现 Java技术驱动的在线药店信息化管理平台
  • 2026年背负式AGV搬运实力厂家推荐:叉车型AGV搬运/潜伏式AGV搬运 /贯通式立体仓库货架 /牵引式AGV搬运 /横梁式立体仓库货架定做厂家精选
  • Oracle数据高效插入
  • 2026年影视后期培训机构竞争力报告:聚焦五大机构独家优势与特色排名