当前位置:   article > 正文

java实现mysql两个数据库对比表结构是否一致_mybaties连接两个库比较表结构是否发生变化

mybaties连接两个库比较表结构是否发生变化

【使用场景】

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

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

【类存放路径】

CompareDbMain是主函数。

【具体代码】

  1. public class ColumnEntity {
  2. private String tableName;
  3. private String columnName;
  4. private String columnTypeName;
  5. private Integer columnDisplaySize;
  6. private Integer scale;
  7. public String getTableName() {
  8. return tableName;
  9. }
  10. public void setTableName(String tableName) {
  11. this.tableName = tableName;
  12. }
  13. public String getColumnName() {
  14. return columnName;
  15. }
  16. public void setColumnName(String columnName) {
  17. this.columnName = columnName;
  18. }
  19. public String getColumnTypeName() {
  20. return columnTypeName;
  21. }
  22. public void setColumnTypeName(String columnTypeName) {
  23. this.columnTypeName = columnTypeName;
  24. }
  25. public Integer getColumnDisplaySize() {
  26. return columnDisplaySize;
  27. }
  28. public void setColumnDisplaySize(Integer columnDisplaySize) {
  29. this.columnDisplaySize = columnDisplaySize;
  30. }
  31. public Integer getScale() {
  32. return scale;
  33. }
  34. public void setScale(Integer scale) {
  35. this.scale = scale;
  36. }
  37. }
  1. public class TableEntity {
  2. private String tableName; //表名
  3. private String tableType; //表类型
  4. private String tableCat; //表所属数据库
  5. private String tableSchem; //表所属用户名
  6. private String remarks; //表备注
  7. public String getTableName() {
  8. return tableName;
  9. }
  10. public void setTableName(String tableName) {
  11. this.tableName = tableName;
  12. }
  13. public String getTableType() {
  14. return tableType;
  15. }
  16. public void setTableType(String tableType) {
  17. this.tableType = tableType;
  18. }
  19. public String getTableCat() {
  20. return tableCat;
  21. }
  22. public void setTableCat(String tableCat) {
  23. this.tableCat = tableCat;
  24. }
  25. public String getTableSchem() {
  26. return tableSchem;
  27. }
  28. public void setTableSchem(String tableSchem) {
  29. this.tableSchem = tableSchem;
  30. }
  31. public String getRemarks() {
  32. return remarks;
  33. }
  34. public void setRemarks(String remarks) {
  35. this.remarks = remarks;
  36. }
  37. }
  1. import java.sql.*;
  2. /**
  3. * JDBC工具类
  4. * 包含数据库连接及关闭数据库资源
  5. */
  6. public class MysqlDBTools {
  7. static Connection connection = null;
  8. static PreparedStatement preparedStatement = null;
  9. static ResultSet resultSet = null;
  10. static String DB_URL = "";
  11. static String DB_USER = "";
  12. static String DB_PWD = "";
  13. public MysqlDBTools(String dbUrl, String dbUser, String dbPwd){
  14. this.DB_URL = dbUrl;
  15. this.DB_USER = dbUser;
  16. this.DB_PWD = dbPwd;
  17. }
  18. public static Connection getConnection(){
  19. try{
  20. Class.forName("com.mysql.cj.jdbc.Driver");
  21. connection = DriverManager.getConnection(DB_URL, DB_USER, DB_PWD);
  22. }catch (Exception e){
  23. System.out.println("连接失败!");
  24. e.printStackTrace();
  25. }
  26. return connection;
  27. }
  28. public static void close(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet){
  29. if(resultSet != null){
  30. try {
  31. resultSet.close();
  32. } catch (SQLException throwables) {
  33. throwables.printStackTrace();
  34. }
  35. }
  36. if(preparedStatement != null){
  37. try {
  38. preparedStatement.close();
  39. } catch (SQLException throwables) {
  40. throwables.printStackTrace();
  41. }
  42. }
  43. if(connection != null){
  44. try {
  45. connection.close();
  46. } catch (SQLException throwables) {
  47. throwables.printStackTrace();
  48. }
  49. }
  50. }
  51. }
  1. import java.sql.*;
  2. import java.util.*;
  3. /**
  4. * 功能
  5. * 更新可能因为数据表结构发生变化导致程序启动失败
  6. * 此程序能查找对比两个数据库的表结构以及字段的差异
  7. * 方便查找问题所在
  8. */
  9. public class CompareDbMain {
  10. private static String db_url1 = "jdbc:mysql://xx.xx.xx.xx:3306/udesign?useUnicode=true&characterEncoding=utf8&useSSL=false";
  11. private static String db_user1 = "root";
  12. private static String db_pwd1 = "xxx";
  13. private static String db_url2 = "jdbc:mysql://xx.xx.xx.xx:3306/udesign-v2?useUnicode=true&characterEncoding=utf8&useSSL=false";
  14. private static String db_user2 = "root";
  15. private static String db_pwd2 = "xxx";
  16. public static void main(String[] args) throws Exception{
  17. System.out.println("[结果说明]");
  18. System.out.println("1. ++表示A比B多,--表示A比B少,**表示有变化");
  19. System.out.println("");
  20. Connection conn1 = new MysqlDBTools(db_url1, db_user1, db_pwd1).getConnection();
  21. Connection conn2 = new MysqlDBTools(db_url2, db_user2, db_pwd2).getConnection();
  22. //对比表信息
  23. List<TableEntity> tables1 = getTables(conn1);
  24. List<TableEntity> tables2 = getTables(conn2);
  25. StringBuffer tableRes = compareTable(tables1, tables2);
  26. System.out.println("[表对比结果]");
  27. System.out.println(conn1.getCatalog() + " vs " + conn2.getCatalog());
  28. System.out.println(tableRes);
  29. StringBuffer columnRes = compareColumn(conn1, conn2, tables1, tables2);
  30. System.out.println("[表字段对比结果]");
  31. System.out.println(columnRes);
  32. }
  33. public static StringBuffer compareColumn(Connection conn1, Connection conn2, List<TableEntity> tables1, List<TableEntity> table2){
  34. StringBuffer sb = new StringBuffer();
  35. for(TableEntity t1: tables1){
  36. if(tableContains(table2, t1)){
  37. sb.append("["+ t1.getTableName() +"]" + "\r\n");
  38. List<ColumnEntity> columnEntities1 = getColumns(conn1, t1);
  39. List<ColumnEntity> columnEntities2 = getColumns(conn2, t1);
  40. for(ColumnEntity c1: columnEntities1){
  41. if(columnContains(columnEntities2, c1)){
  42. ColumnEntity c2 = getColumnFromList(columnEntities2, c1);
  43. if(!c2.getColumnDisplaySize().equals(c1.getColumnDisplaySize())
  44. || !c2.getColumnTypeName().equals(c1.getColumnTypeName())
  45. || !c2.getScale().equals(c1.getScale())){
  46. sb.append(" **" + c2.getColumnName() + "\r\n");
  47. }
  48. //System.out.println("对比字段属性");
  49. continue;
  50. }
  51. }
  52. for(ColumnEntity c2: columnEntities2){
  53. if(!columnContains(columnEntities1, c2)){
  54. sb.append(" --" + c2.getColumnName() + "\r\n");
  55. continue;
  56. }
  57. }
  58. for(ColumnEntity c1: columnEntities1){
  59. if(!columnContains(columnEntities2, c1)){
  60. sb.append(" ++" + c1.getColumnName() + "\r\n");
  61. continue;
  62. }
  63. }
  64. }
  65. }
  66. return sb;
  67. }
  68. //对比表信息
  69. public static StringBuffer compareTable(List<TableEntity> tab1, List<TableEntity> tab2){
  70. StringBuffer sb = new StringBuffer();
  71. for(TableEntity t1: tab1){
  72. if(tableContains(tab2, t1)){
  73. sb.append(" " + t1.getTableName() + "\r\n");
  74. continue;
  75. }
  76. }
  77. for(TableEntity t2: tab2){
  78. if(!tableContains(tab1, t2)){
  79. sb.append(" --" + t2.getTableName() + "\r\n");
  80. continue;
  81. }
  82. }
  83. for(TableEntity t1: tab1){
  84. if(!tableContains(tab2, t1)){
  85. sb.append(" ++" + t1.getTableName() + "\r\n");
  86. continue;
  87. }
  88. }
  89. return sb;
  90. }
  91. //获取字段信息
  92. public static List<ColumnEntity> getColumns(Connection conn, TableEntity table){
  93. List<ColumnEntity> columnEntities = new LinkedList<>();
  94. String sql = "select * from " + table.getTableName();
  95. try {
  96. PreparedStatement ps = conn.prepareStatement(sql);
  97. ResultSet rs = ps.executeQuery();
  98. ResultSetMetaData meta = rs.getMetaData();
  99. int columnCount = meta.getColumnCount();
  100. for (int i = 1; i < columnCount + 1; i++) {
  101. ColumnEntity columnEntity = new ColumnEntity();
  102. columnEntity.setColumnName(meta.getColumnName(i).toLowerCase());
  103. columnEntity.setColumnTypeName( meta.getColumnTypeName(i).toLowerCase());
  104. columnEntity.setColumnDisplaySize(meta.getColumnDisplaySize(i));
  105. columnEntity.setScale(meta.getScale(i));
  106. columnEntity.setTableName(meta.getTableName(i).toLowerCase());
  107. columnEntities.add(columnEntity);
  108. }
  109. } catch (SQLException e) {
  110. e.printStackTrace();
  111. }
  112. return columnEntities;
  113. }
  114. //获取表信息
  115. public static List<TableEntity> getTables(Connection conn){
  116. List<TableEntity> tableEntities = new LinkedList<>();
  117. try {
  118. DatabaseMetaData dbMetaData = conn.getMetaData();
  119. ResultSet rs = dbMetaData.getTables(conn.getCatalog(), null, null,new String[] { "TABLE" });
  120. while (rs.next()) {// ///TABLE_TYPE/REMARKS
  121. TableEntity table = new TableEntity();
  122. table.setTableName(rs.getString("TABLE_NAME").toLowerCase());
  123. table.setTableType(rs.getString("TABLE_TYPE").toLowerCase());
  124. table.setTableCat(rs.getString("TABLE_CAT").toLowerCase());
  125. table.setTableSchem(rs.getString("TABLE_SCHEM")==null? "": rs.getString("TABLE_SCHEM").toLowerCase());
  126. table.setRemarks(rs.getString("REMARKS").toLowerCase());
  127. tableEntities.add(table);
  128. }
  129. } catch (SQLException e) {
  130. e.printStackTrace();
  131. }
  132. return tableEntities;
  133. }
  134. //从list里面获取
  135. public static ColumnEntity getColumnFromList(List<ColumnEntity> columnEntities, ColumnEntity column){
  136. for(ColumnEntity c: columnEntities){
  137. if(c.getColumnName().equals(column.getColumnName())
  138. && c.getTableName().equals(column.getTableName())){
  139. return c;
  140. }
  141. }
  142. return null;
  143. }
  144. public static boolean tableContains(List<TableEntity> tableEntities, TableEntity table){
  145. for(TableEntity tab: tableEntities){
  146. if(tab.getTableName().equals(table.getTableName())){
  147. return true;
  148. }
  149. }
  150. return false;
  151. }
  152. public static boolean columnContains(List<ColumnEntity> columnEntities, ColumnEntity column){
  153. for(ColumnEntity tab: columnEntities){
  154. if(tab.getColumnName().equals(column.getColumnName())
  155. && tab.getTableName().equals(column.getTableName())){
  156. return true;
  157. }
  158. }
  159. return false;
  160. }
  161. }

结果展示:

[结果说明]
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]

1.多了kafka表

2.c_dict_region county_name字段属性不一致

3. collect_task多了group_names字段

4.ue_task_publish少了group_names字段

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/957522
推荐阅读
相关标签
  

闽ICP备14008679号