在 MyBatis-Plus 中,使用updateById茎用,null字段并不會更新,其實是和更新的策略有關(guān)睬罗,當(dāng)然轨功,也有插入策略,本文基于MyBatis-Plus3.41和3.5.2,對插入和更新策略做講解。
方式一 調(diào)整全局的驗證策略
注入全局配置科汗,設(shè)置屬性 insertStrategy
褐啡、updateStrategy
缺點(diǎn):這樣做會對所有的字段都忽略判斷冠蒋,如果一些字段不想要修改,但是傳值的時候沒有傳遞過來,就會被更新為null
mybatis-plus:
global-config:
db-config:
insert-strategy: ignored # "忽略判斷", 所有字段都插入
update-strategy: ignored # "忽略判斷", 所有字段都更新
insertStrategy
、updateStrategy
屬性的值有以下5種枚舉類型:
ignored
“忽略判斷”, 所有字段都更新或插入
not_null
“非 NULL 判斷”, 只更新或插入非NULL值
not_empty
“非空判斷”, 只更新或插入非NULL值且非空字符串
default
如果字段的值不為null柒昏,則進(jìn)行插入或者更新操作;如果字段的值為null熙揍,不執(zhí)行操作职祷,執(zhí)行結(jié)果還是數(shù)據(jù)庫原來的值或者默認(rèn)值
never
永遠(yuǎn)不進(jìn)行插入或更新操作,即使字段的值不為null
方式二 調(diào)整字段驗證注解(如果項目沒有全局策略,推薦此注解)
在實體類屬性上注解
根據(jù)具體情況有梆,在需要更新或者插入的字段中調(diào)整驗證注解是尖,如忽略判斷,任何情況都進(jìn)行插入和更新操作:
@TableField(updateStrategy = FieldStrategy.IGNORED, insertStrategy = FieldStrategy.IGNORED)
private String remark;
方式三 使用 UpdateWrapper
如果沒有設(shè)置 insert-strategy
泥耀、update-strategy
的值饺汹,默認(rèn)為 default
使用以下方法來進(jìn)行更新操作,無設(shè)置的值還是數(shù)據(jù)庫原來的值痰催,如下
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("name", "一碗情深")
.set("remark", "描述")
.eq("id", 1);
userMapper.update(null, updateWrapper);
或者使用lambda表達(dá)式兜辞,只有將屬性賦值,數(shù)據(jù)庫的值才會改變夸溶,如下弦疮,把email設(shè)置成null
mapper.update(
null,
Wrappers.<User>lambdaUpdate()
.set(User::getName, "一碗情深")
.set(User::getRemark, "描述")
.set(User::getEmail, null) // 把email設(shè)置成null
.eq(User::getId, 1)
);