同时修改、删除多条非主键记录的两种写法

在实际工作中,有很多时候我们传到后台的参数是一个不含主键的字符串(也有可能是其他表的ID),需要分割字符串后对比原有数据进行增加、修改或删除。比如原来的有A/B/C三条记录,现在修改为A/B/D/E四条记录,这就需要先做对比,删除C记录,增加D/E记录。当然你也可以直接将原有记录直接全部删除,然后再添加新的,但这种做法不提倡,有一定的风险,如果别的地方引用到了原来的id,那就会出现找不到的问题。

一个实例:

上图就是一个对子标签进行增、删、改的需求。

还有诸如权限的勾选等需求。

现在模拟一个需求:

* 需求:根据非主键增、删(此处为软删除,即改变记录状态为删除状态)多条记录
 * 数据库结构如下:(此处假如状态1为有效,2为删除)
 *
 * 原记录
 *  id(主键)      name(名称)     sort(排序)     state(状态)
 *  1             热干面         1               1
 *  2             煎包           2               1
 *  3             豆皮           3               1 
 *  4             面窝           4               1
 *
 * 新记录
 *  id(主键)      name(名称)     sort(排序)     state(状态)
 *  1             热干面         1               1
 *  2             煎包           2               2
 *  3             豆皮           3               1 
 *  4             面窝           4               2
 *  5             稀饭           4               1
 *
 * 注意:1,原有记录不能直接删除,因为删除后,如果其他地方有引用到该id,则会造成查询不到的异常。
 *      【直接删除原有记录是最简单实现该需求的方式,如果其他地方不会引用到id,或者记录是固定的几种,可以直接删除】
 *      【实现该需求,只需要得到两个集合即可:一个是新的要添加的记录的集合,即新增集合;另一个是要删除(修改状态的集合),即修改集合】
 *       2,在循环比较中单个update可以达到效果,但在生产环境中风险较大。最好是比较完成后将集合传给持久层框架。

思路:1,将新旧字符串转换成两个集合,视具体是否需要有序、重复选择ArrayList或HashSet,这里笔者用两种方法分别使用ArrayList和HashSet. 2,对比两个集合,返回一个需要增加的集合,返回一个需要修改(删除)的集合。

两种方法效果一样:

第一种方法:一一判断,一一添加、修改

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
class ModifyMultipleDemo  
{
	public static void main(String[] args) 
	{
		//原有记录
		String oldRecord="热干面/煎包/豆皮/面窝";
		//新记录
		String newRecord="热干面/豆皮/稀饭";
		//新增集合
		List<String> insertList=getInsertList(oldRecord,newRecord);
		//删除(修改)集合
		List<String> deleteList=getDeleteList(oldRecord,newRecord);

		//转换集合
		String insertStr=listToString(insertList);
		String deleteStr=listToString(deleteList);
		
		System.out.println("原有记录:"+oldRecord);
		System.out.println("新记录:"+newRecord);
		System.out.println("新的要添加的记录:"+insertStr);
		System.out.println("旧的要删除的记录:"+deleteStr);

	}

	/**
	 * 将集合转换成字符串
	 */
	private static String listToString(List<String> list)
	{
		StringBuilder stringBuilder=new StringBuilder("[");
		/*for(int i=0;i<list.size();i++)
		{
			if(i!=list.size()-1) stringBuilder.append(list.get(i)+" ");
			else stringBuilder.append(list.get(i));
		}*/
		Iterator<String> iterator=list.iterator();
		while(iterator.hasNext())
		{
			stringBuilder.append(iterator.next()+" ");
		}
		stringBuilder.append("]");
		String str=stringBuilder.toString();
		int index=str.lastIndexOf(" ");
		if(index!=-1) return str.substring(0,index).concat(str.substring(index+1));
		else return str;
		//return stringBuilder.toString();
	}
	
	/**
	 * 新增集合
	 */
	private static List<String> getInsertList(String oldRecord,String newRecord)
	{
		List<String> insertList=new ArrayList<String>();
		String[] oldRecordArray=oldRecord.split("/");
		String[] newRecordArray=newRecord.split("/");
		insert:for(String outNew:newRecordArray)
		{
			boolean b=false;
			for(String inOld:oldRecordArray)
			{
				if(outNew.equals(inOld))
				{//不需要修改
					b=false;
					//continue insert;//结束本次外层循环
					break;//结束内层循环
				}else{//需要修改
					b=true;
				}
			}
			if(b)
			{
				insertList.add(outNew);
			}
		}
		return insertList;
	}

	/**
	 * 删除(修改)集合
	 */
	private static List<String> getDeleteList(String oldRecord,String newRecord)
	{
		List<String> deleteList=new ArrayList<String>();
		String[] oldRecordArray=oldRecord.split("/");
		String[] newRecordArray=newRecord.split("/");
		delete:for(String outOld:oldRecordArray)
		{
			boolean flag=false;
			for(String inNew:newRecordArray)
			{
				if(outOld.equals(inNew))
				{//不能删除
					flag=false;
					//break;//结束内层循环
					continue delete;//结束本次外层循环
				}else{//需要删除原有的
					flag=true;
				}
			}
			if(flag)
			{
				deleteList.add(outOld);
			}
		}
	
		return deleteList;
	}

}

第二种方法:使用父接口collection提供的retainAll(),addAll(),removeAll()方法实现,该方法直接调用方法,比较好理解

import java.util.Iterator;
import java.util.HashSet;
class ModifyMultipleDemo  
{
	public static void main(String[] args) 
	{
		//原有记录
		String oldRecord="热干面/煎包/豆皮/面窝";
		//新记录
		String newRecord="热干面/豆皮/稀饭";
		//新增集合
		HashSet<String> insertSet=getInsertSet(oldRecord,newRecord);
		//删除(修改)集合
		HashSet<String> deleteSet=getDeleteSet(oldRecord,newRecord);

		//转换集合
		String insertStr=setToString(insertSet);
		String deleteStr=setToString(deleteSet);
		
		System.out.println("原有记录:"+oldRecord);
		System.out.println("新记录:"+newRecord);
		System.out.println("新的要添加的记录:"+insertStr);
		System.out.println("旧的要删除的记录:"+deleteStr);

	}

	/**
	 * 将集合转换成字符串
	 */
	private static String setToString(HashSet<String> set)
	{
		StringBuilder stringBuilder=new StringBuilder("[");
		/*for(int i=0;i<list.size();i++)
		{
			if(i!=list.size()-1) stringBuilder.append(list.get(i)+" ");
			else stringBuilder.append(list.get(i));
		}*/
		Iterator<String> iterator=set.iterator();
		while(iterator.hasNext())
		{
			stringBuilder.append(iterator.next()+" ");
		}
		stringBuilder.append("]");
		String str=stringBuilder.toString();
		int index=str.lastIndexOf(" ");
		if(index!=-1) return str.substring(0,index).concat(str.substring(index+1));
		else return str;
		//return stringBuilder.toString();
	}
	
	/**
	 * 新增集合
	 */
	private static HashSet<String> getInsertSet(String oldRecord,String newRecord)
	{
		HashSet<String> insertSet=new HashSet<String>();
		HashSet<String> oldSet=new HashSet<String>();
		HashSet<String> newSet=new HashSet<String>();
		String[] oldRecordArray=oldRecord.split("/");
		String[] newRecordArray=newRecord.split("/");
		for(String oldStr:oldRecordArray)
		{
			oldSet.add(oldStr);
		}
		for(String newStr:newRecordArray)
		{
			newSet.add(newStr);
		}
		//将所有新的赋给将要返回的集合
		insertSet.addAll(newSet);
		//取二者之交集,赋给newSet
		newSet.retainAll(oldSet);
		//移除已有的记录,剩下新增的
		insertSet.removeAll(newSet);
		return insertSet;
	}

	/**
	 * 删除(修改)集合
	 */
	private static HashSet<String> getDeleteSet(String oldRecord,String newRecord)
	{
		HashSet<String> oldSet=new HashSet<String>();
		HashSet<String> newSet=new HashSet<String>();
		String[] oldRecordArray=oldRecord.split("/");
		String[] newRecordArray=newRecord.split("/");
		for(String oldStr:oldRecordArray)
		{
			oldSet.add(oldStr);
		}
		for(String newStr:newRecordArray)
		{
			newSet.add(newStr);
		}
		//取二者之交集
		newSet.retainAll(oldSet);
		//移除旧集合已有的
		oldSet.removeAll(newSet);
		return oldSet;
	}

}

以上代码均可直接编译运行。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值