异常:Mapper method ... attempted to return null from a method with a primitive return type (int).

本文介绍了在运行代码时遇到的异常情况,问题源于Mapper配置文件中的SQL语句与标签不匹配。通过示例展示了错误的添加操作使用了select标签,导致报错。正确的解决方案是将select标签更改为insert,确保标签与实际操作类型一致。

当我运行异常出现这种问题的时候,由于在mpper配置的文件中,sql 语句 和 sql标签没有对应上

 如上图,这里是添加的语句,而标签的语句是select ,没有对应上所以报错。

正确解决:如下图,这里是添加操作,所以将标签select 改为 insert标签

 

### 解决 MyBatis Mapper 方法返回 null 导致的错误 在使用 MyBatis 时,如果 Mapper 方法定义为返回 `int` 类型(原始类型),而查询结果为 `null`,则会抛出 `BindingException` 异常。这是因为 Java 的原始类型(如 `int`)不能接受 `null` 值[^1]。 #### 问题的根本原因 当 MyBatis 执行查询或更新操作时,如果数据库中没有匹配的记录,则返回值可能为 `null`。然而,由于方法签名指定为 `int` 类型,MyBatis 无法将 `null` 转换为原始类型,从而导致异常[^3]。 --- #### 解决方案 ##### 方法 1:将返回类型改为 `Integer` 通过将返回类型从原始类型 `int` 改为包装类型 `Integer`,可以避免此问题。`Integer` 是一个对象类型,能够接受 `null` 值,因此即使查询结果为空也不会引发异常[^2]。 ```java public interface SaleDataMapper { Integer updateSaleData(SaleData saleData); } ``` 如果需要确保返回值始终为整数,可以在调用后进行非空检查: ```java Integer result = saleDataMapper.updateSaleData(saleData); if (result == null) { // 处理 null 情况 result = 0; } ``` --- ##### 方法 2:在 SQL 中设置默认返回值 可以通过在 SQL 查询中显式设置默认值来避免返回 `null`。例如,在 Oracle 中使用 `NVL` 函数将 `null` 替换为默认值 `0`[^4]。 ```sql <update id="updateSaleData" parameterType="SaleData"> UPDATE sale_data SET sales_amount = #{salesAmount} WHERE id = #{id} RETURNING NVL(ROWCOUNT, 0) </update> ``` 注意:`ROWCOUNT` 并不是 Oracle 的标准函数,上述示例仅为说明如何在 SQL 中处理 `null` 值。实际应用中可以结合其他逻辑实现类似功能。 --- ##### 方法 3:使用 MyBatis 的 `<select>` 标签并手动处理结果 如果需要返回受影响的行数,可以改用 `<select>` 标签执行查询,并手动计算受影响的行数。这种方式适用于更复杂的场景[^1]。 ```xml <select id="getUpdatedRowCount" resultType="Integer"> SELECT COUNT(*) AS updated_rows FROM sale_data WHERE id = #{id} AND sales_amount = #{salesAmount} </select> ``` 随后在代码中根据查询结果判断是否成功更新: ```java Integer updatedRows = saleDataMapper.getUpdatedRowCount(saleData); if (updatedRows != null && updatedRows > 0) { // 更新成功 } ``` --- ##### 方法 4:在 Java 层面捕获异常并处理 如果无法修改 Mapper 接口的返回类型,可以在调用方法时捕获 `BindingException` 并进行处理[^3]。 ```java try { int result = saleDataMapper.updateSaleData(saleData); if (result > 0) { // 更新成功 } } catch (BindingException e) { // 处理 null 返回的情况 System.out.println("Update failed due to null return value."); } ``` --- ### 示例代码 以下是一个完整的示例,展示如何通过更改返回类型为 `Integer` 来避免异常: ```java public interface SaleDataMapper { Integer updateSaleData(SaleData saleData); } public class SaleDataService { private final SaleDataMapper saleDataMapper; public SaleDataService(SaleDataMapper saleDataMapper) { this.saleDataMapper = saleDataMapper; } public void updateSales(SaleData saleData) { Integer result = saleDataMapper.updateSaleData(saleData); if (result == null || result <= 0) { throw new RuntimeException("Failed to update sale data."); } } } ``` 对应的 XML 配置如下: ```xml <update id="updateSaleData" parameterType="SaleData"> UPDATE sale_data SET sales_amount = #{salesAmount} WHERE id = #{id} </update> ``` --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慢来来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值