`
namezhou
  • 浏览: 158598 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java比较两个数据库中所有表的区别【支持Oracle和SQLServer】

 
阅读更多

开发过程中一般是一开发数据库 一生产数据库。

有时候在开发数据库中加了数据库字段之后忘记在生产数据库加字段。

写了工具类,用于比较两个数据库的区别。类似工具Navicat也有这样的功能。

支持自动组装Alter语句追加字段。

Oracle版本:

package dbcom;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Oracle 数据库比较
 * @author Eric zhou
 * @since 2013-2-28
 */
public class OracleComparator {
	public static String url1 = "jdbc:oracle:thin:@localhost:1521:SIP";
	public static String url2 = "jdbc:oracle:thin:@localhost:1521:SIP";
	public static String USERNAME = "admin";
	public static String PASSWORD = "root";
	public static boolean auto_syn = true;//自动同步表结构,true 时启用
	public static void main(String[] args) throws Exception{
		OracleComparator com = new OracleComparator();
		Connection con1 = com.getConnection(url1,USERNAME,PASSWORD);
		Connection con2 = com.getConnection(url2,USERNAME,PASSWORD);
		System.out.println("已连接到两个数据库...将以数据库1为主数据库进行比较");
		String sql = "select TABLE_NAME from USER_TABLES";
		List list1 = com.Rs2List(com.getRsBySQL(sql, con1));
		List list2 = com.Rs2List(com.getRsBySQL(sql, con2));
		com.compare(list1, list2,con1,con2);
		System.out.println("比较完成....");
	}
	private void compare(List list1,List list2,Connection con1,Connection con2) throws Exception {
		for (Iterator iterator = list1.iterator(); iterator.hasNext();) {
			String name = (String) iterator.next();
			if(list2.contains(name)){
				this.TableCompare(name, con1, con2);
			}else{
				if(name.indexOf("$")==-1){
					System.out.println("数据库2中,缺少表:"+name);
					if(auto_syn){
						System.out.print("----------------自动创建表"+name+"...");
						System.out.println(createTable(name,con1,con2));
					}
				}
			}
		}
	}
	private void TableCompare(String name,Connection con1,Connection con2) throws Exception {
		String sql = "select COLUMN_NAME,DATA_TYPE from USER_TAB_COLUMNS where TABLE_NAME='"+name+"' ";
		Map<String,String> map1 = this.parseColumnList(this.getRsBySQL(sql, con1));
		Map<String,String> map2 = this.parseColumnList(this.getRsBySQL(sql, con2));
		Set set = map1.keySet();
		for (Iterator iterator = set.iterator(); iterator.hasNext();) {
			String cname = (String) iterator.next();
			if(map2.containsKey(cname)){
				if(!map2.get(cname).equals(map1.get(cname))){
					System.out.println("数据库2的 "+name+" 表中的字段:"+cname+" 与数据库1中数据类型不一致");
					if(auto_syn){
						System.out.println("----------------此项目请手动修改!");
					}
				}
			}else{
				System.out.println("数据库2的 "+name+" 表中,缺少字段:"+cname);
				if(auto_syn){
					System.out.print("----------------自动添加字段"+cname+"...");
					System.out.println(appendColumn(name,cname,con1,con2));
				}
			}
		}
	}
	private Map parseColumnList(ResultSet rs1) throws Exception {
		Map map = new HashMap();
		while(rs1.next()){
			map.put(rs1.getString("COLUMN_NAME"), rs1.getString("DATA_TYPE"));
		}
		return map;
	}
	private List Rs2List(ResultSet rs1)throws Exception{
		List list = new ArrayList();
		while(rs1.next()){
			list.add(rs1.getString("TABLE_NAME"));
		}
		return list;
	}
	private ResultSet getRsBySQL(String sql,Connection con1)throws Exception{
		Statement stmt = con1.createStatement();
		return stmt.executeQuery(sql);
	}
	
	public static String DRIVER = "oracle.jdbc.driver.OracleDriver";
	static {
		try {
			Class.forName(DRIVER).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	private Connection getConnection(String url,String username,String password){
		try {
			return DriverManager.getConnection(url,username,password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	private String createTable(String name,Connection con1,Connection con2){
		try {
			String sql = "select dbms_metadata.get_ddl('TABLE','"+name+"') as XQL from dual";
			Statement stmt = con1.createStatement();
			ResultSet rs  = stmt.executeQuery(sql);
			if(rs.next()){
				String ddl = rs.getString("XQL");
				Statement stmt2 = con2.createStatement();
				stmt2.execute(ddl);
				return "success";
			}else{
				return "fail";
			}
		} catch (SQLException e) {
			return "fail";
		}
	}
	private String appendColumn(String name,String colname,Connection con1,Connection con2){
		try {
			String sql = "select DATA_TYPE,DATA_LENGTH from USER_TAB_COLUMNS where TABLE_NAME='"+name+"' and COLUMN_NAME='"+colname+"'";
			Statement stmt = con1.createStatement();
			ResultSet rs = stmt.executeQuery(sql);
			if(rs.next()){
				String type = rs.getString("DATA_TYPE");
				BigDecimal b = rs.getBigDecimal("DATA_LENGTH");
				String sql2 = null;
				if(type.contains("CLOB")){
					sql2 = "alter table "+name+" add ( \""+colname+"\" "+type+"  NULL )";
				}else{
					sql2 = "alter table "+name+" add ( \""+colname+"\" "+type+"("+b.intValue()+") NULL )";
				}
				Statement stmt2 = con2.createStatement();
				stmt2.execute(sql2);
				return "success";
			}else{
				return "fail";
			}
		} catch (SQLException e) {
			e.printStackTrace();
			return "fail";
		}
	}
}

 SQLServer版本

 

package dbcom;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * SQL Server 数据库区别比较
 * @author Eric zhou
 * @since 2013-2-28
 */
public class SqlServerComparator {
	public static String url1 = "jdbc:sqlserver://localhost:1433;DatabaseName=xx1";
	public static String url2 = "jdbc:sqlserver://localhost:1433;DatabaseName=xx1";
	public static String USERNAME = "sa";
	public static String PASSWORD = "123";
	
	public static void main(String[] args) throws Exception{
		SqlServerComparator com = new SqlServerComparator();
		Connection con1 = com.getConnection(url1,USERNAME,PASSWORD);
		Connection con2 = com.getConnection(url2,USERNAME,PASSWORD);
		System.out.println("已连接到两个数据库...将以数据库1为主数据库进行比较");
		String sql = "select name from sys.all_objects where type_desc='USER_TABLE'";
		List list1 = com.Rs2List(com.getRsBySQL(sql, con1));
		List list2 = com.Rs2List(com.getRsBySQL(sql, con2));
		com.compare(list1, list2,con1,con2);
		System.out.println("比较完成....");
	}
	private void compare(List list1,List list2,Connection con1,Connection con2) throws Exception {
		for (Iterator iterator = list1.iterator(); iterator.hasNext();) {
			String name = (String) iterator.next();
			if(list2.contains(name)){
				this.TableCompare(name, con1, con2);
			}else{
				System.out.println("数据库2中,缺少表:"+name);
			}
		}
	}
	private void TableCompare(String name,Connection con1,Connection con2) throws Exception {
		String sql = "select c.name,c.system_type_id from sys.all_columns c left join  sys.all_objects o on c.object_id=o.object_id where o.name='"+name+"' ";
		Map<String,Integer> map1 = this.parseColumnList(this.getRsBySQL(sql, con1));
		Map<String,Integer> map2 = this.parseColumnList(this.getRsBySQL(sql, con2));
		Set set = map1.keySet();
		for (Iterator iterator = set.iterator(); iterator.hasNext();) {
			String cname = (String) iterator.next();
			if(map2.containsKey(cname)){
				if(map2.get(cname).intValue()!=map1.get(cname).intValue()){
					System.out.println("数据库2的 "+name+" 表中的字段:"+cname+" 与数据库1中数据类型不一致");
				}
			}else{
				System.out.println("数据库2的 "+name+" 表中,缺少字段:"+cname);
			}
		}
	}
	private Map parseColumnList(ResultSet rs1) throws Exception {
		Map map = new HashMap();
		while(rs1.next()){
			map.put(rs1.getString("name"), rs1.getInt("system_type_id"));
		}
		return map;
	}
	private List Rs2List(ResultSet rs1)throws Exception{
		List list = new ArrayList();
		while(rs1.next()){
			list.add(rs1.getString("name"));
		}
		return list;
	}
	private ResultSet getRsBySQL(String sql,Connection con1)throws Exception{
		Statement stmt = con1.createStatement();
		return stmt.executeQuery(sql);
	}
	
	public static String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
	static {
		try {
			Class.forName(DRIVER).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	private Connection getConnection(String url,String username,String password){
		try {
			return DriverManager.getConnection(url,username,password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
}

 

1
0
分享到:
评论

相关推荐

    java jsp sqlserver数据表转移到oracle实例 源代码

    标题中的“java jsp sqlserver数据表转移到oracle实例 源代码”表明这是一个关于使用Java和JSP技术,将SQL Server数据库中的数据表迁移至Oracle数据库的实际操作案例。这个过程通常涉及数据迁移、数据转换以及可能的...

    Oracle和SqlServer数据库获取数据库和表例子(免oracle客户端)

    在IT领域,数据库管理系统是核心组成部分,Oracle和SQL Server是两个广泛应用的关系型数据库系统。本文将探讨如何在没有安装客户端的情况下,从Oracle和SQL Server中获取数据库和表的信息。 首先,我们关注Oracle...

    SQLSERVER到ORACLE的数据库迁移

    我们首先定义了两种数据库之间的数据类型映射规则,然后展示了如何在目标Oracle数据库中创建相应的表结构,并最后编写了一个完整的Java程序来实现数据的实际迁移。这种方式不仅适用于“中华人民共和国行政区划代码”...

    java数据库驱动 oracle mysql sqlserver oracle pointbase

    Java数据库驱动(JDBC,Java Database Connectivity)是Java平台中用于与各种数据库进行交互的一组接口和类。在Java程序中,我们通过JDBC API来连接、查询和操作数据库。本压缩包包含了针对四个不同数据库系统的驱动...

    连接mysql sqlserver的两个数据库

    首先,我们来看标题提到的“连接mysql sqlserver的两个数据库”。这通常涉及到数据库之间的数据迁移、同步或者跨平台查询。为了实现这一目标,我们需要借助特定的驱动程序和工具。 在提供的压缩包文件中,有两个...

    常用数据库的jar集合,包含mysql,oracle,sqlserver,Access等数据库

    对应的JDBC驱动jar文件(如`mssql-jdbc.jar`)需添加到项目中,以支持Java程序与SQL Server的通信。配置过程与MySQL类似,但可能需要设置额外的URL参数来指定数据库版本和实例。 4. **Access**:Access是Microsoft ...

    mysql,oracle,sqlserver数据库jdbc驱动jar包

    Java Database Connectivity (JDBC) 是Java平台的标准接口,允许Java应用程序连接到各种类型的数据库,包括MySQL、Oracle和SQL Server。这些数据库的JDBC驱动jar包是连接Java应用与数据库的关键组件。 首先,我们来...

    SQL Server导入Oracle数据库

    首先,理解SQL Server和Oracle是两种不同的关系型数据库管理系统(RDBMS)。SQL Server由微软开发,而Oracle则由甲骨文公司提供。它们都有各自的数据存储格式和查询语言,因此在两者之间转移数据需要适当的转换和...

    oracle,sql server驱动包

    这两个数据库系统各有其特性和优势,但为了在Java环境下与它们进行交互,我们需要对应的数据库驱动包。这里提到的"oracle,sql server驱动包ojdbc14..."就是指用于连接Oracle和SQL Server数据库的Java驱动程序。 ...

    java jdbc oracle informix sqlserver mysql

    Java JDBC (Java Database Connectivity) 是Java编程语言中用于与各种数据库进行交互的一组接口和类。...每个数据库都有其特定的JDBC驱动,需要正确地配置和使用,以便在Java应用中实现高效的数据操作。

    java数据库驱动 oracle,sqlserver,mysql

    Microsoft为SQL Server提供了两个JDBC驱动:JDBC Type 4 Driver(com.microsoft.sqlserver.jdbc.SQLServerDriver)和JDBC Type 2 Driver(sun.jdbc.odbc.JdbcOdbcDriver,已被废弃)。Type 4驱动是完全Java实现,...

    JDBC连接oracle和Sql server的的测试

    在IT行业中,数据库是数据存储和管理的核心,而Java JDBC(Java Database Connectivity)则是Java语言与各种数据库进行交互的标准接口。本篇文章将深入探讨如何使用JDBC连接Oracle和SQL Server这两种广泛使用的...

    自动对比2个数据库表结构差异

    有时候,我们可能需要对比两个数据库的表结构差异,比如在升级系统、迁移数据或进行数据库同步时。本篇将深入探讨如何自动对比两个数据库表结构的差异,并提供一个名为`compareTableStructure`的实用工具来辅助这一...

    java连接oracle和sqlserver的驱动jar包

    在Java中,为了连接这两个数据库,我们需要特定的驱动程序,即JDBC驱动。 1. **Oracle驱动**: Oracle提供了多种版本的JDBC驱动,主要分为以下几种类型: - **JDBC Thin Driver**(ojdbc.jar):轻量级、纯Java...

    Java连接SQLServer和Oracle数据库.zip

    本资料主要探讨了如何使用Java来连接并操作这两个数据库。 首先,我们来看Java与SQLServer的连接。Java通过JDBC(Java Database Connectivity)API来实现数据库连接。JDBC提供了一组接口和类,使得Java程序可以与...

    Oracle和SQLServer数据库连接Jar包

    这两个jar包包含了Oracle JDBC Driver的所有必要类和接口,允许Java应用执行SQL查询,事务管理,以及其他数据库操作。 2. **SQLServer数据库连接Jar包**: - `sqljdbc4.jar` 和 `sqljdbc.jar` 是Microsoft SQL ...

    jdbc连接数据库(oracle、sqlserver)代码

    在IT行业中,数据库是数据存储和管理的核心,而Java Database Connectivity (JDBC) 是Java编程语言与各种数据库交互的一种标准接口。本知识点主要讲解如何使用JDBC连接Oracle和SQL Server这两种常见的关系型数据库。...

    JAVA 定时器及SqlServer和Oracle封装链接数据库.docx

    - **数据库支持**:支持SQL Server和Oracle两种数据库类型。 - **增删改查操作**:提供封装好的类库(JAR),简化数据库操作过程。 **3.3 数据库操作示例** - **创建测试表**:在数据库中创建一张用于测试的表。 - ...

    数据库通信Oracle和Sql serverDACv690053FS

    标题中的“数据库通信Oracle和Sql serverDACv690053FS”指的是一个与数据库通信相关的软件组件或库,特别提到了Oracle和SQL Server两种不同的数据库系统,并且可能使用了名为DAC(Data Access Components)的技术,...

    mysql,oracle,sql server常用数据库驱动架包

    总的来说,`mysql-connector-java.jar`、`ojdbc.jar`/`oci.jar`和`mssql-jdbc.jar`分别是MySQL、Oracle和SQL Server数据库的Java驱动,它们使得Java开发者能够利用JDBC API高效地与这些数据库进行交互。正确配置和...

Global site tag (gtag.js) - Google Analytics