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

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

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


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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

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