Mdeol modifyFlag属性作用

public Ret update(BaseUser user) {
    // Integer sex = user.getSex();
    BaseUser removeNullValueAttrs = user.removeNullValueAttrs();
    // removeNullValueAttrs.setSex(sex);
    return removeNullValueAttrs.update() ? ok(Msg.UPDATE_SUCCESS) : fail(Msg.UPDATE_FAIL);
}

21E1DD8F-AB2B-46aa-B2FA-61DC89276740.png

public Ret update(BaseUser user) {
    Integer sex = user.getSex();
    BaseUser removeNullValueAttrs = user.removeNullValueAttrs();
    removeNullValueAttrs.setSex(sex);
    return removeNullValueAttrs.update() ? ok(Msg.UPDATE_SUCCESS) : fail(Msg.UPDATE_FAIL);
}

2A80B2A0-CE6C-4999-AA21-9FA2BA188D72.png

  Controller:

public void update(@Para("") BaseUser user) {
    renderJson(service.update(user));
}

@Jfinal 波总 为什么会这样?modifyFlag 属性的作用是什么呢?

评论区

lxhxka

2020-08-13 16:26

因为你没有传sex参数,形参注入的时候调用model的set方法时,会设置这个标志,如果你没有传这个参数,就不会调用set方法,自然不会设置modifyFlag。modifyFlag参数的作用是在执行更新的时候,如果没有这个字段,则生成的更新sql不会有这个字段。

lxhxka

2020-08-13 16:31

其实这个字段更常用的场景是,先从数据库查询出来一条数据,检查之后执行更行,但是我只想更新其中的一两个字段,如果没有modifyFlag,那么生成的sql只能把所有的字段都set一遍,有了modifyFlag就可以只更新你需要更新的字段。

风满楼

2020-08-14 08:35

@lxhxka 谢谢回答 但是现在的情况是我前台已经传了的sex字段了 形参注入的时候 已经有了sex字段的内容 你看我的第二段代码 我是先getSex() 然后再setSex() 自始至终我都是拿的它自己的东西 相当于先拿sex再重放sex 没有重新set新的sex 但是手动重新sex它原有的sex modifyFlag就有了sex

lxhxka

2020-08-14 09:09

@风满楼 你get 出来的sex 值是什么?是不是null呢?你可以在setSex方法上打断点,看形参注入的时候有没有调用set方法。你手动调用set 之后modifyFlag有了,基本可以确定形参注入的时候没有调用setSex方法。

lxhxka

2020-08-14 09:14

我还是感觉你没有传参数 user.sex 。用getParaMap方法看下参数把。

lxhxka

2020-08-14 09:26

@风满楼 你说的拿它自己的东西重放sex。其实这跟set什么内容没有关系,关键在于有没有调用set方法,哪怕你setSex(null) 也会设置modifyFlag。

风满楼

2020-08-14 14:44

@lxhxka 你说的第一个问题get出来的是有值 Controller中的user sex值是有的 这是确定的 这点我可以很肯定 断点里的attrs也是有sex=2的 前后台参数都有sex=2的日志 然后今天测了一下 不重新set也是可以了 见鬼了 sex 是不可能空的 是个下拉 有默认值 什么都没动 难道是编译的问题 tnnd 谢谢你啦

风满楼

2020-08-14 14:53

@lxhxka 谢谢你啦 我看了下源码 Model set的时候 _getModifyFlag().add(attr)了 明白了modifyFlag这玩意干啥的了 就是个字段修改标志

JFinal

2020-08-14 20:51

一句话就是: modifyFlag 就是对所有 set 进去的字段做标记,后续你再 update() 的时候,只更新做过标记的字段

这个功能,不会理会你其它的各种理由,因为功能就是这么设计的