1、数据库链接 jdbcTemplate

2、datasource mysqldatasource

3、使用:

配置好2个数据源

配置好2个数据库名

配置好要对比的表名:主键

执行main函数

会打印好对比的结果

项目下载地址: 下载的项目修改数据库后可以直接运行

https://download.csdn.net/download/linhaihai0202/87173288

package com.vince.xq.dataCompare.utils;import com.mysql.cj.jdbc.MysqlDataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class MsqlDefComparisonUtil {//=================配置部分=================String database1 = "lhh";String database2 = "lhh2";private String url1 = "jdbc:mysql://localhost:3306/lhh";private String url2 = "jdbc:mysql://localhost:3306/lhh2";private String user1 = "root";private String user2 = "root";private String password1 = "root";private String password2 = "root";//那些表需要对比数据;白名单private List<String> compareDataTables = new ArrayList<>();{//表名:主键列明compareDataTables.add("name:id");}//=================配置部分=================JdbcTemplate jdbcTemplate1;JdbcTemplate jdbcTemplate2;public MsqlDefComparisonUtil(){jdbcTemplate1 = getJdbcTemplate1();jdbcTemplate2 = getJdbcTemplate2();}StringBuilder createTableSB = new StringBuilder();StringBuilder createColumnSB = new StringBuilder();StringBuilder updateColumnSB = new StringBuilder();StringBuilder insertSB = new StringBuilder();public static void main(String[] args){MsqlDefComparisonUtil util = new MsqlDefComparisonUtil();util.compareTable();util.compareData();System.out.println("建表语句");System.out.println(util.createTableSB);System.out.println("新增列语句");System.out.println(util.createColumnSB);System.out.println("修改列语句");System.out.println(util.updateColumnSB);System.out.println("插入数据语句");System.out.println(util.insertSB);}private void compareTable(){//拿到2个库的表清单List<Map<String, Object>> tables1 =jdbcTemplate1.queryForList(String.format("select * from information_schema.tables where table_schema = '%s'",database1));//拿到2个库的表清单List<Map<String, Object>> tables2 =jdbcTemplate2.queryForList(String.format("select * from information_schema.tables where table_schema = '%s'",database2));for (Map<String, Object> table1 : tables1) {String tableName = table1.get("TABLE_NAME").toString();//对比列//拿到2个库的表清单List<Map<String, Object>> columns1 =jdbcTemplate1.queryForList(String.format("select * from information_schema.columns where table_schema = '%s' and table_name = '%s' ORDER BY ORDINAL_POSITION",database1,tableName));long count = tables2.stream().filter(i -> i.get("TABLE_NAME").equals(table1.get("TABLE_NAME"))).count();if(count == 0){//todo建表//CREATE TABLE t1(//id int not null primary key,//name char(20)//);createTableSB.append("create table `"+tableName+"` (\r\n");for (Map<String, Object> column1 : columns1) {createTableSB.append("    ");createTableSB.append("`"+column1.get("COLUMN_NAME")+"` "+column1.get("COLUMN_TYPE"));createTableSB.append("NO".equals(column1.get("IS_NULLABLE"))?" NOT NULL":"");if("auto_increment".equals(column1.get("EXTRA"))) {createTableSB.append(" AUTO_INCREMENT ");}createTableSB.append("PRI".equals(column1.get("COLUMN_KEY"))?" primary key":"");if(column1.get("COLUMN_DEFAULT") != null) {createTableSB.append(" DEFAULT '" + column1.get("COLUMN_DEFAULT") + "'");}createTableSB.append(" COMMON '"+column1.get("COLUMN_COMMENT")+"',\r\n");}createTableSB.append(") ENGINE = "+table1.get("ENGINE")+" CHARACTER SET = utf8mb4;\r\n");}else{//拿到2个库的表清单List<Map<String, Object>> columns2 =jdbcTemplate2.queryForList(String.format("select * from information_schema.columns where table_schema = '%s' and table_name = '%s' ORDER BY ORDINAL_POSITION",database2,tableName));for (Map<String, Object> column1 : columns1) {List<Map<String, Object>> columnCount = columns2.stream().filter(i -> i.get("COLUMN_NAME").equals(column1.get("COLUMN_NAME"))).collect(Collectors.toList());if(columnCount == null || columnCount.isEmpty()){//增加字段//alter table tb_user  add column   `create_time` datetime DEFAULT NULL COMMENT '创建时间' ;createColumnSB.append("ALTER TABLE ");createColumnSB.append("`"+column1.get("TABLE_NAME")+"`");createColumnSB.append(" ADD `"+column1.get("COLUMN_NAME")+"` ");createColumnSB.append(column1.get("COLUMN_TYPE"));if("NO".equals(column1.get("IS_NULLABLE"))) {createColumnSB.append(" NOT NULL");}if(column1.get("COLUMN_DEFAULT") != null) {createColumnSB.append(" DEFAULT `" + column1.get("COLUMN_DEFAULT")+"`");}createColumnSB.append(" COMMON '"+column1.get("COLUMN_COMMENT")+"'");createColumnSB.append(";\n");}else {Map<String, Object> column2 = columnCount.get(0);if(!twoMapKeyEquals(column1,column2,"COLUMN_TYPE","COLUMN_COMMENT","COLUMN_DEFAULT","IS_NULLABLE")){//修改字段//ALTER TABLE `user_info` MODIFY COLUMN `name` CHAR(45) COMMENT '姓名';updateColumnSB.append("ALTER TABLE ");updateColumnSB.append("`"+column1.get("TABLE_NAME")+"`");updateColumnSB.append(" MODIFY COLUMN ");updateColumnSB.append("`"+column1.get("COLUMN_NAME")+"`");updateColumnSB.append(" "+column1.get("COLUMN_TYPE"));if("NO".equals(column1.get("IS_NULLABLE"))) {updateColumnSB.append(" NOT NULL");}if(column1.get("COLUMN_DEFAULT") != null) {updateColumnSB.append(" DEFAULT `" + column1.get("COLUMN_DEFAULT") + "`");}if(column1.get("COLUMN_COMMENT") != null) {updateColumnSB.append(" COMMENT '" + column1.get("COLUMN_COMMENT") + "'");}updateColumnSB.append(";\r\n");}}}}}}/*** 2个map 的属性都相等* @param map1* @param map2* @param args* @return*/private boolean twoMapKeyEquals(Map<String,Object> map1,Map<String,Object> map2,String ... args){for (String arg : args) {Object o1 = map1.get(arg);Object o2 = map2.get(arg);if(o1 == null && o2 != null){return false;}else if(o1 != null && o2 == null){return false;}else if(o1 != null && o2 != null){if(!o1.equals(o2)){return false;}}}return true;}private JdbcTemplate getJdbcTemplate1(){MysqlDataSource dataSource = new MysqlDataSource();dataSource.setUser(user1);dataSource.setPassword(password1);dataSource.setUrl(url1);JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);return jdbcTemplate;}private JdbcTemplate getJdbcTemplate2(){MysqlDataSource dataSource = new MysqlDataSource();dataSource.setUser(user2);dataSource.setPassword(password2);dataSource.setUrl(url2);JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);return jdbcTemplate;}private void compareData(){for (String item : compareDataTables) {String table = item.split(":")[0];String id = item.split(":")[1];List<Map<String,Object>> maps1 = jdbcTemplate1.queryForList("select * from "+table);List<Map<String,Object>> maps2 = jdbcTemplate2.queryForList("select * from "+table);for (Map<String, Object> map1 : maps1) {long count = maps2.stream().filter(i->i.get(id).equals(map1.get(id))).count();if(count == 0){insertSB.append("insert into `"+table+"` (");int i=0;for (String s : map1.keySet()) {if(i == 0){insertSB.append("`"+s+"`");}else{insertSB.append(",`"+s+"`");}i++;}insertSB.append(")");insertSB.append("values");insertSB.append("(");i=0;for (String s : map1.keySet()) {if(i == 0){insertSB.append("'"+map1.get(s)+"'");}else{insertSB.append(",'"+map1.get(s)+"'");}i++;}insertSB.append(")");insertSB.append(";\r\n");}}}}
}

MYSQL 数据库对比 工具类相关推荐

  1. java 连接mysql工具类_java连接Mysql数据库的工具类

    一个封装好的链接Mysql数据库的工具类,可以方便的获取Connection对象关闭Statement.ResultSet.Statment对象等等 复制代码 代码如下: package myUtil ...

  2. mysql数据库对比工具、mysqldiff、数据库表结构变动对比

    mysql数据库对比工具.mysqldiff.数据库表结构变动对比 1.首先你要有 Navicat Premium 15,然后找到工具-结构同步 2.找到需要对比的数据库 3.点击比对 4.点击部署 ...

  3. IDEA使用JDBC链接MySql数据库(使用工具类)案例转转好物购物平台

    首先准备好数据库:   数据库由于无法展示 私聊 发数据库脚本 导入扎包: 建立基本结构 在dao包中的结构(dao包下建立建立impl包)具体结构如下: 6.在pojo下的结构(其中写的是具体的数据 ...

  4. java properties文件 安全_java 数据库读取工具类(读取config.properties配置文件)[包含线程安全] | 学步园...

    java 数据库读取工具类(读取config.properties配置文件)[包含线程安全] 数据库读取工具类 package com.db; import java.sql.Connection; ...

  5. mysql数据库查询工具''_数据库查询工具

    多肉数据查询系统是一款非常实用的查询多肉植物小工具,软件提供了多肉植物的习性.照片.如何培养等等功能,对于喜欢在家里养些花花草草的用户会有很大的帮助,操作也很简单,基本一看就会.接下来非凡软件站小编就 ...

  6. MySQL Study之--Mysql数据库备份工具(mysqldump)

    MySQL Study之--Mysql数据库备份工具(mysqldump) 对于Mysql Database的备份方式有很多种,此次文档主要介绍mysqldump工具: mysqldump:     ...

  7. postgres数据库对比工具

    前言:公司有开发环境数据库,生产环境数据库.小伙伴在开发环境更换了数据库字段,导致上线到生产环境时数据库字段不一致,所有写啦一个数据库对比工具分享给大家!! public static final S ...

  8. 华信mysql_华信Mysql数据库修复工具

    华信Mysql数据库修复程序是由北京华信数据恢复中心独立研发,主要针对Mysql数据库损坏的恢复.本程序可用于由于各种误操作而导致数据丢失的恢复,以及由于断电.陈列损坏.硬盘坏道等各种原因导致数据库无 ...

  9. java解析mdb文件_Access MDB文件解析查询,Access数据库解析工具类MdbUtils

    Access MDB文件解析查询,Access数据库解析工具类MdbUtils ================================ ©Copyright 蕃薯耀 2018年9月18日 h ...

最新文章

  1. 九江学院计算机主任黄冬久,陈春生副校长到实验中间调研引导工作
  2. oracle 存储过程 输入,Oracle 存储过程加密方法
  3. 分布式数据库一定会替代Oracle吗?
  4. 全文服务(Microsoft 搜索)不可用。系统管理员必须启动此服务
  5. 十二、十三天总结笔记
  6. OpenCV绘制线、矩形、圆等基本几何形状
  7. 关于 springboot 的自动配置
  8. 百度贴吧界面html程序代码,如何把自己的网址转换为百度贴吧网址?
  9. wireshark显示过滤器和捕获过滤器
  10. 目标管理 督查督办系统
  11. “百度百科六度分隔理论”(简单版)
  12. 杭州市公积金提取及相关知识
  13. 前端JS获取图片文件的真实格式
  14. 以CS1237为例来看ADC芯片两个基本指标
  15. 蜗牛睡眠软件测试准吗,蜗牛睡眠怎么判断深睡 知道深睡方法
  16. html自动刷新倒计时,javascript – 倒计时结束时刷新页面
  17. 如何把docx转成doc
  18. 不懂批判性思维,可能正在限制你的程序员生涯!
  19. python-非标准格式json文件读取报错解决办法
  20. 记一次docker启动elasticsearch报错解决方法

热门文章

  1. U 盘安装 Win10 分区
  2. 利用Matlab与Arduino制作车牌识别的完整控制系统(1)
  3. windows显示缩略图(重建缩略图)
  4. 哈佛大学——差异表达分析(七)设计公式(Design formulas)
  5. 乡镇人口数据查询渠道
  6. Qt下Unix时间10进制格式和实际时间的相互转换
  7. javascript 资料型態/结构验证库 : Skeletons
  8. 物联网LoRa系列-19:LoRa终端--射频芯片SX1261 SX1262的6种操作模式及其设置
  9. 安凯微在科创板IPO过会:计划募资10亿元,小米等为其股东
  10. 做员工难,做领导更难!(只有不断学习与进步才能够带好团队)