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

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

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


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)我写的这几篇文章都太丑了。。。。。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,011评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,706评论 19 139
  • Xutils3.0技术分享1.这个技术分享的目的1.首先要让大家了解Xutil3.0是什么Xtuils3.0的前身...
    wodezhuanshu阅读 8,445评论 5 9
  • 东原郡人阅读 1,339评论 0 0
  • 如果说你成交十个顾客,每个人买一盒就是十盒,如果成交10个顾客每个顾客都能按疗程买的话那就是30盒,那么你的销量可...
    空灵飘逸阅读 3,666评论 0 0