工做中遇到一个很小的功能,发现写好还有点难度,通过一夜的思考,把成果记录下。 java
问题: 数据库
数据库中保存了一些数据,前台更新操做传来新的数据。如何比较差别,进行更新。如: app
前台传来1,2,3,数据库中有3,5。则须要在数据库中增长1,2;在数据库中删除5;原有数据3不变。 spa
解决方法一: code
先把数据库中原的数据所有清空,而后把前台的数据所有执行插入。 rem
这种方法简单,很容易理解,以及判断及正确性。缺点是若是原数据库数据较多,则重复删除后增长,则效率不高。 get
解决方法二: hash
查询原数据库中的数据,作为待删除的列表。 it
遍历前台传来的数据,对每个在上边待删除列表中查询,若是存在,则说明此条数据要在数据库中保留。则从待删除列表中移除。若不存在,则说明须要在数据库中增长一条数据,放到一个新建列表中。 class
完成遍历后一次性删除待删除列表中的数据,插入新建列表中的数据。
List<AppSystem> appSystem_deleteList = appSystemDao.getByAppkey(app .getAppkey()); List<AppSystem> appSystem_addList = new ArrayList<AppSystem>(); if (sysStr != null && !"".equals(sysStr)) { // 组成hashmap只为加速查询 Map<String, AppSystem> appSystem_searchMap = new HashMap<String, AppSystem>(); for (AppSystem as : appSystem_deleteList) { appSystem_searchMap.put(as.getSystemid().toString(), as); } // 依次将前台传来的新值进行循环检查 String[] systemIds = sysStr.split(","); for (String systemId : systemIds) { if (appSystem_searchMap.containsKey(systemId)) { // 若是匹配到,则说明仍然须要,则从删除列表去去除 appSystem_deleteList.remove(appSystem_searchMap .get(systemId)); } else { // 未匹配到,则说明须要增长 appSystem_addList.add(new AppSystem(app.getAppkey(), Long .parseLong(systemId))); } } } appSystemDao.batchAdd(appSystem_addList); appSystemDao.batchDelete(appSystem_deleteList);