import java.sql.*;
import java.util.*;
public class TableStructureComparator2 {
private static final String JDBC_URL = "jdbc:mysql://localhost:3306/yourDatabase";
private static final String USER = "yourUsername";
private static final String PASSWORD = "yourPassword";
public static void main(String[] args) {
try (Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD)) {
compareTableStructures(conn, "table1", "table2");
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void compareTableStructures(Connection conn, String table1, String table2) throws SQLException {
// 获取第一个表的元数据
ResultSet rs1 = getTableMetadata(conn, table1);
// 获取第二个表的元数据
ResultSet rs2 = getTableMetadata(conn, table2);
// 存储第一个表的列信息
ColumnInfo firstTableColumns = new ColumnInfo();
while (rs1.next()) {
firstTableColumns.addColumn(rs1);
}
// 存储第二个表的列信息
ColumnInfo secondTableColumns = new ColumnInfo();
while (rs2.next()) {
secondTableColumns.addColumn(rs2);
}
// 比较第二个表的列信息
for (ColumnInfo.Column c2 : secondTableColumns.getColumns()) {
ColumnInfo.Column c1 = firstTableColumns.getColumn(c2.columnName);
if (c1 == null) {
System.out.println("Column not found in the first table: " + c2.columnName);
} else if (c1.dataType != c2.dataType || c1.columnSize != c2.columnSize) {
System.out.println("Column '" + c2.columnName + "' differs:");
System.out.println(" - Type: " + c1.dataTypeName + " vs " + c2.dataTypeName);
System.out.println(" - Size: " + c1.columnSize + " vs " + c2.columnSize);
}
}
// 检查是否有第一张表中存在而第二张表中不存在的列
for (ColumnInfo.Column c1 : firstTableColumns.getColumns()) {
if (secondTableColumns.getColumn(c1.columnName) == null) {
System.out.println("Column not found in the second table: " + c1.columnName);
}
}
rs1.close();
rs2.close();
}
private static ResultSet getTableMetadata(Connection conn, String tableName) throws SQLException {
DatabaseMetaData metaData = conn.getMetaData();
ResultSet columns = metaData.getColumns(null, null, tableName, null);
return columns;
}
static class ColumnInfo {
private List<Column> columns = new ArrayList<>();
public void addColumn(ResultSet rs) throws SQLException {
String columnName = rs.getString("COLUMN_NAME");
int dataType = rs.getInt("DATA_TYPE");
String dataTypeName = rs.getString("TYPE_NAME");
int columnSize = rs.getInt("COLUMN_SIZE");
columns.add(new Column(columnName, dataType, dataTypeName, columnSize));
}
public Column getColumn(String columnName) {
for (Column c : columns) {
if (c.columnName.equals(columnName)) {
return c;
}
}
return null;
}
public List<Column> getColumns() {
return columns;
}
public static class Column {
String columnName;
int dataType;
String dataTypeName;
int columnSize;
public Column(String columnName, int dataType, String dataTypeName, int columnSize) {
this.columnName = columnName;
this.dataType = dataType;
this.dataTypeName = dataTypeName;
this.columnSize = columnSize;
}
}
}
}