在这里插入图片描述

下面我将详细讲解 MyBatis 支持的参数传递方法,并附上通俗易懂的解释和示例:

1. 单个基本类型参数

当方法只有一个基本类型参数(如 int, String)时,MyBatis 会自动识别:

User getUserById(int id);  // 接口方法
<select id="getUserById" resultType="User">
    SELECT * FROM user WHERE id = #{id}  <!-- 直接使用参数名 -->
</select>

💡 就像告诉服务员:“给我3号桌的菜单” - #{id} 就是桌号


2. @Param 注解(推荐)

当方法有多个参数时,用 @Param 给参数起别名:

List<User> findUsers(
    @Param("name") String name, 
    @Param("minAge") int minAge
);
<select id="findUsers" resultType="User">
    SELECT * FROM user 
    WHERE name = #{name} AND age > #{minAge}
</select>

📌 就像点餐:“要宫保鸡丁(@Param(‘main’))和酸辣汤(@Param(‘soup’))”


3. Map 传参

将多个参数放入 Map 中传递:

Map<String, Object> params = new HashMap<>();
params.put("role", "admin");
params.put("status", 1);
List<User> getUsersByMap(Map params);
<select id="getUsersByMap" resultType="User">
    SELECT * FROM user 
    WHERE role = #{role} AND status = #{status}
</select>

🗺️ 类似递菜单:把要点的菜(参数)都写在便签上交给服务员


4. JavaBean 对象传参

使用 POJO 对象封装参数:

public class UserQuery {
    private String name;
    private Integer minAge;
    // getter/setter
}

List<User> searchUsers(UserQuery query);
<select id="searchUsers" resultType="User">
    SELECT * FROM user 
    WHERE name = #{name} AND age > #{minAge}
</select>

🧳 就像打包行李:把零散物品(参数)装进行李箱(JavaBean)统一携带


5. 集合类型参数

处理 List/Array 等集合参数:

List<User> getUsersByIds(@Param("ids") List<Integer> ids);
<select id="getUsersByIds" resultType="User">
    SELECT * FROM user 
    WHERE id IN 
    <foreach item="id" collection="ids" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

🧮 类似报菜名:“要1号、3号、5号套餐” → MyBatis 自动拆解集合


6. 位置参数(不推荐)

按参数位置引用(MyBatis 3.3 前支持):

<select id="findUser" resultType="User">
    SELECT * FROM user 
    WHERE name = #{0} AND age = #{1}  <!-- 0代表第一个参数 -->
</select>

⚠️ 风险:像说"给我那个和那个" - 容易混淆顺序


7. 特殊参数 _parameter

所有参数的统一引用点:

<select id="complexQuery" resultType="User">
    <!-- 通过_parameter访问整个参数对象 -->
    WHERE name = #{_parameter.name}
</select>

总结对比表

传参方式适用场景优点缺点
@Param 注解多参数方法直观清晰需写注解
JavaBean 对象复杂查询条件结构化/复用性强需创建额外类
Map动态参数灵活无需定义类类型不安全
集合参数IN 查询天然支持集合操作需结合 foreach
位置参数简单临时查询快速实现可读性差/易出错

在这里插入图片描述

📌 最佳实践建议

  1. 1-2个参数 → 优先用 @Param 注解
  2. 3+个参数 → 使用 JavaBean 封装
  3. 动态条件查询 → 选用 Map 或 JavaBean+动态SQL
  4. 避免使用位置参数,提高可维护性
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐