论坛首页 Java企业应用论坛

java 倒表数据

浏览 1280 次
精华帖 (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)方法,所以只能按索引取值,不能按字段名取值。

 

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics