在使用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:传入多个参数(userInfo
和email
),用@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}
欢迎评论区友好交流,如果这篇文章对你有帮助的话欢迎点赞收藏!