deregisterDriver原来的jdbc driver,再通过配置文件或其他得到接下来用什么driver再用registerDriver装入新的。
解决方案 »
- toString和 强转(String)的区别?
- applet中怎么导入其他包?
- 发布一个实用的类
- 在线等(急问) : 如何在我的程序中实现 服务器端向客户端返回 数据
- 【Eclipse 导出 jar 的问题! 解决就给分】
- 对java基础问题的疑问,关于this的
- JBuilder7很浅的问题,相信大家一看就知!
- 请教java的考题,请帮忙解答,谢谢!!
- 我用javac编译HelloWorldapp.java无错误,但运行时出现该错误:Exception in thread "main" java.lang.NoClassDefFoundError: helloworldapp
- 中国队赢球,特来送分给java的各位兄弟!!!(只限前10名)
- 请问哪个流的效率最高?
- 在JAVA中如何执行一个应用程序?
分别打开两个不同数据库的连接没有问题,
问题是判定字段类型,再对各个字段重新赋值很复杂(涉及道insert语句的写法)
所以问是否直接传递结果集的方式来实现记录的复制。
Connection sourceConn = sourceDb.getJdbcConnection();
Connection destinationConn = destinationDb.getJdbcConnection();
ResultSet sourceRs = sourceConn.createStatement().executeQuery(trans.getQuery());
ResultSetMetaData sourceRsMeta = sourceRs.getMetaData();
ResultSetMetaData destinationRsMeta = destinationConn.createStatement().executeQuery("SELECT * FROM \"" + trans.destinationTab + "\" WHERE 1 = 2").getMetaData();
String insertSQL = "INSERT INTO \"" + trans.destinationTab + "\" VALUES(";
int sourceColCount = sourceRsMeta.getColumnCount();
int destColCount = destinationRsMeta.getColumnCount();
if(sourceColCount != destColCount) {
throw new SQLException("源表的字段数与目标表中的字段数不相等。");
}
for (int i = 0;i < destColCount;i++) {
if(i == 0) {
insertSQL += "?";
continue;
}
insertSQL += ",?";
}
insertSQL += ")"; // create prepared statement
PreparedStatement pStmt = destinationConn.prepareStatement(insertSQL);
while(sourceRs.next()) {
for(int i = 0; i < sourceColCount;i++) {
int sourceDataType = sourceRsMeta.getColumnType(i + 1);
ResultSetMetaData destRsMeta = destinationConn.createStatement().executeQuery("SELECT * FROM \"" + trans.destinationTab + "\" WHERE 1 = 2").getMetaData();
int destDataType = destRsMeta.getColumnType(i + 1);
if(sourceRs.getObject(i + 1) == null) {
pStmt.setNull(i + 1,destDataType);
continue;
}
switch(sourceDataType) {
case java.sql.Types.ARRAY:
//Debugger.println("java.sql.Types.ARRAY");
throw new java.sql.SQLException("不支持ARRAY数据类型");
case java.sql.Types.BIGINT:
//Debugger.println("java.sql.Types.BIGINT");
pStmt.setObject(i + 1,new Long(sourceRs.getLong(i + 1)),destDataType);
break;
case java.sql.Types.BINARY:
//Debugger.println("java.sql.Types.BINARY");
throw new java.sql.SQLException("不支持BINARY数据类型");
case java.sql.Types.BIT:
//Debugger.println("java.sql.Types.BIT");
pStmt.setObject(i + 1,new Byte(sourceRs.getByte(i + 1)),destDataType);
break;
//throw new java.sql.SQLException("type BIT not supported");
case java.sql.Types.BLOB:
//Debugger.println("java.sql.Types.BLOB");
throw new java.sql.SQLException("不支持BLOB数据类型");
case java.sql.Types.CHAR:
//Debugger.println("java.sql.Types.CHAR");
pStmt.setObject(i + 1,sourceRs.getString(i + 1),destDataType);
break;
case java.sql.Types.CLOB:
//Debugger.println("java.sql.Types.CLOB");
throw new java.sql.SQLException("不支持CLOB数据类型");
case java.sql.Types.DATE:
//Debugger.println("java.sql.Types.DATE");
pStmt.setObject(i + 1,sourceRs.getDate(i + 1),destDataType);
break;
case java.sql.Types.DECIMAL:
//Debugger.println("java.sql.Types.DECIMAL");
pStmt.setObject(i + 1,new Float(sourceRs.getFloat(i + 1)),destDataType);
break;
case java.sql.Types.DISTINCT:
//Debugger.println("java.sql.Types.DISTINCT");
throw new java.sql.SQLException("不支持DISTINCT数据类型");
case java.sql.Types.DOUBLE:
//Debugger.println("java.sql.Types.DOUBLE");
pStmt.setObject(i + 1,new Double(sourceRs.getDouble(i + 1)),destDataType);
break;
case java.sql.Types.FLOAT:
//Debugger.println("java.sql.Types.FLOAT");
pStmt.setObject(i + 1,new Float(sourceRs.getFloat(i + 1)),destDataType);
break;
case java.sql.Types.INTEGER:
//Debugger.println("java.sql.Types.INTEGER");
pStmt.setObject(i + 1,new Integer(sourceRs.getInt(i + 1)),destDataType);
break;
case java.sql.Types.JAVA_OBJECT:
//Debugger.println("java.sql.Types.JAVA_OBJECT");
throw new java.sql.SQLException("不支持JAVA_OBJECT数据类型");
case java.sql.Types.LONGVARBINARY://image
if(destDataType != java.sql.Types.LONGVARBINARY) {
throw new java.sql.SQLException("源为image类型,目标不为image");
}
pStmt.setBytes(i + 1,sourceRs.getBytes(i + 1));
break;
case java.sql.Types.LONGVARCHAR://text
if(destDataType != java.sql.Types.LONGVARCHAR) {
throw new java.sql.SQLException("源为text类型,目标不为text");
}
pStmt.setBytes(i + 1,sourceRs.getBytes(i + 1));
break;
case java.sql.Types.NULL:
throw new java.sql.SQLException("不支持NULL数据类型");
case java.sql.Types.NUMERIC:
pStmt.setObject(i + 1,new Integer(sourceRs.getInt(i + 1)),destDataType);
break;
case java.sql.Types.OTHER:
throw new java.sql.SQLException("不支持OTHER数据类型");
case java.sql.Types.REAL:
pStmt.setObject(i + 1,sourceRs.getBigDecimal(i + 1),destDataType);
break;
case java.sql.Types.REF:
throw new java.sql.SQLException("不支持REF数据类型");
case java.sql.Types.SMALLINT:
pStmt.setObject(i + 1,new Integer(sourceRs.getInt(i + 1)),destDataType);
break;
case java.sql.Types.STRUCT:
throw new java.sql.SQLException("不支持STRUCT数据类型");
case java.sql.Types.TIME:
pStmt.setObject(i + 1,sourceRs.getTime(i + 1),destDataType);
break;
case java.sql.Types.TIMESTAMP:
pStmt.setObject(i + 1,sourceRs.getTimestamp(i + 1),destDataType);
break;
case java.sql.Types.TINYINT:
pStmt.setObject(i + 1,new Short(sourceRs.getShort(i + 1)),destDataType);
break;
case java.sql.Types.VARBINARY:
throw new java.sql.SQLException("不支持VARBINARY数据类型");
case java.sql.Types.VARCHAR:
pStmt.setObject(i + 1,sourceRs.getString(i + 1),destDataType);
break;
default:
break;
}
}
pStmt.executeUpdate();
}
注:在同一个jvm中只允许一个jdbcdriver存在,所以只能动态的来切换。如果你只是为了达到数据备份的目的,完全可以使用数据库本身的导入/导出工具。