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传参方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Spring关于@Resource注入为null解决办法

    详解Spring关于@Resource注入为null解决办法

    这篇文章主要介绍了详解Spring关于@Resource注入为null解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • java selenium教程环境搭建基于Maven

    java selenium教程环境搭建基于Maven

    本文主要介绍Java selenium 环境的安装,这里介绍了基于Maven的环境搭建,有需要的小伙伴可以参考下
    2016-08-08
  • Java异常处理机制try catch流程详解

    Java异常处理机制try catch流程详解

    这篇文章主要介绍了Java异常处理机制try catch流程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java实现石头剪刀布小游戏

    Java实现石头剪刀布小游戏

    这篇文章主要为大家详细介绍了Java实现石头剪刀布小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • 搭建一个基础的Resty项目框架

    搭建一个基础的Resty项目框架

    这篇文章主要为大家介绍了如何搭建一个基础的Resty项目框架示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • Spring AOP 后置通知修改响应httpstatus方式

    Spring AOP 后置通知修改响应httpstatus方式

    这篇文章主要介绍了Spring AOP 后置通知修改响应httpstatus方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot访问HTML过程详解

    SpringBoot访问HTML过程详解

    这篇文章主要详细介绍了SpringBoot访问HTML的全过程,文章中有详细的代码和图片讲解,感兴趣的同学可以参考一下
    2023-04-04
  • MyEclipse2018中安装Mybatis generator插件的实现步骤

    MyEclipse2018中安装Mybatis generator插件的实现步骤

    这篇文章主要介绍了MyEclipse2018中安装Mybatis generator插件的实现步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • Java中StringUtils与CollectionUtils和ObjectUtil概念讲解

    Java中StringUtils与CollectionUtils和ObjectUtil概念讲解

    这篇文章主要介绍了Java中StringUtils与CollectionUtils和ObjectUtil概念,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • Springboot ApplicationRunner的使用解读

    Springboot ApplicationRunner的使用解读

    这篇文章主要介绍了Springboot ApplicationRunner的使用解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05

最新评论