You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MyBatis + Spring Boot项目@Update注解执行更新返回0不生效问题

排查思路

  • 首先核对Mapper参数类型与实际传入参数的匹配性
    你当前Mapper的update方法定义的参数类型是EMMT,但你在Service层实际传入的是justForUpdate类的对象。你提到EMMT的成员变量与表列完全一致,而LAST_T_TimeStmp是你自定义的查询条件参数、不属于表字段,那么EMMT类中大概率没有声明这个字段,MyBatis无法读取到对应值会默认传入null,导致T_TimeStmp >= null的条件永远不成立,自然返回0行受影响。

解决方法:将Mapper方法的参数类型改为justForUpdate,或者在EMMT类中补充LAST_T_TimeStmp字段。

  • 检查JavaBean的Getter/Setter方法
    你贴出的justForUpdate和EMMT类的字段都是默认访问权限,也没有显式声明Getter方法。MyBatis需要通过Getter方法读取对象的属性值,如果缺少对应Getter,会导致参数取值为空,最终WHERE条件匹配失败。

  • 打印MyBatis执行日志确认参数
    在Spring Boot配置文件中添加以下配置,打印完整的SQL执行语句和绑定的参数值:

mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

将打印出的参数值替换到SQL中,放到SQLDeveloper执行,确认是否真的能匹配到数据,快速定位是否是参数取值错误的问题。

  • 核对Oracle时间类型精度匹配问题
    Java的Timestamp类型精度到纳秒,而如果数据库中T_TimeStmp字段是Oracle的DATE类型,精度只到秒,会导致时间对比时出现偏差。比如数据库存储的时间是2024-05-20 14:00:00,而Java传入的参数是2024-05-20 14:00:00.123,就会出现范围匹配不到的情况。

解决方法:可以在SQL中手动截断时间精度,比如TRUNC(T_TimeStmp, 'ss') >= TRUNC(#{updateBean.LAST_T_TimeStmp}, 'ss'),或者将Java参数的纳秒部分清零后再传入。

  • 检查事务可见性问题
    Oracle默认隔离级别为读已提交,如果你在SQLDeveloper中插入测试数据后没有执行COMMIT,那么MyBatis所在的独立会话是看不到这部分未提交的数据的,自然更新不到。你在SQLDeveloper中能执行成功是因为同一个会话可以读取到自身未提交的数据。

解决方法:在SQLDeveloper中执行完测试数据插入后手动执行COMMIT,再测试MyBatis的更新逻辑。

内容的提问来源于stack exchange,提问作者Akif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:15:03