Mybatis的七种传参方式示例全解析

 更新时间:2026年01月24日 14:42:49   作者:huohuopro  
MyBatis提供了七种传参方式,包括顺序传递参数、使用@Param注解命名传参、使用Map传递多个参数、使用JavaBean对象传参、使用JSON对象直接传参、集合类型传参以及对象中包含集合属性的传参,每种方式都有其适用场景和优势,感兴趣的朋友一起看看吧

MyBatis 的 7 种传参方式详解

1. 顺序传递参数

通过方法参数的排列顺序进行传参,适用于多个简单类型参数。需注意在 XML 映射文件中必须按照参数顺序使用 #{arg0}#{arg1}#{param1}#{param2} 等形式引用。

Controller 层示例:

@ApiOperation(value = "多个参数查询_匿名顺序传参")
@GetMapping("findByParams")
public ResultMsg findByParams(Short gender, String age) {
    List result = employeeMapper.selectByGenderAndAge(gender, age);
    return ResultMsg.getMsg(result);
}

Mapper 接口:

List<Employee> selectByGenderAndAge(Short gender, String age);

XML 映射配置(关键点:使用 param1、param2 按顺序引用):

<select id="selectByGenderAndAge" resultMap="BaseResultMap">
    SELECT * FROM employee WHERE gender = #{param1} AND age = #{param2}
</select>

⚠️ 注意:参数索引从 param1 开始,param1 对应第一个参数,param2 对应第二个。

2. 使用 @Param 注解命名传参

为解决顺序传参可读性差的问题,可在 Mapper 接口中使用 @Param 注解为每个参数指定名称,使 XML 中可通过语义化名称访问。

Mapper 接口修改:

List<Employee> selectByGenderAndAge(@Param("gender") Short gender, @Param("age") String age);

XML 映射文件(推荐写法,清晰直观):

<select id="selectByGenderAndAge" resultMap="BaseResultMap">
    SELECT * FROM employee WHERE gender = #{gender} AND age = #{age}
</select>
</select>

✅ 优势:代码可读性强,避免因参数顺序错误导致的 SQL 异常。

3. 使用 Map 传递多个参数

将多个参数封装成 Map<String, Object>,以键值对形式传递,适合参数较多或动态条件场景。

Controller 层封装 Map:

@ApiOperation(value = "多个参数查询_通过Map传递多个参数")
@GetMapping("findByMapParams")
public ResultMsg findByMapParams(Short gender, String age) {
    Map<String, Object> params = new HashMap<>();
    params.put("gender", gender);
    params.put("age", age);
    List result = employeeMapper.selectByMapParams(params);
    return ResultMsg.getMsg(result);
}

XML 配置说明:

<select id="selectByMapParams" resultMap="BaseResultMap" parameterType="map">
    SELECT * FROM employee WHERE gender = #{gender} AND age = #{age}
</select>

✅ 说明:parameterType="map" 可省略,MyBatis 默认支持 Map 传参;通过 #{key} 直接取值。

4. 使用 Java Bean 对象传参

当参数结构固定且与实体类一致时,推荐使用 Java Bean,Controller 层通过 @RequestBody 接收 JSON 数据并直接传递给 Mapper。

Controller 层接收对象:

@ApiOperation(value = "多个参数查询_通过Java Bean传递多个参数")
@PostMapping("findByBeans")
public ResultMsg findByBeans(@RequestBody Employee employee) {
    List result = employeeMapper.selectByBeans(employee);
    return ResultMsg.getMsg(result);
}

XML 映射配置:

<select id="selectByBeans" resultMap="BaseResultMap" parameterType="com.wg.demo.po.Employee">
    SELECT * FROM employee WHERE gender = #{gender} AND age = #{age}
</select>

✅ 优势:结构清晰,自动映射属性,适合复杂对象查询。

5. 使用 JSON 对象直接传参

利用 JSONObject 接收任意结构的 JSON 数据,无需定义实体类,灵活性高,适用于动态查询场景。

Controller 层处理 JSON:

@ApiOperation(value = "多个参数查询_通过JSON传递多个参数")
@PostMapping("findByJSONObject")
public ResultMsg findByJSONObject(@RequestBody JSONObject params) {
    List result = employeeMapper.findByJSONObject(params);
    return ResultMsg.getMsg(result);
}

XML 配置与 Java Bean 类似:

<select id="findByJSONObject" resultMap="BaseResultMap" parameterType="com.alibaba.fastjson.JSONObject">
    SELECT * FROM employee WHERE gender = #{gender} AND age = #{age}
</select>
</select>

✅ 适用场景:快速开发、原型验证、字段不固定的接口。

6. 集合类型传参(List、Set、Array)

当需要根据集合进行 IN 查询时,可直接传递集合对象,配合 <foreach> 标签遍历处理。

Controller 层接收集合:

@ApiOperation(value = "多个参数查询_通过List、Set、Array传递多个参数")
@PostMapping("findByList")
public ResultMsg findByList(@RequestBody List<String> list) {
    List result = employeeMapper.findByList(list);
    return ResultMsg.getMsg(result);
}

XML 使用 <foreach> 构建 IN 条件:

<select id="findByList" resultMap="BaseResultMap">
    SELECT * FROM employee WHERE age IN
    <foreach collection="list" item="age" open="(" separator="," close=")">
        #{age}
    </foreach>
</select>

🔍 说明:

  • collection="list":默认参数名;
  • item:循环变量名;
  • open / close:包裹符号;
  • separator:分隔符。

7. 对象中包含集合属性的传参

用于处理嵌套结构数据,如部门对象包含员工列表,可在对象内部使用集合,并在 XML 中通过 OGNL 表达式访问集合属性。

Controller 层接收复合对象:

@ApiOperation(value = "多个参数查询_对象+集合参数")
@PostMapping("findByDepartment")
public ResultMsg findByDepartment(@RequestBody Department department) {
    List result = employeeMapper.findByDepartment(department);
    return ResultMsg.getMsg(result);
}

Mapper 接口需配合 @Param 指定别名:

List<Employee> findByDepartment(@Param("department") Department department);

XML 中通过 OGNL 访问对象内集合:

<select id="findByDepartment" resultMap="BaseResultMap" parameterType="com.wg.demo.po.Department">
    SELECT * FROM employee 
    WHERE dept_id = #{department.id} 
      AND age IN 
      <foreach collection="department.employees" item="employee" open="(" separator="," close=")">
        #{employee.age}
      </foreach>
</select>
</select>

✅ 技巧:使用 @Param 可提升 OGNL 表达式的可读性和稳定性。

📌 总结建议:

  • 参数少且简单 → 使用 @Param
  • 参数多或结构固定 → 使用 Java Bean;
  • 动态字段或快速开发 → 使用 MapJSONObject
  • 涉及 IN 查询 → 必须使用 <foreach> 配合集合;
  • 复杂嵌套结构 → 结合 @Param 与 OGNL 表达式访问对象属性。

合理选择传参方式,可显著提升代码可维护性与 SQL 安全性。

到此这篇关于Mybatis的七种传参方式示例全解析的文章就介绍到这了,更多相关Mybatis传参方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot自定义注解&传参&简单应用方式

    Springboot自定义注解&传参&简单应用方式

    SpringBoot框架中,通过自定义注解结合AOP可以实现功能如日志记录与耗时统计,首先创建LogController和TimeConsuming注解,并为LogController定义参数,然后,在目标方法上应用这些注解,最后,使用AspectJ的AOP功能,通过切点表达式定位这些注解
    2024-10-10
  • WebSocket实现Web聊天室功能

    WebSocket实现Web聊天室功能

    这篇文章主要为大家详细介绍了WebSocket实现Web聊天室功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Java中zip文件压缩与解压之ZipInputStream和ZipOutputStream

    Java中zip文件压缩与解压之ZipInputStream和ZipOutputStream

    这篇文章主要给大家介绍了关于Java中zip文件压缩与解压之ZipInputStream和ZipOutputStream的相关资料,ZipInputStream 和 ZipOutputStream 可以用于处理 ZIP文件格式,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • openFeign服务之间调用保持请求头信息处理方式

    openFeign服务之间调用保持请求头信息处理方式

    这篇文章主要介绍了openFeign服务之间调用保持请求头信息处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java中Calendar日历类型常见方法详解

    Java中Calendar日历类型常见方法详解

    Calendar是Java中常用的时间处理工具之一,它提供了很多日历类型常见方法,下面是一些常用的方法及对应的代码和运行结果,感兴趣的朋友一起看看吧
    2023-11-11
  • MyBatis插件机制的使用及说明

    MyBatis插件机制的使用及说明

    MyBatis插件机制通过拦截器实现,允许开发者在不修改源代码的情况下扩展和定制MyBatis功能,主要拦截方法包括Executor、ParameterHandler、ResultSetHandler和StatementHandler,拦截器通过XML配置或Java代码定义,实现对目标对象的方法调用拦截和增强
    2026-01-01
  • Java 无符号右移与右移运算符的使用介绍

    Java 无符号右移与右移运算符的使用介绍

    这篇文章主要介绍了Java 无符号右移与右移运算符的使用介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java聊天室之实现一个服务器与多个客户端通信

    Java聊天室之实现一个服务器与多个客户端通信

    这篇文章主要为大家详细介绍了Java简易聊天室之实现一个服务器与多个客户端通信,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以了解一下
    2022-10-10
  • 在IDEA中启动多个不同端口的Spring Boot应用

    在IDEA中启动多个不同端口的Spring Boot应用

    本文主要介绍了在IDEA中启动多个不同端口的Spring Boot应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-10-10
  • 在Java中实现二叉搜索树的全过程记录

    在Java中实现二叉搜索树的全过程记录

    二叉树包含了根节点,孩子节点,叶节点,每一个二叉树只有一个根节点,每一个结点最多只有两个节点,左子树的键值小于根的键值,右子树的键值大于根的键值,下面这篇文章主要给大家介绍了关于如何在Java中实现二叉搜索树的相关资料,需要的朋友可以参考下
    2022-03-03

最新评论