关于override

最后更新:2024-09-05 19:19:32 | 状态:未完成
override是实现检测需要插入的数据在数据库中是否存在,来确定覆盖还是跳过
ConfigStore与DataRow/DataSet都提供了override属性
大部分情况下需要用ConfigStore配合insert方法来实现
如果数据库中存在相同数据(根据columns,如果不指定则根据主键或唯一索引) 是否覆盖 true或false会检测数据库null不检测
ConfigStore configs = new DefaultConfigStore();
configs.override(true,"ID")//true表示遇到相同数据覆盖,
configs.override(false)//false表示遇到相同数据跳过
如果不设置则不判断,直接插入
service.insert("table", set, configs)

对于不同的数据库生成的SQL会不一样,参考【不同数据库生成的SQL】,
需要注意的不同的数据库有不同的要求,比如mysql要求有唯一索引。

如果不能满足数据库要求,还想实现类似功能的情况下可以用DataSet/DataRow.override(Boolean override, Boolean sync)配合service.save()方法实现
需要注意的是save方法会根据主键逐行检测数已设置过override属性的的DataRow在据库中是否存在,判断完成后分两组一组insert一组update
当然这个主键与数据库结构无关,默认ID,也可以通过配置文件可DataRow.setPrimaryKey来实现主键或复合主键,这里的主键只是用来作为查询条件的依据,与数据库无关

注意这里有两个参数
override:
null:不会检测,
true:检测数据库 如果存在则update,如果不存在则insert
false:检测数据库 如果存在则忽略,如果不存在则insert

sync:
当检测数据库存在时,是否把数据库中的数据同步到当前DataRow中不存在的列或空值(""或null)的列

经常遇到的场景如,读取第三方数据后根据第三方主键检测当前系统中是否存在,如果存在则update不存在则insert
然后用当前DataRow(如订单)的主键值查询其他表(如订单条目,物流记录),这时如果只执行update,那么当前DataRow中就没有主键值了,所以打开sync会把数据库中的原主键值同步进来
首页 最近更新 搜索 提交 回复