关于Model的Update操作建议

在实际使用过程中,发现Model只能save,update,delete单行数据,这个可以理解,model的模型设计就是一条记录,多条记录的操作由DB类来完成,但这个其实不方便,很多操作要写SQL代码,实际我用过不少框架的Model是以表为单位的模型,就是单行和多行操作都是在Model上完成,一个Model对应一个表结构(表结构就是数据库的模型对象嘛),而不是一条表数据,这样的逻辑映射也很清晰,而且操作很方便,如果Model没有传入主键,那么Model的update和delete就是多行的,根据model的属性自动完成,有的框架为了确保不误操作,区别了一下叫updateAll和deleteAll,saveAll。

Jfinal现在如果要update某个表全部记录的某个字段,无法直接Model完成,而必须要用DB去find,然后再用DB去update,或者直接SQL操作,这样感觉不方便也不优雅,而且先find再update是否性能比较低,多了查询操作?

评论区

JFinal

2017-03-29 13:48

这个是由 Active Record 设计模式所决定的,所以 jfinal 的数据库支持是 ActiveRecord 与 Db + Record 两者结合

如果你有比较好的方案直接在 Model 中实现全表 update 功能可以提给我

cleverbug

2017-03-29 13:54

@JFinal 那是否可以为Model增加updateAll deleteAll saveAll这样三个方法,好的,我看看如果可行,我提交给你

EATI001

2017-03-29 19:32

倒是也是,JFinal 的model设计只能查询不能做数据承载问题,比如:
final xxx dao = new xxx.dao();只能查询,删除等于操作,因为整个service操作都是dao一路下来,就卡在保存数据或更新数据要new xxx().save/update()操作,从整体观下看的确些...,当然这样也不是不行,只是有时写代码时难免有些变扭

EATI001

2017-03-29 19:36

如果能:
xxx model = new xxx();
model.setName("test");
dao.save(model);也挺好的。

cleverbug

2017-03-29 21:40

@EATI001 是不是有误解?Jfinal的Model直接可以进行save/update/delete操作的呀,所有的功能都非常好,而且都很强大、简单、轻便,就只是Model不能全表操作而已,也可以用DB进行操作,我只是有点习惯在Model上直接单表的各类操作了,所以提出来这个建议

cleverbug

2017-03-29 21:48

@EATI001 哦,你是说dao,嗯,dao不能这么操作

杜福忠

2017-03-29 22:11

@EATI001 在你的model 中加个 public Boolean save( Model model ) { return model.save() } 这样写...才不优雅了,,, 肯定不如 直接写 model.save() 好啊,,, 符合人性视觉.... 23333

JFinal

2017-03-30 10:24

@EATI001 model 自古以来就是用来承载数据的,所谓的“不能承载”独独指 static 修饰过的全局共享的变量,这个在本质上与 jfinal 无关,jfinal 仅仅是在手册中提出来要注意 static 型的变量的多线程问题

无论是什么变量,只要是 static 修饰都要注意与线程安全问题,这个对象是不是 model 并无关系

EATI001

2017-03-30 15:07

@JFinal 哈哈,这个问题可能是我理解上有误差。

EATI001

2017-03-30 15:09

@JFinal 感谢波总的纠正。^_^

热门反馈

扫码入社