”一个馒头引发的血案“|记Mybatis之BindingException异常的产生及解决过程
一. 业务场景
前几天壹哥带学生做一个项目,需要更新数据库中的车辆信息表,具体需求是要根据指定车辆的设备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文件之间的拼写一致性!
本案例中的异常真可以说是“一个馒头引发的血案”,一个小小的拼写错误也可以引发大故障,所以大家在开发时一定要仔细哦!
现在你知道异常该怎么解决了吗?如果还有什么问题,可以在评论区给壹哥留言哦。
”一个馒头引发的血案“|记Mybatis之BindingException异常的产生及解决过程相关推荐
- 一个馒头引发的血案...请看完无极后观看此片,保笑死人不偿命
一个馒头引发的血案... 采用搞笑的手法拍摄的,笑到你喷饭,极大的讽刺无极 下载地址:点击下载
- 馒头版《吉祥三宝》-一个馒头引发的血案
>"阿爸!" >"哎!" >"馒头出来网友都看了么?" >"对了." >"馒头出 ...
- 一个馒头引发血案,服务在“峰终定律”中的最大变数是什么
这是小胖的第140篇文章. 也是小胖2020年100文章的第15篇. 「创业难, 守业更难.」 本文2920字,阅读大概需要5分钟. 作者:小胖 编辑:小胖 最近的购物体验好坏参半,所以不妨来讲一讲用 ...
- 『转』度百死去飞秋一个BUG引发的血案
作了一篇文章度百死去飞秋一个BUG引发的血案,昨天,度百死去的美国客户发邮件给我,说我的软件出问题了,我查来查去,发现居然是服务器上一个目录无法删除,一删除就报 cannot read from th ...
- 【Elasticsearch】es 一个数据精度引发的血案
1.概述 在看博客的时候,发现有个博客 一个数据精度引发的血案 上面说,数据精度会丢失,然后我在 7.8.0版本的es测试,发现数据没有丢失. POST /index-lcc-0002/_doc {& ...
- 摘要: Druid连接池一个设置引发的血案 -- 链接池出现问题
摘要: Druid连接池一个设置引发的血案 今天在一台配置很低的机器上运行批量更新的程序~~~ 大概跑了三十分钟~~~这配置~~~这程序~~~ 然后华丽丽的报异常了~~~ 具体异常是这样的, DEBU ...
- 一个随机数引发的血案
一个随机数引发的血案 我也来做一次标题党 原文地址:http://blog.csdn.net/WinsenJiansbomber/article/details/50604653 目录 一个随机数引发 ...
- 线上 CPU100% 异常案例:一个正则表达式引发的血案
前几天线上一个项目监控信息突然报告异常,上到机器上后查看相关资源的使用情况,发现 CPU 利用率将近 100%.通过 Java 自带的线程 Dump 工具,我们导出了出问题的堆栈信息. 我们可以看到所 ...
- vb.net服务器启动后cpu占用了70_记一次服务器被异常程序占用的解决过程(怀疑黑客攻击)...
最近在跑实验,但是突然发现程序运行变慢,然后top命令查看程序运行情况,发现有异常进程,名字叫 bash,占用 2400% CPU计算资源. 刚开始怀疑是挖矿程序,因实验室网络IP为教育网公网,怀疑被 ...
最新文章
- nyoj 720 项目安排(dp+二分优化)
- RMAN CONFIGURE解释
- ASP.NET WebForm和Mvc开发的比较
- cuda编程_CUDA编程入门(四)并行归约算法
- 简单说说我对几位认识的号主的印象
- 支付宝APP支付(基于Java实现支付宝APP支付)
- 【es】es Plugin 组件加载 PluginsService
- 使用ELK实时分析SSH暴力破解
- 目标规划运筹学例题doc_第八章 运筹学 目标规划 案例.doc
- 树莓派python实现二维码识别——ZBar
- 链家广州二手房的数据与分析——数据分析1
- 免费QQ币:永不过期的刷QQ币技巧共享
- 《人月神话》(The Mythical Man-Month)看清问题的本质:如果我们想解决问题,就必须试图先去理解它...
- 计算机无法访问iTunes,电脑中iTunes无法连接到iTunes Store发生未知错误如何解决
- php中下载csv文件怎么打开,php – 下载csv文件
- 编译一个OrangeFox(橙狐) recovery
- Elastic:关于索引生命周期ILM的一些试验;warm,cold,delete节点中min_age设置的是增量还是累计值
- Java基础之《netty(28)—TCP粘包拆包原理》
- 基于SpringBoot的网上电影票购买系统设计与实现
- js Web APIs