一直用的系统是 Oracle的数据库,现在一个客户比较小,不想投入钱购买数据库软件,所以只能使用Mysql,需要将框架中的一些表结构、记录从Oracle导入到Mysql中去。网上没找到好用的软件,所以决定自己弄一个小程序实现异构库备份:
思路比较简单, 先生成建表语句并在mysql库中执行,在生成insert语句在mysql中执行。
一:生成建表语句重点是需要获取表的字段,默认值,是否为空, 字段类型、字段长度等, 万幸的是这些jdbc都有实现,通过Connect获取数据库的DatabaseMetaData--dmd,
System.out.println("加载Oracle链接0...");
connect = connect(0);
System.out.println("加载Mysql链接1...");
insertConnect = connect(1);
System.out.println("获取dmd...");
dmd = connect.getMetaData();
ResultSet colrs = dmd.getColumns("%", dmd.getUserName(),table.toUpperCase(), "%");
然后解析获取到的ResultSet信息后即可获取到字段的全部信息,生成建表语句:
二:取生成insert语句类似,需要适用select语句查询表的信息,然后循环解析每一行的记录,生成insert插入,此处执行sql的是PreparedStatement,可以循环适用insert语句,仅需要改变每一次动态设置的值属性即可。
全部代码比较简单,直接上代码:
有两个类:jdbc工具类:JDBCUtil.java
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class JDBCUtil {
public static Connection connect(int type) {
Connection conn;
if (type == 0) {//oracle
conn = connectOracle();
} else {//Mysql
conn = connectMysql();
}
return conn;
}
/**
* 连接Oracle
*
* @return
*/
public static Connection connectMysql() {
// 连接MySql数据库,用户名和密码
String username = "111212";
String password = "2121";
String url = "jdbc:mysql://192.168.1.1/training?user=" + username+ "&password=" + password + "";
Connection conn = null;
try {
// 加载MySql的驱动类
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url);
} catch (ClassNotFoundException e) {
System.out.println("找不到驱动程序类 ,加载驱动失败!");
e.printStackTrace();
} catch (SQLException se) {
System.out.println("数据库连接失败!");
se.printStackTrace();
}
return conn;
}
/**
* 连接Oracle
*
* @return
*/
public static Connection connectOracle() {
String url = "jdbc:oracle:thin:@192.168.1.1:1521:orcl";
// 连接MySql数据库,用户名和密码都是root
String username = "abcaf";
String password = "syjgagagac";
Connection conn = null;
try {
// 加载MySql的驱动类
Class.forName("oracle.jdbc.OracleDriver");
conn = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
System.out.println("找不到驱动程序类 ,加载驱动失败!");
e.printStackTrace();
} catch (SQLException se) {
System.out.println("数据库连接失败!");
se.printStackTrace();
}
return conn;
}
public static List getColumnNames(ResultSetMetaData meta) throws SQLException{
List list = new ArrayList();
for (int i = 1; i <= meta.getColumnCount(); i++) {
list.add(meta.getColumnName(i));
}
return list;
}
// ResultSetMetaData 使用示例
// 此方法参考 http://blog.csdn.net/yirentianran/article/details/2950321
public static void demoResultSetMetaData(ResultSetMetaData data)
throws SQLException {
for (int i = 1; i <= data.getColumnCount(); i++) {
// 获得所有列的数目及实际列数
int columnCount = data.getColumnCount();
// 获得指定列的列名
String columnName = data.getColumnName(i);
// 获得指定列的列值
// String columnValue = rs.getString(i);
// 获得指定列的数据类型
int columnType = data.getColumnType(i);
// 获得指定列的数据类型名
String columnTypeName = data.getColumnTypeName(i);
// 所在的Catalog名字
String catalogName = data.getCa