深入MyBatis参数绑定:单对象vs多参数的正确写法

在使用MyBatis进行数据库操作时,参数映射是核心内容之一。本文将通过一个具体例子,帮助你理解:

  • 如何在Mapper接口定义参数
  • 在XML映射文件中正确引用参数
  • 为什么有时用#{password}会失败,而用#{userInfo.password}就能成功

示例场景

假设我们有一个用户(User)表,需要更新用户的密码。定义的Java接口如下:

public interface UserMapper {
    // 方法1:传入User对象
    int updatePassword(User user);

    // 方法2:传入User对象和email
    int updatePasswordByEmail(@Param("userInfo") User user, @Param("email") String email);
}

对应的User类:

public class User {
    private String password;
    private String name;

    // getters 和 setters
}

方法1:传入整个User对象

int updatePassword(User user);

对应的Mapper XML:

<update id="updatePassword" parameterType="User">
    UPDATE users
    SET password = #{password}
    WHERE id = #{id}
</update>

为什么可以直接用#{password}

因为MyBatis会自动在参数(User对象)中查找getPassword()对应的值,映射到#{password}


方法2:传入多个参数(userInfoemail),用@Param标记

int updatePasswordByEmail(@Param("userInfo") User user, @Param("email") String email);

对应的Mapper XML写法:

<update id="updatePasswordByEmail" parameterType="map">
    UPDATE users
    SET password = #{userInfo.password}
    WHERE email = #{email}
</update>

关键点:

  • **在参数用@Param("userInfo")标记后,**MyBatis会在映射中生成一个名为userInfo的Map项,包含User对象的属性;
  • 要访问User中的password属性,必须写为#{userInfo.password}

出现的错误:Parameter 'password' not found

如果你在XML中写:

<update>
    UPDATE users SET password = #{password} WHERE email = #{email}
</update>

但是方法参数是:

int updatePasswordByEmail(@Param("userInfo") User user, @Param("email") String email);

——你就会遇到:

org.apache.ibatis.binding.BindingException: Parameter 'password' not found. Available parameters are [userInfo, email]

原因:

  • #{password}在参数集合中不存在;
  • 只有userInfo对象,属性在userInfo.password中。

解决方案

1. 在XML中引用userInfo.password

password = #{userInfo.password}

2. 在Java中调整参数传递

  • 如果你只想用#{password},不要用@Param,直接传入User对象:
int updatePassword(User user);
  • 调用时直接传入User实例。

3. 检查参数顺序和@Param标记是否正确

确保XML中引用和方法定义中的参数名一一对应。


小结

场景MyBatis中参数引用方式备注
单个对象参数(无@Param#{property}例如#{password}会自动映射到user.getPassword()
多个参数,用@Param标记#{paramName.property}例如#{userInfo.password}
在XML中直接写#{password},但参数是多个带@Param的参数会报Parameter 'password' not found必须写#{userInfo.password}

结语

理解MyBatis的参数映射机制,有助于避免常见的参数绑定错误。记住:

  • 单个对象:可以直接用#{property}
  • 多个参数(带@Param:必须用#{paramName.property}

欢迎评论区友好交流,如果这篇文章对你有帮助的话欢迎点赞收藏!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值