news 2026/10/9 1:19:18

Mybatis-Plus--解决自动填充无效的问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Mybatis-Plus--解决自动填充无效的问题

原文网址:Mybatis-Plus--解决自动填充无效的问题-CSDN博客

简介

本文介绍Mybatis-Plus解决自动填充无效的问题。

问题描述

mybatis-plus方法里,如果入参有entity实体,都能自动填充字段。

如果入参没有entity实体,有的能自动填充,有的不能自动填充。

可以自动填充的场景:

userService.removeById(id);
userService.removeBatchByIds(idList);

不能自动填充的场景:

userService.lambdaUpdate()
.eq(User::getUserName, username)
.remove();

解决方法

解析SQL,自动添加SET语句。

package com.example.demo.config.mybatis; import com.baomidou.mybatisplus.core.toolkit.PluginUtils; import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.mapping.*; import org.apache.ibatis.plugin.*; import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.SystemMetaObject; import org.springframework.stereotype.Component; import java.sql.Connection; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; @Intercepts({@Signature( type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class} )}) @Component public class MybatisFillUpdateSqlInterceptor implements Interceptor { // 定义正则表达式用于提取 SET 部分的字段名 private static final Pattern SET_PATTERN = Pattern.compile("UPDATE\\s+[^\\s]+\\s+(SET)"); @Override public Object intercept(Invocation invocation) throws Throwable { StatementHandler statementHandler = PluginUtils.realTarget(invocation.getTarget()); MetaObject metaObject = SystemMetaObject.forObject(statementHandler); MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement"); if (SqlCommandType.UPDATE == mappedStatement.getSqlCommandType() && StatementType.CALLABLE != mappedStatement.getStatementType()) { BoundSql boundSql = (BoundSql) metaObject.getValue("delegate.boundSql"); // 获取已经构造好的SQL String sql = boundSql.getSql(); // 获取映射的参数 List<ParameterMapping> mappings = new ArrayList(boundSql.getParameterMappings()); // 假如参数中不包含要构造的参数,手动写入 Map<String, String> fieldsMap = customFieldMap(); for (Entry<String, String> map : fieldsMap.entrySet()) { String fieldKey = map.getKey(); Matcher setMatcher = SET_PATTERN.matcher(sql); // 找到UPDATE才处理 if (setMatcher.find()) { Pattern fieldPattern = Pattern.compile("UPDATE\\s+[^\\s]+\\s+(SET)\\s+[^\\s]*" + fieldKey + "=" + "[^\\s]+"); Matcher fieldMatcher = fieldPattern.matcher(sql); if (!fieldMatcher.find()) { // 原SQL有此字段,则不处理 int indexOfSet = setMatcher.start(1);; String sqlPart = fieldKey + "='" + map.getValue() + "', "; sql = sql.substring(0, indexOfSet) + " SET " + sqlPart + sql.substring(indexOfSet + 4); } } } metaObject.setValue("delegate.boundSql.sql", sql); metaObject.setValue("delegate.boundSql.parameterMappings", mappings); } return invocation.proceed(); } @Override public Object plugin(Object target) { return target instanceof StatementHandler ? Plugin.wrap(target, this) : target; } private Map<String, String> customFieldMap() { Map<String, String> params = new HashMap<>(); String now = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); params.put("update_time", now); return params; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/9 1:18:07

PacketTracer 实验如何打通 TCP 三次握手理解断层

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/9 1:16:48

将FME拓展到ArcMap中

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 主要参考的使用FME拓展ArcGIS和将FME集成到ArcGIS中 本人电脑上安装的为Arcmap10.8和FME2020 首先&#xff0c;将安装的FME中的FME integration Console 以管理员身份打开 点击下面的位置是一…

作者头像 李华
网站建设 2026/10/9 1:16:43

springboot毕设选题二手车交易管理平台的设计与实现

&#x1f345;选题推荐——以防找不到我们&#xff0c;点击上方订阅专栏✌✌\ Java毕设实战项目 Python毕设项目源代码 asp.net毕业设计项目 Uniapp安卓毕业设计项目 node.js毕业设计项目 python毕业设计 微信小程序毕业设计项目 php毕业设计 &#x1f447;&#x1f3fb;&#…

作者头像 李华
网站建设 2026/10/9 1:15:51

CSS代码格式化

本文目录1. 背景2. 为什么要进行代码格式化3. 如何进行代码格式化4. 如何快捷的进行格式化5. 小结1. 背景 为什么单独拿出一章来讲代码格式化的问题&#xff0c;是因为我发现初学者&#xff0c;不理解为什么要进行代码格式化&#xff0c;以及如何进行代码格式化。 本篇就来说…

作者头像 李华
网站建设 2026/10/9 1:15:06

BeagleY-AI实战:Python环境搭建、NPU推理与GPIO联动指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/9 1:13:46

Python猫狗图像分类实战:CNN、DNN、RNN三模型对比与迁移学习

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华