比對兩個資料庫的差異:Java篇
人類之所以進步,在於會使用工具
我們知道,有程式碼比對工具;有版本控制控制工具比對同一個檔案不同人修改的地方;
還有eclipse工具提供的Compare History 工具;
我同事比較“同情”我每次釋出產品版本都要手動比對本地和線上資料庫的更改情況並進行處理;
有時候難免會有遺漏!
於是他花了一天時間寫了個工具幫我比對兩個資料庫的差異!
本著發揚Java開源精神和資源共享的社群精神;特釋出給大家分享!
再次感謝我的同事guoguo【不好意思,不能用原名】
更要感謝我們這個開發團體【wap game:天地決開發組全體成員】
【本想採用檔案上傳,但是沒有找到;只好大段上傳了】
我在此借花獻佛,原碼如下:
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 比較新舊資料庫
*
* 顯示新增的表名稱
* 顯示被修改的列(名稱和型別)
*/
public class CheckDB {
public static void main(String[] args) {
//compare from DB
String driveName = "org.gjt.mm.mysql.Driver";
String userName = "root";
String password = "yi.gong";
String url = "jdbc:mysql://db_IP1:3306/db_name1?useUnicode=true&characterEncoding=GBK";
DataBase db1 = new DataBase(driveName, userName, password, url);
Map map1 = db1.getTableData();
//compare to DB
password = "root";
url = "jdbc:mysql://db_IP2:3306/db_name2?useUnicode=true&characterEncoding=GBK";
DataBase db2 = new DataBase(driveName, userName, password, url);
Map map2 = db2.getTableData();
List newTableList = new ArrayList();// 新增的表
List updateColList = new ArrayList(); // 修改已有表的列
//compare with
for (Object object1 : map1.keySet()) {
if (map2.containsKey(object1)) {
List<String> list1 = (List) map1.get(object1);
List<String> list2 = (List) map2.get(object1);
for (String col1 : list1) {
if (!list2.contains(col1)) {
updateColList.add(object1 + "中的【" + col1 + "】不存在 ");
}
}
} else {
newTableList.add("新增" + object1);
}
//show result
System.out.println("新增的表----------");
for (Object addNewTable : newTableList) {
System.out.println(addNewTable);
}
System.out.println("表更改過的列------------");
for (Object updateCol : updateColList) {
System.out.println(updateCol);
}
}
}
//資料來源
class DataBase {
private String driveName = null;
private String userName = null;
private String password = null;
private String url = null;
private Connection con = null;
public DataBase(String driveName, String userName, String password,
String url) {
linkDataBase(driveName);
createConnection(userName, password, url);
}
/**
* 載入資料庫的驅動程
*/
private void linkDataBase(String driveName) {
try {
Class.forName(driveName);
} catch (ClassNotFoundException e) {
System.out.println("Link DataBase Fail!");
}
}
/**
* 建立一個Connection物件
*/
private void createConnection(String userName, String password, String url) {
try {
con = DriverManager.getConnection(url, userName, password);
} catch (SQLException e) {
System.out.println("Connection Opened Fail!!");
e.printStackTrace();
}
}
/**
* 關閉
*/
private void closeConnection() {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
con = null;
}
}
/**
* 獲取表列資料
*
* @return
* @throws SQLException
*/
public Map getTableData() {
Map map = new HashMap();
try {
DatabaseMetaData dbmd = (DatabaseMetaData) con.getMetaData();
//所有的表名稱
ResultSet tableRet = dbmd.getTables(null, "%", "%",
new String[] { "TABLE" });
String tableName = "";
while (tableRet.next()) {
List list = new ArrayList();
//所有的列
tableName = tableRet.getString("TABLE_NAME");
ResultSet colRet = dbmd.getColumns(null, "%", tableName, "%");
while (colRet.next()) {
list.add(colRet.getString("COLUMN_NAME") + "_"
+ colRet.getString("TYPE_NAME"));
}
map.put(tableName, list);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
this.closeConnection();
}
return map;
}
}
相關文章
- 比較兩個資料庫的差異資料庫
- java比較mysql兩個資料庫中差異JavaMySql資料庫
- 比較兩個資料庫的表結構差異(轉)資料庫
- java 如何從零實現一個資料庫差異對比工具?Java資料庫
- 比較兩個的表結構差異
- openGauss資料與PostgreSQL的差異對比SQL
- 比較兩個表的資料差別
- SQL Server 比較兩個資料庫的檢視和儲存過程結構差異SQLServer資料庫儲存過程
- list對比差異
- 線上json差異比較工具--遞迴比較兩個json的節點和值的差異,並支援差異數預覽和逐個檢視差異JSON遞迴
- 兩表中某列的資料差異
- 在Linux中,如何比較兩個檔案差異?Linux
- Golang 針對 MySQL 資料庫表結構的差異 SQL 工具GolangMySql資料庫
- Git比對檔案之間的差異Git
- MappedByteBuffer VS FileChannel:從核心層面對比兩者的效能差異APP
- Linux 對比兩個文字的交集和差集(comm)Linux
- 不同資料庫SQL語法差異資料庫SQL
- 文字差異對比工具 go-diffGo
- IDEA如何對比不同分支某個檔案的差異Idea
- python 兩個資料夾裡的檔名對比Python
- java stream()流對兩個集合進行比對Java
- 【原創】比較資料泵和exp/imp對相同資料匯出/匯入的效能差異
- 如何比較兩個資料庫表結構的不同資料庫
- PHP對比兩個資料中不同的元素PHP
- data (){..} 返回一個物件或者不返回物件,兩種寫法的差異比較物件
- 手寫一個業務資料比對庫
- 【Python】Python 對比 C語言的差異PythonC語言
- git 本地對比2次commit直接的差異GitMIT
- 資料庫和資料湖的關鍵概念性差異資料庫
- 淺析Java語言中兩種異常的差別Java
- oracle資料庫兩表資料比較Oracle資料庫
- Mac 上超好用的程式碼對比工具 beyond compare,對比json差異MacJSON
- Unique Index和Normal Index差異經典對比IndexORM
- vue-codemirror 實現文字差異比對Vue
- grep -vFf 比較2個檔案差異
- 英國網際網路使用者男女行為差異對比–資料資訊圖
- 【進階篇】使用 Stream 流對比兩個集合的常用操作分享
- oracle Mysql PostgreSQL 資料庫的對比OracleMySql資料庫