• 项目问题:使用Mybatis对Oracle查询数据记录时,navicat查询有记录,但是mybatis查询返回null


    项目场景:

    提示:这里简述项目相关背景:

    根据指定条件查询Oracle表数据记录。


    问题描述

    使用Mybatis对Oracle查询数据记录时,navicat查询有记录,但是mybatis查询返回null。
    APP 中接收数据代码:

    @Override
    	public void getTPRecord() {
    		TPRecord tp = dao.getTPRecord("sdklK02");
    		log.info(tp);//null
    		//navicat 有记录
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    原因分析:

    • 查询条件的值不一致。
    • 系统使用了不同数据库相同表结构的双数据源。
    • 第一次查询后缓存,其他操作插入记录,导致从缓存获取,为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                       
    
    • 1
    • 2

    最终原因:查询条件值不一致,Oracle char类型 会使用空格补足位数

  • 相关阅读:
    MySQL主从复制与读写分离
    京东大型API网关实践之路
    Linux环境下(CentOS操作系统)如何修改MySQL数据库及Redis的密码?
    13【触发器】
    摄像头webrtc对讲方案之metaRTC+ZLMediaKit
    第十一章Redis集群
    Spring的三种注入方式(为什么推荐构造器注入?)
    a+b(暑假每日一题 45)
    浙江大学数据结构陈越 第一讲 数据结构和算法
    有关代购系统搭建的那点事
  • 原文地址:https://blog.csdn.net/weixin_43340087/article/details/125530895