比對兩個資料庫的差異:Java篇

skygreen發表於2009-03-27

人類之所以進步,在於會使用工具

我們知道,有程式碼比對工具;有版本控制控制工具比對同一個檔案不同人修改的地方;

還有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;
    }
}

相關文章