首页 > 其他分享 >”一个馒头引发的血案“|记Mybatis之BindingException异常的产生及解决过程

”一个馒头引发的血案“|记Mybatis之BindingException异常的产生及解决过程

时间:2022-12-23 18:01:14浏览次数:35  
标签:血案 devId 壹哥 接口 BindingException Mybatis carNo 异常


一. 业务场景

前几天壹哥带学生做一个项目,需要更新数据库中的车辆信息表,具体需求是要根据指定车辆的设备id(编号和设备ID均非主键)来更新车辆信息。壹哥要求学生们用Mybatis进行实现,所以就在对应的Mapper.xml文件中自定义SQL语句。结果有个学生在调用对应接口时爆出了一个BindingException异常,一下子就造成了整个模块崩溃,但他不知道这个异常该怎么解决,于是就慌慌张张地跑来问哥。其实我们在学习的时候,很多初学者都会遇到一些奇葩的问题而不知道怎么解决。

那么接下来,壹哥就以Mybatis中的这个常见异常为例,来带大家分析开发时出现异常之后该如何快速定位及解决问题,这样以后再遇到类似问题时,大家就知道该怎么解决了。

壹哥提醒,不要让同一个问题困扰你两次哦!

二. 异常信息

我们先来看看这个异常是什么。

org.apache.ibatis.binding.BindingException
nested exception is org.apache.ibatis.binding.BindingException:Parameter 'carNo' not found. Available parameters are [cardNo, devId, param1, param2]

很多同学在初次使用Mybatis时,其实很容易会遇到上面的这个异常。遇到了问题不可怕,我们想办法解决就是了。但有些同学一看到密密麻麻的英文单词,几乎一个都不认识,脑袋嗡一下子就炸了,到底哪里出错了,出了什么错,啥也不知道,反正就知道自己的代码报错了,剩下就不知所措了。

哥在这里告诉大家,遇到问题千万不要紧张。如果你的单词量不行,可以使用有道翻译对照查看错误意思,然后慢慢积累这些单词就记住了。其实Java里的常用单词就那么几个,天天看就知道是啥意思了,我们开发时其实也不需要你背写单词。

上面的异常信息,咱们根据字面意思来理解就是产生了一个绑定异常,而后面的详细描述是说参数 carNo找不到.......既然已经知道了这个错误,那就继续往下看具体的分析过程吧!

三. Mybatis使用须知

在解决异常之前,壹哥先来带各位复习一下Mybatis的使用须知:

1). 首先定义的接口方法名要和XxxMapper.xml文件中的id保持一致;
2). 建议接口名和mapper映射文件名称一致;
3). mapper映射文件中的namesapce必须是接口的全限定名称;
4). 建议接口文件和mapper映射文件的目录结构一致;
5). 接口中如果用了参数绑定@Param,需要查看映射文件的占位符内容是否和它一致。

四. 原因排查

复习了上面的Mybatis使用须知之后,你现在是否已经知道上面的异常是怎么产生的了?其实控制台里的异常信息已经把原因说得很清楚了:

Parameter 'carNO' not found. Available parameters are [carNo, devId, param1, param2] ,

这里表示没找有到占位符表示的参数 #{carNO},能用的参数有carNo、devId等,这里明显就是发生了拼写错误。我们仔细检查核对一下发生异常之前,MyBatis中的XML文件内容:

<!--如下的映射文件内容,里面的占位符使用的carNO,NO都是大写字母!!!-->
<update id ="updateDevIdByCarNo">
update car set devId = #{devId} where car_no = #{carNO}
</update>

我们发现,原始的XML映射文件里面#{carNO}占位符使用的carNO,即NO都是大写字母!!!然后我们再来看看对应的Mapper接口代码:

int updateDevIdByCarNo(@Param("devId") String devId,@Param("carNo")String carNo);

注意看,这里参数绑定里面No的o是小写字幕,就是这样一个很小的细节,因为学生的粗心大意导致了上面的绑定错误!

也就是说,上面的异常是由一个字母的大小写不匹配而引发的!无语!是不是太不应该出现这种错误了呢?其实很多人在学习编程时所犯的错误,绝大多数都是因为马虎造成的!

五. 解决办法

其实解决办法很简单,只需要将XML文件中的参数名和Mapper接口里的参数名保持一致即可!比如两者都改成carNO!

六. 总结与反思

本案例中的异常,是因为一个字母的大小写不匹配而导致的错误,这不仅仅引发了BindingException异常,同时还暴露了我们学习时存在的极大缺点:

1). 代码命名不规范,Id还是ID,No还是NO,在项目中要保持统一的风格;
2). 合理CV:为了减少XML文件中出现不必要的错误,可以直接从已有的SQL语句中把参数粘贴过来(NO);
3). 一定要注意接口与XML文件之间的拼写一致性!

本案例中的异常真可以说是“一个馒头引发的血案”,一个小小的拼写错误也可以引发大故障,所以大家在开发时一定要仔细哦!

现在你知道异常该怎么解决了吗?如果还有什么问题,可以在评论区给壹哥留言哦。

标签:血案,devId,壹哥,接口,BindingException,Mybatis,carNo,异常
From: https://blog.51cto.com/u_7044146/5966101

相关文章

  • 异常解决!Mybatis实体类属性名和表中字段名不一致的处理方案
    一.前言最近壹哥有学生出去面试,被问到“Mybatis实体类的属性名和表中的字段名不一致该怎么处理?”,这其实是一个很经典的面试题,接下来壹哥就为大家详细解析一下这道面试题。......
  • mybatis-学习笔记
    Mybatis1简介MyBatis是一款优秀的持久层框架它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBati......
  • 19.MyBatis
    介绍mybatis几乎消除了所有jdbc代码和参数的手工配置,mybatis可以使用简单的xml形式或者注解来配置原始映射工作原理......
  • Springboot+Mybatis+MySql下,mysql使用json类型字段存取的处理
    转载:Springboot+Mybatis+MySql下,mysql使用json类型字段存取的处理背景:1、mysql5.7开始支持json类型字段;2、mybatis暂不支持json类型字段的处理,需要自己做处理项目......
  • mybatisplus总结
    在学完了spring之后又去看了mybatisplus因为在学spring的过程中他有一部分讲解了一部分的springboot 然后也就尝试使用了 但是他一开始是用的mybatis进行数据库的操作......
  • MyBatis是如何初始化的?
    摘要:我们知道MyBatis和数据库的交互有两种方式有JavaAPI和Mapper接口两种,所以MyBatis的初始化必然也有两种;那么MyBatis是如何初始化的呢?本文分享自华为云社区《MyBatis详......
  • MyBatis是如何初始化的?
    摘要:我们知道MyBatis和数据库的交互有两种方式有JavaAPI和Mapper接口两种,所以MyBatis的初始化必然也有两种;那么MyBatis是如何初始化的呢?本文分享自华为云社区《​​MyBatis......
  • MyBatis的相应API与传统和代理开发的Dao层实现
    MyBatis的相应API1、SqlSession工厂构建器SqlSessionFactoryBuilder常用API:SqlSessionFactorybuild(InputStreaminputStream)通过加载mybatis的核心文件的输入流的形式构......
  • SSM(Spring 、SpringMVC 、Mybatis)框架整合
    1.引入依赖<!--引入spring相关--><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.3.2.RELEAS......
  • mybatis-plus 多租户 自定义sql
    Mapper中增加注解即可实现自定义sqlpublicinterfaceSysCustomerConfigMapperextendsBaseMapper<SysCustomerConfig>{/***根据条件查询客户设置信息......