MyBatis-Plus修改时空字段无法更新问题的解决方案

Ivy
Ivy
发布时间:2026-10-16| 2人浏览过
原创

在使用 MyBatis-Plus 进行数据更新时,若尝试将字段修改为空(NULL),默认策略会忽略该字段而不执行更新。本文介绍如何通过配置 FieldStrategy 允许 null 值覆盖,并给出使用 updateForSet 直接操作 SQL 的进阶方案。

解决空字段无法更新问题

在开发过程中,经常遇到需要清空某个数据库字段的需求。然而,当调用 MyBatis-Plus 的更新方法时,如果传入的属性值为 null,系统往往不会生成对应的 update 语句,导致数据库中保留原有的旧数据。

<![CDATA[placeholder_code_block_1]]>

从后台日志或实际打印结果可以看出,原本期望更新的这两个字段并没有出现在最终的 SQL 语句中,因此列表页显示的数据依然是原来的值。

解决步骤与原理

要实现强制更新为 null,需要在对应的实体类属性上添加特定注解。

在实体类中加入如下配置:

注解作用说明

这行注释的核心含义是:FieldStrategy.IGNORED。它告诉 MyBatis-Plus 在生成更新语句时,不要检查该字段是否为 null。无论值是 null 还是具体数据,都将自动填充该值到 SQL 语句中,从而实现对字段的“清空”或“覆盖”。

MyBatis-Plus 修改指定字段(进阶方案)

除了修改全局或单个字段的更新策略外,有时需要根据特定业务场景(如只改密码、不修改其他关联时间戳等)对特定字段进行精准控制。此时可以使用 EntityWrapper 配合 updateForSet 方法。

核心代码实现

以下代码演示了如何在一个用户密码修改的场景中,绕过默认的 Bean 映射机制,直接使用 SQL Set 语法来更新字段。这种方式能完全控制生成的 SQL,避免不必要的字段干扰。

/**
 * 修改密码(只能修改自己的密码)
 * 
 * @author zhangxuewei
 * @param password    旧密码
 * @param newpassword 新密码
 * @param session     当前会话
 * @return ResultCode 操作结果状态码
 */
@ResponseBody
@RequestMapping(value = "/updateUserPWD", method = RequestMethod.POST)
public ResultCode updateUserPWD(@RequestParam(value = "password_old") String password,
		@RequestParam(value = "password_new") String newpassword, HttpSession session) {
	logger.info("updateUserPWD ...........");
	// 1. 获取当前登录用户
	User user1 = (User) session.getAttribute("sessionUser");
	ResultCode res = new ResultCode();

	// 2. 校验旧密码
	EntityWrapper<User> ew = new EntityWrapper<>();
	ew.eq("user_name", user1.getUserName());
	User user2 = userService.selectOne(ew);

	if(user2.getPassWord().equals(AIAppUtils.encrypt(password))) {
		// 3. 参数非空校验
		if (StringUtils.isNotBlank(password) && StringUtils.isNotBlank(newpassword)) {
			// 4. 构建自定义 Set SQL,仅更新 pass_word 字段
			String setSql = "pass_word = " + "'" + AIAppUtils.encrypt(newpassword) + "'";
			EntityWrapper<User> ew1 = new EntityWrapper<>();
			ew1.eq("user_id", user1.getUserID()); // 确定要更新哪一行

			try {
				// 5. 执行更新:使用 setSql 和 条件 Wrapper
				userService.updateForSet(setSql, ew1);
				
				// 6. 清除过期的 Session 信息
				session.removeAttribute("sessionUser");
				res.setCode(0); // 成功
			} catch (Exception e) {
				e.printStackTrace();
				res.setCode(1); // 失败
			}
		} else {
			// 参数不能为空
			res.setCode(1);
			res.setMsg("参数不能为空");
		}
	} else {
		res.setCode(1);
		res.setMsg("原始密码不正确!");
	}
	
	return res;
}

以上总结了 MyBatis-Plus 处理特殊更新需求的两种常见方式:一是通过注解调整全表/全局的空值处理策略,二是通过底层 API 精确干预 SQL 生成过程。开发者可根据具体的业务复杂度和性能要求灵活选用。以上就是 MyBatis-Plus 修改时空字段无效及指定字段更新的详细内容,更多关于 Java Web 开发技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。