JFinal ORM の 真假美猴王

JFinal ORM提供了两种方式, 一种贴近传统编码习惯的的Model, 一种是随处可用的Record模式.

据说这两种使用方法上都一样, 没有什么区别. 除了大家知道的, 一个要注册, 一个要手工指定源.

在遇见孙悟空和六耳猕猴之前, 我也是一直这么认为的, 他们都一样, 想用啥都可以.

// 孙悟空
User u = User.dao.findById(16);
u.set("memo", "真·孙悟空");
u.update();
// Sql: update `eova_user` set `memo` = ?  where `id` = ?


// 六耳猕猴
Record e = Db.use(xx.DS_EOVA).findById("eova_user", 16);
e.set("memo", "假·六耳猕猴");
Db.use(xx.DS_EOVA).update("eova_user", e);
// Sql: Sql: update `eova_user` set `login_id` = ? , `login_pwd` = ? , `memo` = ? , `name` = ? , `org_id` = ? , `rid` = ?  where `id` = ?


可能很多观众觉得这两段代码没什么区别.

Model自带值变更记录维护, 生成SQL只会更新值有变化的. 讲道理肯定是这样, 我动了啥就更新啥.

Record则是不带这个功能, 咋一听, 这个功能也就这么回事, 除了会造成一些不必要的浪费, 看起来也没啥影响.

假如有一天, 你线上项目有几千万数据量, 日订单量过万.

如果又凑巧你写了一个常规的遍历处理.

// 下面这个写法很多人都用过, 我相信.
List<Record> list = Db.find("select * from orders");
for(Record order : list){

    //  这里执行了一个复杂逻辑 大约2-3s
    
    order.set("status", 10);
    Db.update("order", order);
}


业务一切安好运行, 1年以后, 你再掏出来闻闻, 你细品, 酸爽!

评论区

杜福忠

2022-02-18 00:45

PS:一定要善用 Record的keep这个方法!!! 如e.keep("id").set("memo", ...

北流家园网

2022-02-18 08:55

@杜福忠 加个keep就不会更新其他值了是吗?

Jieven

2022-02-18 08:56

@杜福忠 这个也比较难受, 1是容易忘记这茬, 2是逻辑里还要用其它值, 撸掉了就用不着了.

杜福忠

2022-02-18 18:14

@北流家园网 keep只保留指定参数,其他数据都没了,自然不会更新了😢
@Jieven 是的复杂业务还是Model好,波总说计划给Record加modifyFlag了,那就美滋滋~

北流家园网

2022-02-19 08:44

@杜福忠 期待波点快点升级

JFinal

2022-02-20 12:17

@北流家园网 @杜福忠 @Jieven @北流家园网 @Jieven 昨天已经新增了 Db + Record 模式的 modifyFlag 功能,相当好用

以前这个功能特性只给了 Model,没想到 @Jieven 你在 Record 中也要这么玩

zzutligang

2022-02-20 15:43

理论上来说,不管是Model还是Record,从数据库检索出来数据后,修改了哪个字段的值,update的时候,才拼接该字段。这才是合理的。

JFinal

2022-02-20 16:55

@zzutligang 没错没错,已打完收工

JFinal

2022-02-20 21:44

@杜福忠 还未发布到中心库,我已经测试过,让 @Jieven 试用一下后,再推送

确保满足应用场景

北流家园网

2022-02-21 19:50

@杜福忠 杜总,发个jar包来,谢谢哈

杜福忠

2022-02-21 22:15

@北流家园网 2022-02-21 08:59:33已经发版了呀,在仓库里面了
https://developer.aliyun.com/mvn/search

fmpoffice

2022-02-22 21:10

modifyFlag 牛批

zzutligang

2022-02-24 11:28

已尝鲜,很香!

chcode

2022-03-08 13:37

@Jieven 技术大拿,总是能一针见血的推动jfinal的进化

热门分享

扫码入社