import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* 对比两个数据库, 显示不同的表、不同的字段等信息
*/
public class ShowDBDifferences {
private String className;
// 数据库1的数据库url、用户名、密码
private String dbName1;
private String dbUrl1;
private String userName1;
private String password1;
// 数据库2的数据库url、用户名、密码
private String dbName2;
private String dbUrl2;
private String userName2;
private String password2;
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getDbName1() {
return dbName1;
}
public void setDbName1(String dbName1) {
this.dbName1 = dbName1;
}
public String getDbUrl1() {
return dbUrl1;
}
public void setDbUrl1(String dbUrl1) {
this.dbUrl1 = dbUrl1;
}
public String getUserName1() {
return userName1;
}
public void setUserName1(String userName1) {
this.userName1 = userName1;
}
public String getPassword1() {
return password1;
}
public void setPassword1(String password1) {
this.password1 = password1;
}
public String getDbName2() {
return dbName2;
}
public void setDbName2(String dbName2) {
this.dbName2 = dbName2;
}
public String getDbUrl2() {
return dbUrl2;
}
public void setDbUrl2(String dbUrl2) {
this.dbUrl2 = dbUrl2;
}
public String getUserName2() {
return userName2;
}
public void setUserName2(String userName2) {
this.userName2 = userName2;
}
public String getPassword2() {
return password2;
}
public void setPassword2(String password2) {
this.password2 = password2;
}
private Connection getConnection(String url, String userName,
String password) {
Driver driver = null;
try {
driver = (Driver) Class.forName(className).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection connection = null;
try {
DriverManager.registerDriver(driver);
connection = DriverManager.getConnection(url, userName, password);
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
private Map getTableInfo(Connection conn, String tbName) {
// 查询所有表名
// String sql =
// "SELECT CREATOR, NAME FROM SYSIBM.SYSTABLES WHERE CREATOR NOT LIKE '%SYS%' order by name ";
// 查询所有表结构定义的信息
String sql = "select TBCREATOR, TBNAME, NAME, COLTYPE, TYPENAME, LENGTH, SCALE, COLNO, NULLS from sysibm.syscolumns where TBCREATOR NOT LIKE '%SYS%' and TBNAME like '%"
+ tbName + "%' order by TBNAME, COLNO ";
Map map = new HashMap();
PreparedStatement pstm = null;
ResultSet rs = null;
try {
pstm = conn.prepareStatement(sql);
rs = pstm.executeQuery();
while (rs.next()) {
String tableName = rs.getString(2);
String colName = rs.getString(3);
String colType = rs.getString(4);
int colLength = rs.getInt(6);
int colScale = rs.getInt(7);
int colNo = rs.getInt(8);
String isAllowNull = rs.getString(9);
ColumnInfo colInfo = new ColumnInfo();
colInfo.setTableName(tableName);
colInfo.setColName(colName);
colInfo.setColType(colType.trim());
colInfo.setColLength(colLength);
colInfo.setColScale(colScale);
colInfo.setColNo(colNo);
colInfo.setIsAllowNull(isAllowNull);
// System.out.println(colInfo);
Map colMap = (Map) map.get(tableName);
if (colMap == null) {
colMap = new HashMap();
}
colMap.put(colName, colInfo);
map.put(tableName, colMap);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (pstm != null)
pstm.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return map;
}
public void diff(String tbName) {
Connection conn1 = this.getConnection(this.dbUrl1, this.userName1,
this.password1);
Connection conn2 = this.getConnection(this.dbUrl2, this.userName2,
this.password2);
Map map1 = this.getTableInfo(conn1, tbName);
Map map2 = this.getTableInfo(conn2, tbName);
String addTables = ""; // 多出的表
Set tableSet1 = map1.keySet();
Iterator iter1 = tableSet1.iterator();
while (iter1.hasNext()) {
String tableName = (String) iter1.next();
if (map2.get(tableName) == null) {
addTables += "," + tableName;
} else { // 比较两个数据库间同表列的信息
Map colMap1 = (Map) map1.get(tableName);
Map colMap2 = (Map) map2.get(tableName);
String addCols = ""; // 多出的列
Set colSet1 = colMap1.keySet();
Iterator colIter1 = colSet1.iterator();
while (colIter1.hasNext()) {
String colName = (String) colIter1.next();
if (colMap2.get(colName) == null) {
addCols += "," + addCols;
} else { // 比较两个数据库间同表同列的其它信息
ColumnInfo colInfo1 = (ColumnInfo) colMap1.get(colName);
ColumnInfo colInfo2 = (ColumnInfo) colMap2.get(colName);
// 对比类型
if (!colInfo1.getColType()
.equals(colInfo2.getColType())) {
System.out.println(tableName + "." + colName + "的类型不相同:"
+ colInfo1.getColType() + " 和 "
+ colInfo2.getColType());
}
// 对比长度
if (colInfo1.getColLength() != colInfo2.getColLength()) {
System.out.println(tableName + "." + colName + "的长度不相同:"
+ colInfo1.getColLength() + " 和 "
+ colInfo2.getColLength());
}
// 对比小数点长度
if (colInfo1.getColScale() != colInfo2.getColScale()) {
System.out.println(tableName + "." + colName + "的小数点长度不相同:"
+ colInfo1.getColScale() + " 和 "
+ colInfo2.getColScale());
}
// 对比列的位置
if (colInfo1.getColNo() != colInfo2.getColNo()) {
System.out.println(tableName + "." + colName + "的位置不相同:"
+ colInfo1.getColNo() + " 和 "
+ colInfo2.getColNo());
}
// 对比是否允许为空
if (!colInfo1.getIsAllowNull().equals(
colInfo2.getIsAllowNull())) {
System.out.println(tableName + "." + colName + "的是否允许为空不相同:"
+ colInfo1.getIsAllowNull() + " 和 "
+ colInfo2.getIsAllowNull());
}
}
}
if (!"".equals(addCols)) {
System.out.println(this.dbName1 + "数据库中" + tableName
+ "表多出的列:" + addCols.substring(1));
}
String missCols = ""; // 缺少的列
Set colSet2 = colMap2.keySet();
Iterator colIter2 = colSet2.iterator();
while (colIter2.hasNext()) {
String colName = (String) colIter2.next();
if (colMap1.get(colName) == null) {
missCols += "," + missCols;
}
}
if (!"".equals(missCols)) {
System.out.println(this.dbName1 + "数据库中" + tableName
+ "表缺少的列:" + missCols.substring(1));
}
}
}
if (!"".equals(addTables)) {
System.out.println(this.dbName1 + "数据库多出的表:"
+ addTables.substring(1));
}
String missTables = ""; // 缺少的表
Set tableSet2 = map2.keySet();
Iterator iter2 = tableSet2.iterator();
while (iter2.hasNext()) {
String tableName = (String) iter2.next();
if (map1.get(tableName) == null) {
missTables += "," + tableName;
}
}
if (!"".equals(missTables)) {
System.out.println(this.dbName1 + "数据库缺少的表:"
+ missTables.substring(1));
}
}
/**
* @param args
*/
public static void main(String[] args) {
ShowDBDifferences util = new ShowDBDifferences();
util.setClassName("COM.ibm.db2.jdbc.app.DB2Driver");
util.setDbName1("PFMS");
util.setDbUrl1("jdbc:db2:PFMS"); // 空库
util.setUserName1("db2admin");
util.setPassword1("db2admin");
util.setDbName2("PFMS_ZS");
util.setDbUrl2("jdbc:db2:PFMS_ZS"); // 正式库
util.setUserName2("db2admin");
util.setPassword2("db2admin");
util.diff("GZTF");
}
}
class ColumnInfo {
private String tableName; // 表名
private String colName; // 列名
private String colType; // 类型
private int colLength; // 长度
private int colScale; // 小数点位数
private int colNo; // 列的位置顺序, 从 0 开始
private String isAllowNull; // 是否允许为空, Y or N
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public String getColName() {
return colName;
}
public void setColName(String colName) {
this.colName = colName;
}
public String getColType() {
return colType;
}
public void setColType(String colType) {
this.colType = colType;
}
public int getColLength() {
return colLength;
}
public void setColLength(int colLength) {
this.colLength = colLength;
}
public int getColScale() {
return colScale;
}
public void setColScale(int colScale) {
this.colScale = colScale;
}
public int getColNo() {
return colNo;
}
public void setColNo(int colNo) {
this.colNo = colNo;
}
public String getIsAllowNull() {
return isAllowNull;
}
public void setIsAllowNull(String isAllowNull) {
this.isAllowNull = isAllowNull;
}
public String toString() {
return this.colName + "," + this.colType + "," + this.colLength + ","
+ this.colScale + "," + this.colNo + "," + this.isAllowNull;
}
}
分享到:
相关推荐
在IT行业中,尤其是在数据库管理与维护领域,比较两个数据库之间的差异是一项非常重要的任务。这不仅有助于确保不同环境(如开发环境与生产环境)之间数据库结构的一致性,还能帮助开发者及时发现并解决潜在的问题。...
SQL比对工具就是为此目的而设计的专业软件,它们能够帮助开发者和DBA快速、准确地识别并解决两个数据库之间的差异。本文将深入探讨SQL比对工具的功能、用途、工作原理以及如何有效地利用这些工具来优化数据库管理。 ...
本文将深入探讨如何使用特定的工具来比较和同步两个数据库之间的差异。 首先,我们要理解数据库间的差异可能源自多种原因,如更新的数据、结构修改(表、索引、视图等)、存储过程或触发器的变化。这些差异可能导致...
SQL Compare是编程人员常用的比较两个数据库之间差异的工具。可以用来比较数据库里面的对象。比如存储过程,数据库中的数据,表的结构。 下面我就简单介绍一下如何使用 1、选择要比较的数据库,点“Compare Now”...
在实际应用中,我们常常需要比较两个数据库之间的差异,以便了解数据迁移、同步或更新后的情况。本文将深入探讨如何对比两个数据库的表差异、字段差异,并关注表名、字段名、字段属性、字段长度以及是否允许空值等...
有时候,我们可能需要对比两个数据库的表结构差异,比如在升级系统、迁移数据或进行数据库同步时。本篇将深入探讨如何自动对比两个数据库表结构的差异,并提供一个名为`compareTableStructure`的实用工具来辅助这一...
校验两个数据库表差异,并生成修改语句(BATE版,可能有BUG)校验两个数据库表差异,并生成修改语句(BATE版,可能有BUG)校验两个数据库表差异,并生成修改语句(BATE版,可能有BUG)校验两个数据库表差异,并生成修改语句(BATE...
一个简单JAVA 小工程进行两个MYSQL数据库对象的比较,导入eclipse中,修改jdbc.properties文件中的JDBC信息,然后直接运行action包类中的main方法,生成EXCEL,excel中包含表,表中列,索引,函数过程差异比对结果。...
没有找到合适的工具,于是作此程序,对比两个数据库的表、字段及索引差异,转换为对应的SQL语句,执行到生产环境中去。 【支持的操作】 表:增、删、改 字段:增、删、改 索引:增、删、改 【注意】 程序无法判断...
一个简单JAVA 小工程进行两个MYSQL数据库对象的比较,导入eclipse中,修改jdbc.properties文件中的JDBC信息,然后直接运行action包类中的main方法,生成EXCEL,excel中包含表,表中列,索引,函数过程差异比对结果。...
表结构比较的目标是找出两个数据库之间的差异,这可能涉及到表的增删改,或者字段属性的变更,如字段类型、长度、是否允许空值等。 描述中提到的“第一个数据库中有而第二个没有”,这可能意味着在一个数据库中存在...
一个简单JAVA 小工程进行两个MYSQL数据库对象的比较,导入eclipse中,修改jdbc.properties文件中的JDBC信息,然后直接运行action类中的main方法,生成EXCEL,excel中包含表,表中列,索引,函数过程差异比对结果。...
然后拿目标数据库与标准数据库比较,如果目标数 据库少 了表,或少了字段,或字段类型长度不一样,或索引 不一样, 或存储过程,视图,触发器,默认值等不一样,就产生 相应的S QL语句! 二.操作方法: 先把源数据库的连接...
3. 开发与测试环境同步:在软件开发中,compdbf可以帮助开发者快速定位开发环境与测试环境之间的数据库差异,确保测试的有效性。 五、注意事项 - 在使用compdbf时,确保比较的两个dbf文件是关闭状态,以避免数据...
在项目做好后实施了以后,可能因为需求等原因需要升级, 这时候一般都是在测试系统改好后在更新到正式系统. ...改程序可以对比两个数据库下所有表的表结构的不同.并显示 同时也有源程序 改代码已支持sql2008
数据库表差异比较程序是一种用于分析和识别两个数据库之间表结构和数据差异的工具。这个程序在IT领域中具有广泛的应用,特别是在数据库管理、数据分析、软件升级和数据迁移等场景下。下面将详细介绍这个主题。 首先...
两个MySQL数据库之间同步表结构及索引模式
比较两个数据库的表结构差异,主要关注的是列的数量、类型、约束(如主键、外键、唯一性约束等)以及索引的区别。DBCompare.exe可能是一个用于执行此类比较的工具,它能帮助用户识别两个数据库实例中的表结构差异,...