我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java实现mysql两个数据库对比表结构是否一致

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java实现mysql两个数据库对比表结构是否一致

【使用场景】

本地开发完后,增加或者删除了字段,或者修改了字段属性。

如何判定现场环境和本地环境的数据表结构一致性? 肉眼看的话,实在是一个大的工作量,所以开发了此工具。

【类存放路径】

CompareDbMain是主函数。

【具体代码】

public class ColumnEntity {    private String tableName;    private String columnName;    private String columnTypeName;    private Integer columnDisplaySize;    private Integer scale;    public String getTableName() {        return tableName;    }    public void setTableName(String tableName) {        this.tableName = tableName;    }    public String getColumnName() {        return columnName;    }    public void setColumnName(String columnName) {        this.columnName = columnName;    }    public String getColumnTypeName() {        return columnTypeName;    }    public void setColumnTypeName(String columnTypeName) {        this.columnTypeName = columnTypeName;    }    public Integer getColumnDisplaySize() {        return columnDisplaySize;    }    public void setColumnDisplaySize(Integer columnDisplaySize) {        this.columnDisplaySize = columnDisplaySize;    }    public Integer getScale() {        return scale;    }    public void setScale(Integer scale) {        this.scale = scale;    }}
public class TableEntity {    private String tableName; //表名    private String tableType; //表类型    private String tableCat; //表所属数据库    private String tableSchem; //表所属用户名    private String remarks; //表备注    public String getTableName() {        return tableName;    }    public void setTableName(String tableName) {        this.tableName = tableName;    }    public String getTableType() {        return tableType;    }    public void setTableType(String tableType) {        this.tableType = tableType;    }    public String getTableCat() {        return tableCat;    }    public void setTableCat(String tableCat) {        this.tableCat = tableCat;    }    public String getTableSchem() {        return tableSchem;    }    public void setTableSchem(String tableSchem) {        this.tableSchem = tableSchem;    }    public String getRemarks() {        return remarks;    }    public void setRemarks(String remarks) {        this.remarks = remarks;    }}
import java.sql.*;public class MysqlDBTools {    static Connection connection = null;    static PreparedStatement preparedStatement = null;    static ResultSet resultSet = null;    static String DB_URL = "";    static String DB_USER = "";    static String DB_PWD = "";    public MysqlDBTools(String dbUrl, String dbUser, String dbPwd){        this.DB_URL = dbUrl;        this.DB_USER = dbUser;        this.DB_PWD = dbPwd;    }    public static Connection getConnection(){        try{            Class.forName("com.mysql.cj.jdbc.Driver");            connection = DriverManager.getConnection(DB_URL, DB_USER, DB_PWD);        }catch (Exception e){            System.out.println("连接失败!");            e.printStackTrace();        }        return connection;    }    public static void close(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet){        if(resultSet != null){            try {                resultSet.close();            } catch (SQLException throwables) {                throwables.printStackTrace();            }        }        if(preparedStatement != null){            try {                preparedStatement.close();            } catch (SQLException throwables) {                throwables.printStackTrace();            }        }        if(connection != null){            try {                connection.close();            } catch (SQLException throwables) {                throwables.printStackTrace();            }        }    }}
import java.sql.*;import java.util.*;public class CompareDbMain {    private static String db_url1 = "jdbc:mysql://xx.xx.xx.xx:3306/udesign?useUnicode=true&characterEncoding=utf8&useSSL=false";    private static String db_user1 = "root";    private static String db_pwd1 = "xxx";    private static String db_url2 = "jdbc:mysql://xx.xx.xx.xx:3306/udesign-v2?useUnicode=true&characterEncoding=utf8&useSSL=false";    private static String db_user2 = "root";    private static String db_pwd2 = "xxx";    public static void main(String[] args) throws Exception{        System.out.println("[结果说明]");        System.out.println("1. ++表示A比B多,--表示A比B少,**表示有变化");        System.out.println("");        Connection conn1 = new MysqlDBTools(db_url1, db_user1, db_pwd1).getConnection();        Connection conn2 = new MysqlDBTools(db_url2, db_user2, db_pwd2).getConnection();        //对比表信息        List tables1 = getTables(conn1);        List tables2 = getTables(conn2);        StringBuffer tableRes = compareTable(tables1, tables2);        System.out.println("[表对比结果]");        System.out.println(conn1.getCatalog() + " vs " + conn2.getCatalog());        System.out.println(tableRes);        StringBuffer columnRes = compareColumn(conn1, conn2, tables1, tables2);        System.out.println("[表字段对比结果]");        System.out.println(columnRes);    }    public static StringBuffer compareColumn(Connection conn1, Connection conn2, List tables1, List table2){        StringBuffer sb = new StringBuffer();        for(TableEntity t1: tables1){            if(tableContains(table2, t1)){                sb.append("["+ t1.getTableName() +"]"  + "\r\n");                List columnEntities1 = getColumns(conn1, t1);                List columnEntities2 = getColumns(conn2, t1);                for(ColumnEntity c1: columnEntities1){                    if(columnContains(columnEntities2, c1)){                        ColumnEntity c2 = getColumnFromList(columnEntities2, c1);                        if(!c2.getColumnDisplaySize().equals(c1.getColumnDisplaySize())                        || !c2.getColumnTypeName().equals(c1.getColumnTypeName())                        || !c2.getScale().equals(c1.getScale())){sb.append("  **" + c2.getColumnName() + "\r\n");                        }                        //System.out.println("对比字段属性");                        continue;                    }                }                for(ColumnEntity c2: columnEntities2){                    if(!columnContains(columnEntities1, c2)){                        sb.append("  --" + c2.getColumnName() + "\r\n");                        continue;                    }                }                for(ColumnEntity c1: columnEntities1){                    if(!columnContains(columnEntities2, c1)){                        sb.append("  ++" + c1.getColumnName() + "\r\n");                        continue;                    }                }            }        }        return sb;    }    //对比表信息    public static StringBuffer compareTable(List tab1, List tab2){        StringBuffer sb = new StringBuffer();        for(TableEntity t1: tab1){            if(tableContains(tab2, t1)){                sb.append("    " + t1.getTableName() + "\r\n");                continue;            }        }        for(TableEntity t2: tab2){            if(!tableContains(tab1, t2)){                sb.append("  --" + t2.getTableName() + "\r\n");                continue;            }        }        for(TableEntity t1: tab1){            if(!tableContains(tab2, t1)){                sb.append("  ++" + t1.getTableName() + "\r\n");                continue;            }        }        return sb;    }    //获取字段信息    public static List getColumns(Connection conn, TableEntity table){        List columnEntities = new LinkedList<>();        String sql = "select * from " + table.getTableName();        try {            PreparedStatement ps = conn.prepareStatement(sql);            ResultSet rs = ps.executeQuery();            ResultSetMetaData meta = rs.getMetaData();            int columnCount = meta.getColumnCount();            for (int i = 1; i < columnCount + 1; i++) {                ColumnEntity columnEntity = new ColumnEntity();                columnEntity.setColumnName(meta.getColumnName(i).toLowerCase());                columnEntity.setColumnTypeName( meta.getColumnTypeName(i).toLowerCase());                columnEntity.setColumnDisplaySize(meta.getColumnDisplaySize(i));                columnEntity.setScale(meta.getScale(i));                columnEntity.setTableName(meta.getTableName(i).toLowerCase());                columnEntities.add(columnEntity);            }        } catch (SQLException e) {            e.printStackTrace();        }        return columnEntities;    }    //获取表信息    public static List getTables(Connection conn){        List tableEntities = new LinkedList<>();        try {            DatabaseMetaData dbMetaData = conn.getMetaData();            ResultSet rs = dbMetaData.getTables(conn.getCatalog(), null, null,new String[] { "TABLE" });            while (rs.next()) {// ///TABLE_TYPE/REMARKS                TableEntity table = new TableEntity();                table.setTableName(rs.getString("TABLE_NAME").toLowerCase());                table.setTableType(rs.getString("TABLE_TYPE").toLowerCase());                table.setTableCat(rs.getString("TABLE_CAT").toLowerCase());                table.setTableSchem(rs.getString("TABLE_SCHEM")==null? "": rs.getString("TABLE_SCHEM").toLowerCase());                table.setRemarks(rs.getString("REMARKS").toLowerCase());                tableEntities.add(table);            }        } catch (SQLException e) {            e.printStackTrace();        }        return tableEntities;    }    //从list里面获取    public static ColumnEntity getColumnFromList(List columnEntities, ColumnEntity column){        for(ColumnEntity c: columnEntities){            if(c.getColumnName().equals(column.getColumnName())                    && c.getTableName().equals(column.getTableName())){                return c;            }        }        return null;    }    public static boolean tableContains(List tableEntities, TableEntity table){        for(TableEntity tab: tableEntities){            if(tab.getTableName().equals(table.getTableName())){                return true;            }        }        return  false;    }    public static boolean columnContains(List columnEntities, ColumnEntity column){        for(ColumnEntity tab: columnEntities){            if(tab.getColumnName().equals(column.getColumnName())                    && tab.getTableName().equals(column.getTableName())){                return true;            }        }        return false;    }}

结果展示:

[结果说明]
1. ++表示A比B多,--表示A比B少,**表示有变化

[表对比结果]
udesign vs udesign-v2
    b_busi_type
    b_busi_type_l2
    c_config_version
    c_datasource_attr
    c_datasource_attr_set
    c_datasource_change_plan
    c_datasource_corba
    c_datasource_ftp
    c_datasource_info
    c_datasource_jdbc
    c_datasource_kafka
    c_datasource_pipe
    c_datasource_sdtp
    c_datasource_snmp
    c_datasource_socket
    c_datasource_subscribe
    c_dict_data_version
    c_dict_devicetype
    c_dict_net_type
    c_dict_protocol
    c_dict_region
    c_dict_specility
    c_dict_specility_level
    c_dict_vendor
    c_image
    c_image_env
    c_kafka_send_log
    c_omc_device_type
    c_omc_info
    c_omc_ne
    c_omc_net_type
    c_redis_monitor
    c_specility_topic
    collect_schedule_file_log
    collect_schedule_ftp_log
    collect_schedule_ftp_log_d
    collect_schedule_ftp_wait
    collect_schedule_time_log
    collect_stage
    collect_stage_log
    collect_stage_rel
    collect_task
    collect_task_log
    group_info
    pars_data_class
    s_protocoltype
    sys_dict
    sys_dict_item
    ue_component
    ue_component_class
    ue_dir
    ue_dir_type
    ue_etl_task_publish
    ue_stage
    ue_stage_meta_rel
    ue_task
    ue_task_publish
    ue_template
    ue_template_stage
    ue_workspace
  ++kafka

[表字段对比结果]
[b_busi_type]
[b_busi_type_l2]
[c_config_version]
[c_datasource_attr]
[c_datasource_attr_set]
[c_datasource_change_plan]
[c_datasource_corba]
[c_datasource_ftp]
[c_datasource_info]
[c_datasource_jdbc]
[c_datasource_kafka]
[c_datasource_pipe]
[c_datasource_sdtp]
[c_datasource_snmp]
[c_datasource_socket]
[c_datasource_subscribe]
[c_dict_data_version]
[c_dict_devicetype]
[c_dict_net_type]
[c_dict_protocol]
[c_dict_region]
  **county_name
[c_dict_specility]
[c_dict_specility_level]
[c_dict_vendor]
[c_image]
[c_image_env]
[c_kafka_send_log]
[c_omc_device_type]
[c_omc_info]
[c_omc_ne]
[c_omc_net_type]
[c_redis_monitor]
[c_specility_topic]
[collect_schedule_file_log]
[collect_schedule_ftp_log]
[collect_schedule_ftp_log_d]
[collect_schedule_ftp_wait]
[collect_schedule_time_log]
[collect_stage]
[collect_stage_log]
[collect_stage_rel]
[collect_task]
  ++group_names
[collect_task_log]
[group_info]
[pars_data_class]
[s_protocoltype]
[sys_dict]
[sys_dict_item]
[ue_component]
[ue_component_class]
[ue_dir]
[ue_dir_type]
[ue_etl_task_publish]
[ue_stage]
[ue_stage_meta_rel]
[ue_task]
[ue_task_publish]
  --group_names
[ue_template]
[ue_template_stage]
[ue_workspace]

多了kafka表

c_dict_region county_name字段属性不一致

 collect_task多了group_names字段

ue_task_publish少了group_names字段

来源地址:https://blog.csdn.net/qqnbsp/article/details/130563342

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java实现mysql两个数据库对比表结构是否一致

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java中如何实现比较两个list的值是否一致

java中如何实现比较两个list的值是否一致?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。java list 比较详解及实例java里比较两个list的值是否一致,不考虑顺序
2023-05-31

如何设计一个优化的MySQL表结构来实现数据报表功能?

如何设计一个优化的MySQL表结构来实现数据报表功能?一、IntroductionMySQL是广泛使用的关系型数据库系统,用于存储和管理大量的数据。在开发应用程序时,通常会遇到需要生成数据报表的需求。为了实现高效和优化的数据报表功能,正确设
如何设计一个优化的MySQL表结构来实现数据报表功能?
2023-10-31

如何设计一个优化的MySQL表结构来实现数据权限功能?

如何设计一个优化的MySQL表结构来实现数据权限功能?概述:在许多应用程序中,数据权限是一项重要的功能需求。数据权限用于限制用户对数据的访问和操作,以确保数据的安全性和合规性。在MySQL中,我们可以通过合适的表结构设计和数据权限控制来实现
如何设计一个优化的MySQL表结构来实现数据权限功能?
2023-10-31

如何设计一个优化的MySQL表结构来实现数据挖掘功能?

如何设计一个优化的MySQL表结构来实现数据挖掘功能?在进行数据挖掘功能开发时,设计一个合理的数据表结构是非常重要的。一个优化的表结构能够提高查询的效率,简化数据处理的过程,使得数据挖掘分析更加高效准确。本文将介绍如何设计一个优化的MySQ
如何设计一个优化的MySQL表结构来实现数据挖掘功能?
2023-10-31

如何设计一个优化的MySQL表结构来实现数据同步功能?

如何设计一个优化的MySQL表结构来实现数据同步功能?数据同步是在分布式系统中非常常见的需求,它可以确保多个节点之间的数据一致性。在MySQL中,我们可以通过合理设计表结构来实现数据同步功能。本文将介绍如何设计一个优化的MySQL表结构,并
如何设计一个优化的MySQL表结构来实现数据同步功能?
2023-10-31

如何设计一个优化的MySQL表结构来实现数据统计功能?

如何设计一个优化的MySQL表结构来实现数据统计功能?在实际的软件开发中,数据统计是一个非常常见且重要的功能。而MySQL作为一种常用的关系型数据库管理系统,其表结构设计的优化对于数据统计功能的实现来说尤为重要。本文将介绍如何设计一个优化的
如何设计一个优化的MySQL表结构来实现数据统计功能?
2023-10-31

如何设计一个优化的MySQL表结构来实现数据分发功能?

如何设计一个优化的MySQL表结构来实现数据分发功能?在开发数据库应用程序的过程中,我们常常需要将数据分发到不同的表中,以满足在不同的业务场景下的需求。设计一个优化的MySQL表结构来实现数据分发功能,可以提高数据访问效率和查询性能,保证数
如何设计一个优化的MySQL表结构来实现数据分发功能?
2023-10-31

如何设计一个优化的MySQL表结构来实现数据分析功能?

如何设计一个优化的MySQL表结构来实现数据分析功能?摘要:随着数据分析的兴起,构建一个高效的数据库表结构成为数据工程师面临的重要问题。本文将介绍如何设计一个优化的MySQL表结构来实现数据分析功能,包括表的规范化、索引的设计以及数据类型的
如何设计一个优化的MySQL表结构来实现数据分析功能?
2023-10-31

如何设计一个可维护的MySQL表结构来实现数据备份功能?

如何设计一个可维护的MySQL表结构来实现数据备份功能?备份是数据库管理中非常重要的一项工作,能够在系统故障或数据损坏时快速恢复数据。在MySQL中,可以通过设计一个可维护的表结构来实现数据备份功能。本文将介绍如何设计一个可靠且可维护的My
如何设计一个可维护的MySQL表结构来实现数据备份功能?
2023-10-31

如何设计一个优化的MySQL表结构来实现数据可视化功能?

如何设计一个优化的MySQL表结构来实现数据可视化功能?数据可视化是现代数据分析和决策制定的重要工具。而实现数据可视化功能的基础是一个优化的数据库表结构。本文将介绍如何设计一个优化的MySQL表结构来实现数据可视化功能,并提供具体的代码示例
如何设计一个优化的MySQL表结构来实现数据可视化功能?
2023-10-31

编程热搜

目录