jdbcTemplate执行sql后数据库字段没有更新问题解决

问题大致如下:

postgre数据库,jsonb字段,由于mapper层用的是mybatis,而mybatis的JSQLParser无法解析mapper.xml文件中的jsonb更新语法,所以无法直接用sql更新jsonb字段中的json内容,于是我使用jdbcTemplate执行原生sql来更新这个字段的值。

问题是:显示执行成功,但是字段置未被更新。但我把日志中的sql和参数拿去dbever执行都可以正确更新字段值,但是偏偏在项目中无法正确更新,也不报错,原生sql执行也没问题,也正确返回了影响行数,但数据库的字段就是没有变化。

问题原因:

我的调用顺序:1.mapper.update();2.原生sql;这个调用顺序导致了问题出现,原因是我在第一步调用mapper.update的时候,虽然执行成功,但数据库事务尚未提交,也就是说,更新只存在于mybatis的一级缓存中,并未真实发生在数据库。而我的第二个原生SQL并未被mybatis事务管理器管理,直接绕过了管理器在数据库发生了真实变更。而当原生sql执行完,第一步的mapper.update方法的事务才被提交,此时一级缓存中的旧值覆盖了我原生SQL修改过的值,所以出现了这个问题。

解决办法:

1.先执行原生SQL,再执行mybatis方法

2.执行完原生SQL后,需要重新查询一下待mybatis方法更新的数据,防止覆盖

相关推荐
guodingdingh1 小时前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯3 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
GuWenyue3 小时前
Cursor黑盒拆解!1套LangChain.js手写Mini编程Agent,自动生成React项目,效率提升60%
前端·数据库·人工智能
优橙教育3 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵3 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
Csvn4 小时前
📊 SQL 入门 Day 8:集合操作 — 用 SQL 做数学里的"并交差"
后端·sql
腻害兔5 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
Miao121315 小时前
某海外住宿平台如何在大规模场景下实现指标一致性:Minerva 指标平台实践
大数据·数据库·人工智能
CodexDave5 小时前
MySQL事务隔离级别与MVCC机制解析
前端·数据库·mysql·nginx·性能优化·负载均衡
碎光拾影5 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库