报错情况:
Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Mapper method 'com.aqiuo.mapper.UserMapper.login attempted to return null from a method with a primitive return type (int).
报错原因:
<select id="login" resultType="java.lang.Integer">
select * from user where account = #{account} and password = #{password};
</select>
int login(@Param("account") String account,@Param("password") String password);
这个异常的主要原因是 MyBatis 的 Mapper 方法返回了 null
,但方法的返回类型是原始数据类型(primitive data type)int
。在 Java 中,原始数据类型不能表示 null
值,这就导致了 BindingException
异常
解决方法:
-
修改 Mapper 方法的返回类型: 将原始数据类型
int
改为对应的包装类Integer
,这样就可以返回null
了。例如:public Integer login(String username, String password);
确保 Mapper 方法的返回类型是引用类型而不是原始数据类型。
-
处理
null
值的情况: 如果返回null
表示某种情况,可以通过其他方式来表示,而不是直接返回null
。例如,可以返回一个特殊的整数值,表示登录失败,然后在业务逻辑中进行判断。这样,即便返回值是原始数据类型int
,也可以避免出现null
。public int login(String username, String password) { // 这里的 -1 可以表示登录失败 // 具体的返回值可以根据业务需要定义 return -1; }
根据实际情况选择适合你业务需求的方法。如果登录失败需要返回更多信息,建议使用包装类 Integer
,因为它允许返回 null
,而原始数据类型 int
不支持。如果只是简单表示成功或失败,你也可以使用特殊的返回值来表示。
<select id="login" resultType="java.lang.Integer">
select * from user where account = #{account} and password = #{password};
</select>
Integer login(@Param("account") String account,@Param("password") String password);