最近在将老系统jdk升级1.8,考虑到项目中使用的spring与jdk版本兼容,spring与mybatis-spring及mybatis兼容,故以下jar包都做了相应升级
jar | 升级前 | 升级后 | 备注 |
---|---|---|---|
jdk | 1.6 | 1.8 | |
spring | 3.2.4 | 5.1.9 | |
mybatis-spring | 1.0.1 | 1.3.2 | mybatis与spring桥接 |
mybatis | 3.0.5 | 3.4.6 |
根据jar包升级,向后兼容原则,认为此次变更除了由于包升级导致的类及方法的变更外,不会引起功能上的缺少,但往往问题就是这么出现了
项目启动后发现
![](https://img.haomeiwen.com/i22519207/db2385791c35c27c.png)
定位代码
![](https://img.haomeiwen.com/i22519207/affa82664f18a300.png)
日志中输出的"null"字符串是由于String.valueOf导致,实际map.get("STATION_NO")返回值为null,分析map数据来源于数据库查询,且数据库中数据正常
![](https://img.haomeiwen.com/i22519207/09dece2a5819fd5d.png)
通过mybatis mapper 分析是由于升级mybatis客户端导致查询结果映射出现问题导致。
分析两个版本结果集采集器源码
![](https://img.haomeiwen.com/i22519207/3cbe646e39b4e998.png)
![](https://img.haomeiwen.com/i22519207/9e0002458456f7f0.png)
以上即为两个版本结果采集器代码对比,3.0.5版本结果采集器会解析出大写和小写两种属性名,而3.4.6只会按照条件解析出一种属性名;
再次分析项目中产生问题的原因,由于出问题的mapper未设置resultMapper映射关系,且sql中未指明字段别名(as XXX),mybatis配置文件也未声明使用驼峰方式(mapUnderscoreToCamelCase)转换属性名,因此在使用3.4.6版本后,属性名按照默认小写方式解析,在返回的map中不存在大写属性名("STATION_NO"),但是存在小写属性名,修改为小写属性名后,问题解决。
总结:
1.不建议直接使用map等非明确属性名的结构作为返回值,应使用java bean;
2.使用mybatis,建议开启驼峰映射方式或者mapper中指明resultMap,进行结果集映射;
3.在使用各类框架时,建议减少缺省配置,及时是默认方式,也要指定,避免出现版本处理方式不同导致的奇怪问题
网友评论