MYSQL 数据库对比 工具类
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 数据库对比 工具类相关推荐
- java 连接mysql工具类_java连接Mysql数据库的工具类
一个封装好的链接Mysql数据库的工具类,可以方便的获取Connection对象关闭Statement.ResultSet.Statment对象等等 复制代码 代码如下: package myUtil ...
- mysql数据库对比工具、mysqldiff、数据库表结构变动对比
mysql数据库对比工具.mysqldiff.数据库表结构变动对比 1.首先你要有 Navicat Premium 15,然后找到工具-结构同步 2.找到需要对比的数据库 3.点击比对 4.点击部署 ...
- IDEA使用JDBC链接MySql数据库(使用工具类)案例转转好物购物平台
首先准备好数据库: 数据库由于无法展示 私聊 发数据库脚本 导入扎包: 建立基本结构 在dao包中的结构(dao包下建立建立impl包)具体结构如下: 6.在pojo下的结构(其中写的是具体的数据 ...
- java properties文件 安全_java 数据库读取工具类(读取config.properties配置文件)[包含线程安全] | 学步园...
java 数据库读取工具类(读取config.properties配置文件)[包含线程安全] 数据库读取工具类 package com.db; import java.sql.Connection; ...
- mysql数据库查询工具''_数据库查询工具
多肉数据查询系统是一款非常实用的查询多肉植物小工具,软件提供了多肉植物的习性.照片.如何培养等等功能,对于喜欢在家里养些花花草草的用户会有很大的帮助,操作也很简单,基本一看就会.接下来非凡软件站小编就 ...
- MySQL Study之--Mysql数据库备份工具(mysqldump)
MySQL Study之--Mysql数据库备份工具(mysqldump) 对于Mysql Database的备份方式有很多种,此次文档主要介绍mysqldump工具: mysqldump: ...
- postgres数据库对比工具
前言:公司有开发环境数据库,生产环境数据库.小伙伴在开发环境更换了数据库字段,导致上线到生产环境时数据库字段不一致,所有写啦一个数据库对比工具分享给大家!! public static final S ...
- 华信mysql_华信Mysql数据库修复工具
华信Mysql数据库修复程序是由北京华信数据恢复中心独立研发,主要针对Mysql数据库损坏的恢复.本程序可用于由于各种误操作而导致数据丢失的恢复,以及由于断电.陈列损坏.硬盘坏道等各种原因导致数据库无 ...
- java解析mdb文件_Access MDB文件解析查询,Access数据库解析工具类MdbUtils
Access MDB文件解析查询,Access数据库解析工具类MdbUtils ================================ ©Copyright 蕃薯耀 2018年9月18日 h ...
最新文章
- 九江学院计算机主任黄冬久,陈春生副校长到实验中间调研引导工作
- oracle 存储过程 输入,Oracle 存储过程加密方法
- 分布式数据库一定会替代Oracle吗?
- 全文服务(Microsoft 搜索)不可用。系统管理员必须启动此服务
- 十二、十三天总结笔记
- OpenCV绘制线、矩形、圆等基本几何形状
- 关于 springboot 的自动配置
- 百度贴吧界面html程序代码,如何把自己的网址转换为百度贴吧网址?
- wireshark显示过滤器和捕获过滤器
- 目标管理 督查督办系统
- “百度百科六度分隔理论”(简单版)
- 杭州市公积金提取及相关知识
- 前端JS获取图片文件的真实格式
- 以CS1237为例来看ADC芯片两个基本指标
- 蜗牛睡眠软件测试准吗,蜗牛睡眠怎么判断深睡 知道深睡方法
- html自动刷新倒计时,javascript – 倒计时结束时刷新页面
- 如何把docx转成doc
- 不懂批判性思维,可能正在限制你的程序员生涯!
- python-非标准格式json文件读取报错解决办法
- 记一次docker启动elasticsearch报错解决方法