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年以后, 你再掏出来闻闻, 你细品, 酸爽!