问题背景:

vue+springboot+mybatis项目,涉及到一张对应工资表的表,表包含多个类型为INT的列(奖金、罚款、借支等),其中多行数据的上述字段的值为0。

前端请求获取所有工资表数据,后端从数据库中工资表中查出所有数据并传到前端。

 

问题描述:

程序运行时,前端只有借支列字段为空(奖金、罚款等为0)。

无报错。

 

问题分析:

1.前端调试

chrome中F12,可以看到后端传过来的数据,借支就是null。

2.后端调试

控制台输出sql语句以及查询结果,借支为0。

bean以及mapper.xml中上述字段的相关代码是一致的。(也就是说其他字段可以显示为0 ,借支应该也显示为0,结果却是null)

3.项目流程分析

前端请求     ---->     后端处理请求  ---->  控制器  ----> 服务 ---->DAO 数据库操作(mapper、mapper.xml、bean)

DAO 数据库操作(mapper、mapper.xml、bean)----> 服务 ----> 控制器 ----> 后端返回数据给前端 ----> 前端接收数据并处理 

4.提出问题

在这个过程中,问题出在哪里?

经验证,service中得到的数据中,cashadvance就是null,进一步的在mapper中得到的数据中的cashadvance就已经是null了,更早的情况就是mapper.xml中了,属于mybatis内部了,不好观测了。

mybatis将mapper中的方法映射为mapper.xml中的语句,并在收到前端请求时,传入参数、执行相应的sql语句,并保存在某种数据结构中。

控制台显示的sql语句以及查询结果都是正确的,那么mybatis是在什么时候,如何将数据封装到我们使用的数据结构中的,这个封装过程为什么会出错?

 

解决:

后经过检查发现,mybatis的部分工作流程如下:

控制器收到前端请 ---->...----> mybatis根据mapper.xml中sql语句,结合前端请求中的参数,从数据库查出数据 ---->

mybatis根据mapper.xml中的resultmap(如果有的话)将从数据库中查到的数据封装到java类中(column与property之间的映射)

 

我的问题就是因为映射过程出了问题,我在借支对应的column中:"cashadvace"的结尾不小心加了个空格,写成了"cashadvance ",所以出了问题。