搜了以前的反馈,提到的这个问题:
https://jfinal.com/feedback/1109
Db.batchSave(modelList, batchSize)
这个方法,会根据modelList里第一个元素的属性值,生成insert语句。但是如果第一个元素里有一个字段,没给这个字段设置值,后面所有的成员里就是该字段有值,也会丢失该字段的值。看了JFinal的源码和波总的建议,可以使用
Db.batch(insertSql, columns, modelList, batchsize)
这种方式,强制指定insert语句,和需要处理的字段名,经过测试,这种方式是可行的。
这么看来,这也原本无可厚非。
但是,我觉得既然提供了batchSave方法,是否能改进一下代码,根据list里的Model或则Record,去取对应表里的所有字段,然后拼接成像
Db.batch(insertSql, columns, modelList, batchsize)
这个函数里的insertSql和columns,内部还是调用
Db.batch(insertSql, columns, modelList, batchsize)
这个方法,是不是可以降低不少代码量并且提高易用性呢。
根据Model或则Record获取对应表里的所有字段,这个应该是可行的。
波总在上面那个历史反馈里给的建议是自己扩展一个DbPro对象,然后覆盖batchSave方法。然后配置DbPro工厂是自己的这个对象,虽然可行,但有强迫症的,总觉得这种方式不纯了。以后升级JFinal,也会带来不少隐患。
烦请波总能重新考虑一下,把这个地方改进一下!
项目:JFinal
这个应该是不好解决,我举个例子,假定有个表是 table_x, 字段有三个 (id, x, y)
1:假定字段 id、x 不能为 null ,也就是说 insert 语句必须要给定值
2:假定字段 y 可以为 null,你可以指定值也可以不指定
3:有时候 y 字段的值你是知道的,所以你可以指定,但有时候你不知道该指定为什么值
以上情况下,如果 jfinal 自做主张,生成的 sql 包含字段 y, 那么有些不指定 y 值的 Record/Model 该放入什么值?
其实你的需求,使用 Db.batch(...) 手动指定 sql 也是可以的,方法原型如下:
public int[] batch(String sql, String columns, List modelOrRecordList, int batchSize)