项目场景:
提示:这里简述项目相关背景:
根据指定条件查询Oracle表数据记录。
问题描述
使用Mybatis对Oracle查询数据记录时,navicat查询有记录,但是mybatis查询返回null。
APP 中接收数据代码:
@Override
public void getTPRecord() {
TPRecord tp = dao.getTPRecord("sdklK02");
log.info(tp);//null
//navicat 有记录
}
原因分析:
- 查询条件的值不一致。
- 系统使用了不同数据库相同表结构的双数据源。
- 第一次查询后缓存,其他操作插入记录,导致从缓存获取,为null。
解决方案1:
查询条件的值不一致。
查看和对比查询条件一致,不是该原因。
解决方案2:
系统使用了不同数据库相同表结构的双数据源。
通过idea调试工具查询调用的数据源正常,不是该原因。
解决方案3:
第一次查询后缓存,其他操作插入记录,导致从缓存获取,为null
重启项目,也不行。
解决方案4:
想起mybatis 底层原理是jdbc操作,于是通过idea调试工具,手动编写jdbc代码。
首先使用statement同样的查询条件正常返回记录。
再次使用PreparedStatement同样的查询条件,返回和mybatis一样为null。
查询两者差距,对比数据库字段值,发现问题。
原因为字段值使用char类型,设置长度为10,插入数据长度为6,oracle自动补足4位空格,查询值没有空格,导致查询不到记录。
Oracle表记录: value -> 456444空格空格空格空格
查询条件:value = 456444
最终原因:查询条件值不一致,Oracle char类型 会使用空格补足位数