Java 杂谈

手写工具类:两表数据字段的对比,并列举出不同的字段

2018-01-19  本文已影响0人  就不给蓝的打野

手写工具类:两表数据字段的对比,并列举出不同的字段

        小编同学开始正式实习两周啦,啦啦啦!手动撒花(异常羡慕此时已经回家过年的同学)。。。。。。


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来测试:

A源码 B源码 运行结果展示

    到此,就算完成了,来看下项目中的表现如何吧!

like this!

        是不是感觉很牛批的样子!


        好了!本周就分享到这里了,哪位如果大佬有幸看到小弟的文章,麻烦指点一二,小编愿意和各位大佬进行深入浅出的交流,嘿嘿。下周再见(唉!明后两天苦逼的加班啊)!

        对了!如果知道如何处理简书排版的同学,可以教我一下吗?(联系QQ:469479045)我写的这几篇文章都太丑了。。。。。

上一篇 下一篇

猜你喜欢

热点阅读