记录mybatis排查bug过程中遇到的坑

在使用公司内部数据库连接注解时,项目在本地写单元测试mybatis mapper出现了以下的bug.于是就开始了我长达一天的排查之旅,期间遇到了各位可能会遇到的坑,这里贴出来帮大家避雷。

sh 复制代码
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: io.shardingjdbc.core.exception.ShardingJdbcException: io.shardingjdbc.core.exception.ShardingJdbcException: java.sql.SQLException: Error
### The error may exist in file [/Users/******/IdeaProjects/umepsr-partnersub/umepsr-partnersub-aq/target/classes/mappers/Mapper.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: select           PXID,         CERTID,         CERTTYPE,                 SOURCE,         STARTDATE,         ENDDATE,         STATUS,         SUBSCRIBETYPE,         CREATETIME,         UPDATETIME       from          where SUBSCRIBETYPE = ? and CERTID =? and CERTTYPE = ?
### Cause: io.shardingjdbc.core.exception.ShardingJdbcException: io.shardingjdbc.core.exception.ShardingJdbcException: java.sql.SQLException: Error

第一坑:虚晃一枪

按照报错的指引,我找到了打包后Target文件夹中的Mapper文件。

The error may exist in file /Users/\*\*\*\*\*\*/IdeaProjects/umepsr-partnersub/umepsr-partnersub-aq/target/classes/mappers/Mapper.xml

如图所见,我当时看到这个我真的以为自己遇见了鬼。

是的,同一个mapper文件在开发时不爆红,但是编译入target中他爆红了。搞得我一度以为是我写的mapper文件语法有问题。

经过我与通过其他生产环境上正常项目比对后,我十分确认这个mapper文件爆红的地方他没问题,况且正常目录中他也没报错啊,侧面证实了我的观点。

排除所有错误答案,剩下的再离谱也是正确答案,那就是最新版的IDEA仍存在这样一个bug。在target目录中获取上下文存在bug,导致refid中的内容不能绑定识别到。

而且,在经过invalidate cache后,这个爆红仍然没有解决。

于是,我索性不管他了。

第二坑:雪上加霜

这个坑,纯纯我自己搞出来的。

在不甘心,被bug打败的调试挣扎中,我尝试搜索这个bug是什么原因。

查到的答案是很有可能,是数据库没连接上。原因在于:mybatis-spring-1.3.2中取消了自动注入SqlSessionFactory 和 SqlSessionTemplate

需要手动加入一下依赖,就会注入SqlSessionFactory 和 SqlSessionTemplate

xml 复制代码
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>1.3.2</version>
</dependency>

结果一加一个不吭声,报错确实变了,不报原来的错,但是这次的报错更离谱。

下面的报错信息,无限循环。报错信息过长,不方便截图。

根据这位老哥的经验Caused by: java.lang.StackOverflowError-CSDN博客 通过排查,删除了项目中 log4j-over-slf4j 依赖解决了问题。

如下图:

xml 复制代码
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
    <exclusions>
        <exclusion>
            <artifactId>log4j-over-slf4j</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
    </exclusions>
</dependency>

虽然解决了这个StackOverflowError,但是原有的报错仍然没有解决,只能继续在排查bug中遨游。

最终解决方案

这个时候我关注到了这个报错信息。

js 复制代码
### The error occurred while setting parameters
### SQL: select PXID,CERTID,CERTTYPE,SOURCE,STARTDATE,ENDDATE,STATUS,SUBSCRIBETYPE,CREATETIME, UPDATETIME  
from  table
where SUBSCRIBETYPE = ? and CERTID =? and CERTTYPE = ?

在一开始我是完全忽略这个问题的,毕竟我的列名一开始可是对着数据库一个一个敲的,不可能写错啊。

打脸的来了,SOURCE字段在建表语句中,没有写入。事实上,我是参考其他数据库写下这个建表语句。

一天排查bug搞得头昏脑涨,心力交瘁的,最后得到一个教训:

不要相信自己的手敲,一定要copy才最保险。

相关推荐
代码什么用4 小时前
MyBatis使用PageHelper && MyBatis的注解式开发
mybatis
前端 贾公子4 小时前
LangGraph == 图的状态(State)管理 (上)
java·开发语言·数据库
huaweichenai4 小时前
spring boot 实现file文件上传
java·spring boot·后端
VX_bysjlw9855 小时前
数码设备销售网站设计与实现39138-计算机毕设原创(免费领源码+带部署教程)
java·vue.js·spring boot·mysql·tomcat·mybatis·idea
荣码5 小时前
从0到1搭一个生产级RAG系统:串联前面21篇所有知识
java·python
xuxigifxfh5 小时前
牛客:HJ170 01序列
java·开发语言·算法·华为机考
野生技术架构师5 小时前
牛客网互联网大厂 Java 高频面试题整理(持续更新)
java·开发语言
小师兄吃牛肉6 小时前
Java语法 | 多重循环
java·开发语言·python
Han.miracle6 小时前
MySQL InnoDB:MVCC、记录锁、间隙锁、二级索引MVCC底层原理
java·开发语言
不停喝水6 小时前
【前端转全栈java速通课】 项目实战④7-11节 操作数据库-登录-注册-修改密码-注销-mubatis-plus简化crud-
java·前端·数据库