浏览 1280 次
锁定老帖子 主题:java 倒表数据
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-06-11
最后修改:2010-06-17
前段时间闲着,写了写倒表的程序。本来想写个带界面的,不过java GUI真的不咋会,用web写的界面也不咋地, 就没界面了,工程里面只是最基本的功能,从Oracle倒到MySql我测试过没问题。 下面把最基本的类贴出来: /** * 倒数据,把数据从一个数据表导入另一个数据表 * @param conn 源数据库链接 * @param conn2 目的数据库链接 * @param tablename1 源数据库表 * @param tablename2 目的数据库表 */ @SuppressWarnings("unchecked") public static void dataTranslates(Connection conn,Connection conn2, String tablename1,String tablename2) throws Exception { Statement stmt = DataConnect.getStmt(conn); /** 取得当前连接数据库指定表的字段信息。 tableName 表名称 map结构-- key--表名 value--列名:列类型 */ Map<String, String[]> frommap = getFieldList(conn,tablename1); //字段名:字段类型 String[] str = null; for(String key : frommap.keySet()){ str = frommap.get(key); } String[] fcolumn = new String[str.length]; String[] fcolumntype = new String[str.length]; for(int i = 0; i < str.length; i++) { fcolumn[i] = str[i].split(":")[0]; //getType:得到int对应的Types类型 String type = GetTypes.getType(Integer.parseInt(str[i].split(":")[1])); fcolumntype[i] = type.equals("Int")?"Integer":type; } //得到数据结果集 ResultSet rs = stmt.executeQuery(spliceFromSql(fcolumn,tablename1)); //拼接insert String isql = spliceToSql(fcolumn,tablename2); PreparedStatement pstmt = DataConnect.getPStme(conn2, isql); Class clazz = rs.getClass(); Class clazz2 = pstmt.getClass(); String[] mothods = getMethodName(fcolumntype); //gets方法用于取值 Method[] gets = new Method[mothods.length]; //sets方法用于设值 Method[] sets = new Method[mothods.length]; for(int i = 0; i < mothods.length; i++) { gets[i] = clazz.getDeclaredMethod(mothods[i].split(":")[0], int.class); if(fcolumntype[i].equals("Integer")) { sets[i] = clazz2.getDeclaredMethod(mothods[i].split(":")[1], int.class,int.class); } else { sets[i] = clazz2.getDeclaredMethod(mothods[i].split(":")[1], int.class, Class.forName("java.lang."+fcolumntype[i])); } } int count = 0; while(rs.next()) { //循环调用PreparedStatement的设值和ResultSet的取值方法 for(int i = 0; i < gets.length; i++) { if(fcolumntype[i].equals("Integer")) { sets[i].invoke(pstmt, i + 1, Integer.parseInt((gets[i].invoke(rs, i+1)==null?"0":gets[i].invoke(rs, i+1)).toString())); } else { sets[i].invoke(pstmt, i + 1, (gets[i].invoke(rs, i+1)==null?"":gets[i].invoke(rs, i+1)).toString()); } } count++; pstmt.addBatch(); if(count%200==0) { pstmt.executeBatch(); System.out.println("导入" + count + "条数据"); } } //数据提交 pstmt.executeBatch(); } gets[i] = clazz.getDeclaredMethod(mothods[i].split(":")[0], int.class);//按索引取值 oracle.jdbc.driver.OracleResultSetImpl中好像没有实现java.sql.ResultSet中的 String getString(String columnLabel)方法,所以只能按索引取值,不能按字段名取值。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |