MyBatis-Plus 更新操作的三种方式与 null 值处理方案
在使用 MyBatis-Plus 进行数据更新时,除了基础的根据 ID 更新外,条件构造器和 Lambda 表达式提供了更灵活的配置方式。本文将介绍 updateById、UpdateWrapper 以及 LambdaUpdateWrapper 三种常见用法,并解决当实体字段值为 null 时导致生成的 UPDATE 语句缺少 SET 子句从而引发语法错误的经典问题。
1. 根据主键更新
这是最直观的更新方式,通过传入包含主键信息的实体对象,MyBatis-Plus 会自动生成以主键为条件的更新语句。此方法通常用于全量替换该条记录的非 null 字段(取决于全局配置)。
User user = new User();
user.setUserId(1);
user.setAge(29);
// 执行根据 id 更新
userMapper.updateById(user);2. 使用 UpdateWrapper 进行条件更新
当需要根据非主键字段(如用户名)来更新其他属性时,需要借助 UpdateWrapper 构建查询条件。以下代码展示了将名为 "rhb" 的用户年龄修改为 18,其他未指定的属性保持不变。
第1步:构造基础 Wrapper 与实体
创建 UpdateWrapper<User> 实例并设置查询条件 eq("name", "rhb")。同时实例化一个 User 对象,仅赋值需要更新的字段 age。注意,即使只更新一个字段,也必须实例化实体对象作为参数传递。
//把名字为rhb的用户年龄更新为18,其他属性不变
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>;
updateWrapper.eq("name","rhb");
User user = new User();
user.setAge(18);
userMapper.update(user, updateWrapper);第2步:使用 set 方法简化单字段更新
在 UpdateWrapper 中直接使用 set 方法可以进一步减少实体对象的依赖,直接指定更新的列和值,代码更加简洁。
//只更新一个属性,把名字为rhb的用户年龄更新为18,其他属性不变
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>;
updateWrapper.eq("name","rhb").set("age", 18);
userMapper.update(null, updateWrapper);3. 使用 LambdaUpdateWrapper(推荐)
为了避免硬编码字符串带来的潜在错误(如列名拼写错误),推荐使用泛型安全的 LambdaUpdateWrapper。它通过 Java 方法引用(Method Reference)来指定字段,具有编译期检查优势。
LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>;
lambdaUpdateWrapper.eq(User::getName, "rhb").set(User::getAge, 18);
Integer rows = userMapper.update(null, lambdaUpdateWrapper);4. 解决 value 为 null 时 SQL 不拼接的问题
现象描述:
在类似“系统参数表”(Key-Value 结构)的场景中,如果原本存在的记录的某个字段值被设为 null 试图清空,或者该字段本身为 null 且尝试更新为 null 时,可能会遇到 SQL 语法错误。
由于 MyBatis-Plus 默认的空值策略会忽略 null 值,导致生成的 SQL 中没有对应的 `SET col=null` 部分,最终可能形成如下残缺语句,造成数据库报错:
UPDATE param SET WHERE key=?
这种现象尤其在数据库原本有值但更新为 null,或原本就是 null 且无其他有效字段更新时更容易触发。此时查看生成的 SQL 日志会发现缺少了 SET 操作。
解决方案:
要让 MyBatis-Plus 强制将 null 值写入数据库,需要在实体类的字段上明确指定更新策略。
方案一:使用 IGNORED 策略
在字段注解中使用 FieldStrategy.IGNORED,表示无论是否为 null 都进行更新。为了稳妥起见,建议同时显式指定 jdbcType。
@TableField(value = "PARAMVAL", updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR)
private String paramVal;方案二:指定 JDBC 类型
某些版本或配置下,仅指定 jdbcType 也能促使框架在更新时包含该字段。如果方案一无效,可以尝试仅保留 type 信息(配合全局配置调整)。
@TableField(value = "PARAMVAL", jdbcType = JdbcType.VARCHAR, fill = FieldFill.UPDATE)
private String paramVal;以上两种配置方案经测试均可有效解决因 null 值导致的 SQL 拼接异常问题。
以上就是 MyBatis-Plus update 更新的三种方式与 null 值处理的详细内容,更多关于 MyBatis-Plus update 优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













