NutzCN Logo
问答 List<Record>批量操作,自动处理插入和更新
发布于 2940天前 作者 qq_f1e65208 7285 次浏览 复制 上一个帖子 下一个帖子
标签:

我看了下插入可以通过fastInsert进行批量快速插入,想问下有没有批量快速更新的方法和自动识别插入和更新,进行批量操作的方法

12 回复
list.get(0).put(".table", "t_user");
dao.fastInsert(list);

可能我没有描述清楚 ,主要是list中的数据,在目标中可能存在 ,可能不存在 ,不存在 进行插入,存在 进行更新,我现在想的办法 是循环,进行目标库查询,如果存在 加到存在的列表中,不存在 在加到不存在 的列表中,循环结束后,进行2次批量操作,一次更新,一次插入。不知道有没有现成,或更好的,快速的方法,主要针对 程序运行速度 快,主要也是数据量比较大,每张表有差不多一亿条数据 ,几十张表,上百个节点,相互间都有这种数据操作,现在循环这么弄速度 有点慢

想用mysql的insert into on duplicate key update ?? http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

把自定义SQL封装一下好了

这是我现在的实现,但感觉速度 太慢,代码也多,有没有好办法,让运行速度更快,代码更少
public void saveOrUpdate(List list) {
List updateRecords = new ArrayList();
List insertRecords = new ArrayList();
for (Record record : list) {
String targetPrimaryKey = getProperties().getString("targetPrimaryKey");
String sourcePrimaryKey = getProperties().getString("sourcePrimaryKey");
Record targetRecord = getDao().fetch(targetPrimaryKey, Cnd.where(sourcePrimaryKey, "=", record.get(sourcePrimaryKey)));
if (targetRecord != null) {
updateRecords.add(record);
} else {
insertRecords.add(record);
}
}
updateBatch(updateRecords);
insertBatch(insertRecords);
}

public void updateBatch(List<Record> list) {
    String targetTableCode = getProperties().getString("targetTableCode");
    String sourcePrimaryKey = getProperties().getString("sourcePrimaryKey");
    for (Record record : list) {
       getDao().update(targetTableCode, Chain.from(record), Cnd.where(sourcePrimaryKey, "=", record.get("sourcePrimaryKey")));
    }

}

public void insertBatch(List<Record> list) {
    String targetTableCode = getProperties().getString("targetTableCode");
    list.get(0).put(".table", targetTableCode);
    getDao().fastInsert(list);
}

如果要兼容多种数据库的话, 上面的写法是我知道的唯一写法了

目前必须兼容mysql oracle sqlserver,您说的,上面的写法是我贴的代码吗?

@qq_f1e65208 是的, 因为SQL标准语法里面就没有 insert or update的语义

nutz后续版本能否添加相关实现,可以很方便地批量插入或更新

额, 这个, 你先报个issue吧, 我考虑一下

请问, 现在有实现上面需求的 api 了么

dao接口的insertOrUpdate

添加回复
请先登陆
回到顶部