java 倒表数据

前段时间闲着,写了写倒表的程序。本来想写个带界面的,不过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)方法,所以只能按索引取值,不能按字段名取值。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值