美文网首页Java 杂谈
手写工具类:两表数据字段的对比,并列举出不同的字段

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

作者: 就不给蓝的打野 | 来源:发表于2018-01-19 21:59 被阅读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)我写的这几篇文章都太丑了。。。。。

相关文章

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

    手写工具类:两表数据字段的对比,并列举出不同的字段 小编同学开始正式实习两周啦,啦啦啦!手动撒花(异常羡慕此时已经...

  • 匹配度说明

    对比数据的粒度是按需求数据与对比数据表中的字段为对比参考 一个需求表对应一个对比表的所有字段的所有对比完成取值计算...

  • ORM之字段属性对象Field

    字段属性对象Field Model的字段属性对应数据表中的相应字段,pg表中不同的字段有不同类型,Odoo也为其封...

  • 字段类型和输入控件

    设置不同的字段类型,会有不同的输入和展示方式。数据表设计视图,打开企业表,点击名称 字段的 类型 ,弹出字段类型配...

  • 数据库

    GreenDao greendao数据表继承父类的字段?子类继承父类,并包含同名字段,override父类的get...

  • 数据表的操作(mysql)

    1、创建数据表 语法:CREATE TABLE 表名( 字段名1 数据类型 约束类型, 字段名2 数据类型 约束类...

  • SQLite中常用的SQL语句

    创建表:creat table 表名 (字段名 字段数据类型 是否为主键, 字段名 字段数据类型, 字段名 字段数...

  • 建表插入数据

    建表语句 CREATE TABLE 表名 (列名1(字段) 数据类型 [ 默认值 约束 ],列名2(字段) 数据类...

  • java.sql.SQLException: Invalid v

    主要是表中的字段与实体类中字段格式不同,数据库中cid是varchar类型,而实体表中cid是integer忘了该...

  • SQL基础语句

    SQL 基本语句记录 新建表 删除表: 插入数据: 删除数据: 更新数据: 新增字段: 删除字段: 修改字段: 重...

网友评论

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

    本文链接:https://www.haomeiwen.com/subject/tlsaoxtx.html