手写工具类:两表数据字段的对比,并列举出不同的字段
小编同学开始正式实习两周啦,啦啦啦!手动撒花(异常羡慕此时已经回家过年的同学)。。。。。。
1、问题引入:
废话不多说,开始说重点吧。相信很多刚进进公司实习的小伙伴,项目经理都会很关照的给你一个看似简单的任务。比如一个简单模块,实现它的增删改查,说这个很简单的,改个框架就好了。然后给你一些以前的老前辈的代码,让你学习下如何实现,怎么使用XXX框架。想我这样的愣头小白,不管三七二十一。上去一顿啪啪啪,就给他敲完,要啥功能都给你实现了。
问题来了,再框架移植的时候会有很多数据,变量名难以对齐(前端展示数据和实体数据),有增,有减,有名字变了的。。。我就梳理了一个,33个字段。
哇!看都看不过来,整整7张表啊。一个一个人工去校对?像小编同学这么懒的,那是打死都不可能的。但是,巧了,程序员做事都是能不动就不动。so , 开始我的MergeUtil吧。
2、思考解决方案:
先来一个MergeUtil的类,再来一个方法实现我们的功能: mergeTable(Object bean1,Object bean2);
数据库中的列名映射都Java中都是实体类中的字段。获取字段,第一个我就想到的是反射大法(澄清一下:反射没有使用Method,而是Field的原因:因为代码移植过来移植过去,几十字段,掉几个getter/setter方法很正常,所以,以下方法采用反射获取字段的方法进行的。上手就是两行代码:
//获取所有的表字段
Field[] fields1 = bean1.getClass().getDeclaredFields();
Field[] fields2 = bean2.getClass().getDeclaredFields();
有了所有字段之后就要一个一个比较,如果有不一样的字段,就把它打印出来,或者说写入日志也可以。就三行代码,搞定!
for (Field field : fields1) {
if (!fieldList2.contains(field.getName())){
System.out.println("表"+bean2.getClass().getSimpleName()+"中,没有------------ "+field.getName()+"------------字段");
}
}
这就完了?No No No。。。反过来,在比较一次,实现彼此差异拼凑一下打印出来。为了良好的封装,我们直接在方法中间调一次方法就好了。
像这样:mergeTable(bean2,bean1);
看到这里是不是就有疑问了?自己调用自己?无限循环?如果有疑问就移步下面功能实现看源码,为您答疑吧。
3、功能实现
话不多说,上MergeUtil源码:
/**
* 查找两张表中筛选没有的数据字段
* @author zhangqi
* @date 2018-01-19 15:15
* @Version 1.0
**/
public class MergeUtil {
//用来控制比较的次数
private static int handler =1;
public static void mergeTable(Object bean1, Object bean2) {
if (handler <0){
System.exit(0);
}
if (bean1 ==null || bean2 ==null) {
//嘿嘿,下面就是传说中的fail fast!
throw new RuntimeException("请检查其中两个实例都不能为空!");
}
//获取所有的表字段
Field[] fields1 = bean1.getClass().getDeclaredFields();
Field[] fields2 = bean2.getClass().getDeclaredFields();
//字段数组转成List集合
String[] fieldName2 =new String[fields2.length];
int flag =0;
for (Field field : fields2){
fieldName2[flag] = field.getName();
++flag;
}
//懒得后面用for循环,就变这样了,就这么随性
List fieldList2 = Arrays.asList(fieldName2);
if (fields1==null || fieldList2==null || fieldList2.isEmpty()){
throw new RuntimeException("对象是空的!");
}
//遍历数组field1
for (Field field : fields1) {
//因为是比较小的数据量,所以就使用的是List.
//科普小知识,在大数据时代,使用hashSet的contains吧,最起码逼格很高点
//理由嘛:嘿嘿!我也不知道,各位同学自己看下面这个链接
//http://blog.csdn.net/suming000/article/details/53784979
if (!fieldList2.contains(field.getName())){
System.out.println("表"+bean2.getClass().getSimpleName()+"中,没有------------"+field.getName()+"------------字段");
}
}
--handler;
//反转过来,再比一遍
mergeTable(bean2,bean1);
}
}
4、成果展示
这里写了很随意的两个类A,B来测试:
到此,就算完成了,来看下项目中的表现如何吧!
是不是感觉很牛批的样子!
好了!本周就分享到这里了,哪位如果大佬有幸看到小弟的文章,麻烦指点一二,小编愿意和各位大佬进行深入浅出的交流,嘿嘿。下周再见(唉!明后两天苦逼的加班啊)!
对了!如果知道如何处理简书排版的同学,可以教我一下吗?(联系QQ:469479045)我写的这几篇文章都太丑了。。。。。