`

Java实现异库多表多字段的同时导入导出

阅读更多

最近公司做的项目中要求把项目实施单位的原有系统中的表导入到我们公司现在的数据库中,原系统数据库与现数据库的表结构不太一样,只是把对应字段中的记录导入到现在数据库中,就写了这么一个小程序来辅助完成。

import java.sql.Connection;

/**
 * <p>Copyright: Copyright (c) 2009</p>
 * <p>Company: </p>
 * @author zfsn
 * @version 2009/11/28
 */
public class DBConvert {
	
	//原表数据库驱动及密码
	 String fdriverClassName = "net.sourceforge.jtds.jdbc.Driver";
	 String fjdbcurl = "jdbc:jtds:sqlserver://localhost:1433/OA1";
	 String fdbuser ="sa";
	 String fdbpassword ="";
	
	//目标表数据库驱动及代码
	 String tdriverClassName = "net.sourceforge.jtds.jdbc.Driver";
	 String tjdbcurl = "jdbc:jtds:sqlserver://localhost:1433/OA";
	 String tdbuser ="sa";
     String tdbpassword ="";
	
    //ftable原数据库表名,fcolumn原表对应字段
	//ttable目标数据库表名,tcolumn目标表对应字段
	//dir生成xml存放路径,xmlFile生成的xml名称
	String ftable[]={"jhbj_gov_acceptdocument","jhbj_gov_accepttype"};
	String ttable[]={"oaxietong_GSXX","oaxietong_GSLB"};
	String fcolumn[][]={{"acceptD_id","acceptD_bh","acceptD_zh","acceptD_bt","acceptD_bm","acceptD_sj","acceptD_ztc","acceptT_id"},{"acceptT_id","acceptT_name","acceptT_describe","Del_Flag"}};
	String tcolumn[][]={{"GWID","GWWH","GWRY","GWBT","GWZS","GWSJ","GWZY","GWLB"},{"LBID","LBMC","LBSM","LBBJ"}};
	String dir="c:/";
	String xmlFile[]={"jhbj_gov_acceptdocument.xml","jhbj_gov_accepttype.xml"};
     
	
	//生成的xml文件
	public void DBToXml(){
		
		MDBToXML dbToXml=new MDBToXML();
		try {
			Connection conn=dbToXml.getConn(fdriverClassName, fjdbcurl, fdbuser, fdbpassword);
			dbToXml.BuildXMLDoc(conn, ftable, dir);
		} catch (Exception e) {
			System.out.println("表导出失败,请与管理员联系");
			e.printStackTrace();
		}
		
	}
	
	//将xml的内容导入到目标表中
	public void XmlToDB(){
		MXMLToDB mXmlToDB=new MXMLToDB();
		
		try {
			Connection conn=mXmlToDB.getConn(tdriverClassName, tjdbcurl, tdbuser, tdbpassword);
			mXmlToDB.ParseXMl(conn, ftable, ttable, fcolumn, tcolumn, dir, xmlFile);
		} catch (Exception e) {
			System.out.println("表插入失败,请与管理员联系");
			e.printStackTrace();
		}
		
	}
	
	/*执行表导入之前一定要取消目标表的主键及标识(为否),并将目标表的外键关系取消
	执行结束后恢复主键、标识、外键关系
	导出表与导入表列数与类型必须一致
	导出表生成的xml以导出表对应的名字命名
	将被导入数据库表中对应字段的长度设为足够大,以便容纳下将要导入的数据*/
	public static void main(String[] args){
		
		DBConvert dbConvert=new DBConvert();
		
		//表导出
		dbConvert.DBToXml();
		
		//表导入
		dbConvert.XmlToDB();
		
	}
	
}

 

import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

/**
 * <p>Copyright: Copyright (c) 2009</p>
 * <p>Company: </p>
 * @author zfsn
 * @version 2009/11/28
 */
public class MDBToXML {
	
		 public void BuildXMLDoc(Connection conn,String tables[],String dir)throws Exception{
			       
					 for(int i=0;i<tables.length;i++){
						
						 //创建根节点以表的名字为根节点
						 Element rootElement = new Element("dbData");
						 //根节点添加到文档中
						  Document myDocument = new Document(rootElement);
						  //将表中的内容查处放到resultset
						ResultSet resultset= selectTable(conn,tables[i]);
						ResultSetMetaData rsmd=resultset.getMetaData();
						//获得表中所包含的列数
						int numCols = rsmd.getColumnCount();
						//System.out.println("db_to_xml:numCols:" + numCols);
						 //每个表都清零一次以便统计每个表有多少个元素
						  int j=1;
						while (resultset.next()) {
							//以表名为元素名,并且为每个元素设置number编号
								Element elements=new Element(tables[i]);
								elements.setAttribute("number",""+j++);
								//遍历每一列,并取得元素值
								for (int k=1; k <= numCols; k++) {
									String colval=resultset.getString(k);
									//如果没有元素设置为空字符串
									if(resultset.wasNull()){
										colval=" ";
									    }
									//将表中每一个字段的名和值添加到元素中
								     elements.addContent(new Element(rsmd.getColumnName(k)).setText("\'"+colval+"\'"));
							         }
							rootElement.addContent(elements);
						}
						 //将doc写到指定的xml中
						XMLOutputter XMLOut=new XMLOutputter(Format.getPrettyFormat());
						XMLOut.output(myDocument, new FileOutputStream(dir+tables[i]+".xml"));
					
				 }
System.out.println("数据库中的表导出成功!!导出位置为"+dir);					
		 }
	
		 public  Connection getConn(String fdriverClassName,String fjdbcurl,String fdbuser,String fdbpassword)throws Exception{
			 Class.forName(fdriverClassName);
			 Connection conn=DriverManager.getConnection(fjdbcurl,fdbuser,fdbpassword);
			 return conn;
		
		 }
		public  ResultSet selectTable(Connection conn,String tableName)throws Exception{
			Statement stat=conn.createStatement();
			String sql="select *from " +tableName;
			ResultSet rs=stat.executeQuery(sql);
			return rs;
		}
	
}

 

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

/**
 * <p>Copyright: Copyright (c) 2009</p>
 * <p>Company: </p>
 * @author zfsn
 * @version 2009/11/28
 */
public class MXMLToDB {
	 
	@SuppressWarnings("unchecked")
	public void ParseXMl(Connection conn,String ftable[],String ttable[],String fcolumn[][],String tcolumn[][],String dir,String xmlFile[]) throws Exception {
		
		//判断输入的原表跟目标表的长度和原表字段与目标表的字段是否一样长
		if(isEquals(ftable, ttable)==true)
		{
			for(int j=0;j<fcolumn.length;j++){
				if(fcolumn[j].length!=tcolumn[j].length){
					System.out.println("输入的原表跟目标表的长度不一样或者原表字段与目标表的字段不一样!");
					return;
				}
			}
		}else{
			System.out.println("输入的原表跟目标表的长度不一样或者原表字段与目标表的字段不一样!");
			return;
		}
		
		//删除原表中的内容
	for(int j=0;j<ttable.length;j++){
			String tableName=ttable[j];
			String sql="delete from "+ tableName;
			executeTable(conn,sql);
System.out.println("原表中的数据删除成!!!");			
		}
	
	SAXBuilder sb = new SAXBuilder();// 建立构造器
for(int xx=0;xx<xmlFile.length;xx++){
	Document doc = sb.build(new FileInputStream(dir+xmlFile[xx]));// 读入指定文件
	Element root = doc.getRootElement();// 获得根节点
	List list = root.getChildren();// 将根节点下的所有子节点放入List中	
		for (int i = 0; i < list.size(); i++) {
			Element item = (Element) list.get(i);// 获取节点实例
			//String tableName = item.getName();// 获得元素节点的值为表名
			//System.out.println("-----------" + tableName);
			// 获得所有的content一个[[Text:], [Element: <title/>], [Text:], [Element:
			// <content/>], [Text: ],
			// [Element: <email/>], [Text:]]
			List llist = item.getContent();
			Iterator it = llist.iterator();
			// 获取表中每一个字段的值,如title,content,email,放到columnList
			List columnList = new ArrayList();
			while (it.hasNext()) {
				Object object = it.next();
				if (!object.toString().substring(1, 2).equals("T"))
					columnList.add(object.toString().substring(
							object.toString().indexOf("<") + 1,
							object.toString().indexOf("/")));
				else {
					continue;
				}
			}

			Map columndata = new HashMap();// 存储表字段与对应的值
			Iterator column = columnList.iterator();
			while (column.hasNext()) {
				// System.out.println(column.next());
				String columnname = column.next().toString();
				String value = item.getChild(columnname).getText();// 取得属性值
				
			//将xml中的字段拿出来与给定原表的字段比较,如果相等转换为目标表的字段并存储到map中	
				for(int k=0;k<fcolumn[xx].length;k++){
					if(columnname.equals(fcolumn[xx][k])){
						
							 columndata.put(tcolumn[xx][k], value);
//System.out.println(tcolumn[xx][k]+"-->"+ value);	
							 
					}
				}
			}
			
			
        //拼sql语句
			String aa = "", bb = "";
			int m = 0;
			//遍历map中的key,value组成表中的一行
			Set<Map.Entry> set = columndata.entrySet();
			for (Map.Entry me : set) {
				if("id".equals(me.getKey()))continue;
				else{
						String key = (String) me.getKey();
						String value = (String) me.getValue();
						if (m != 0) {
							aa = aa + "," + key;
							bb = bb + "," + value;
						} else {
							aa = key;
							bb = value;
						}
						m++;
				}
				
			}
			
			 if(!"".equals(aa)&&!"".equals(bb)){		
					String sql = "insert into " + ttable[xx] + "(" + aa + ") values ("
								+ bb + ")";
System.out.println(sql);
			executeTable(conn,sql);
				}//if
		}
  }//for xx
System.out.println("祝贺你导入成功!!!");
}
	
	public static void executeTable(Connection conn,String sql)throws Exception{
		Statement stat=conn.createStatement();
		stat.execute(sql);
	}
	
	 public  Connection getConn(String fdriverClassName,String tjdbcurl,String tdbuser,String tdbpassword)throws Exception{
		 Class.forName(fdriverClassName);
		 Connection conn=DriverManager.getConnection(tjdbcurl,tdbuser,tdbpassword);
		 return conn;
	
	 }

	 public static boolean isEquals(String fSource[],String tSource[] ){
		 
		return(fSource.length==tSource.length?true:false);	
		 
	 }

}

 

0
0
分享到:
评论

相关推荐

    java导入导出通用模板

    总结起来,Java导入导出通用模板是利用自定义注解提供元数据,通过反射实现动态操作,结合Java POI库处理Excel文件,以实现数据的灵活导入和导出。这种模板化的设计模式在Java开发中具有广泛的应用价值,尤其是在...

    java实现mysql数据库的表导出到excel文件

    本文将详细讲解如何使用Java实现从MySQL数据库的表导出到Excel文件的过程,以及涉及到的关键技术和工具。 首先,我们需要了解的是Java与数据库交互的基础——JDBC(Java Database Connectivity)。JDBC是Java API,...

    Excel导入导出,Java注解的方式实现

    本篇文章将深入探讨如何使用Java注解的方式实现Excel的导入导出功能。 首先,我们要理解Java注解(Annotation)的作用。注解是Java语言提供的一种元数据,它允许我们在代码中嵌入额外的信息,这些信息可以被编译器...

    java poi 实现excel的导入与导出

    总结起来,使用Java POI和反射,我们可以构建一个强大的Excel导入导出框架,它具有高度的灵活性和可扩展性。通过策略模式,我们能够轻松地添加新的导入和导出方式,适应不同的数据源和格式。这个框架非常适合大型...

    Java实现Excel导入导出数据库的方法示例

    Java实现Excel导入导出数据库的方法示例主要介绍了Java实现Excel导入导出数据库的方法,结合实例形式分析了java针对Excel的读写及数据库操作相关实现技巧。该示例中,主要讲解了如何将Excel文件导入到数据库中,并...

    asp将EXCEL导入导出数据库原程序

    这个"asp将EXCEL导入导出数据库原程序"提供了一个解决方案,能够方便地将Excel中的数据存入MSSQL数据库,同时也能将数据库中的数据导出到Excel文件。 首先,我们需要了解如何使用ASP连接MSSQL数据库。通常,这涉及...

    通用excel导入/导出 (poi)

    在这个"通用excel导入/导出 (poi)"的示例中,我们主要关注的是Excel文件的处理,特别是如何利用POI库进行数据的导入和导出。下面将详细介绍这个过程中的关键知识点。 首先,让我们了解一下Apache POI。它是Apache...

    excel通过配置实现导入导出和校验

    综上所述,通过配置文件实现Excel的导入导出和校验是一种高效且灵活的解决方案,它可以提升开发效率,简化代码,同时确保数据的质量。在实际项目中,我们可以结合具体的编程语言和库,根据配置文件来定制化我们的...

    java excel导入导出数据库表内容

    只需传入数据库连接信息、Excel文件路径和相关的SQL语句,就能轻松实现数据的导入导出。 为了优化性能,可以考虑使用缓存技术(如HikariCP)提高数据库连接管理效率,或者使用线程池并发处理Excel数据,尤其是在...

    java 导出,导入excel

    java 导出,导入excel。用户自定义导出模板。模板显示内容用el表达式即可。用户可以定义每一个单元格的显示内容。可以自定义List数据的展示。一个excel的sheet内,可以有多个list的数据循环

    java通用的导入导出excel工具

    总结来说,"java通用的导入导出excel工具"利用Java反射机制和Apache POI库实现了对Excel文件的高效处理,简化了开发人员在处理Excel数据时的工作。通过理解这些核心概念和操作步骤,你可以更好地利用这个工具进行...

    不同数据库间的导入导出

    总之,利用Java实现不同数据库间的导入导出是一个复杂但可实现的任务,涉及到数据库连接、SQL操作、数据转换和性能优化等多个方面。通过精心设计的代码和适当的工具,可以有效地在不同数据库间迁移数据,满足业务...

    java实现自定义excel模板导出excel并可保存客户端和在线打开

    本文将深入探讨如何使用Java和jxl库来实现这一功能,让开发者能够创建任意复杂格式的Excel文件,并允许用户在客户端保存或在线打开。 首先,我们要了解jxl库。jxl是Java Excel API的缩写,它是一个开源的Java库,...

    导入导出功能实现代码

    ### 导入导出功能实现代码详解 在IT行业,数据的导入与导出是常见的需求,尤其是在企业级应用中,这种功能对于数据管理和备份至关重要。本文将详细解析一段示例代码,它展示了如何在Java环境下实现数据的导出至...

    java自动生成bean 根据数据库表及字段

    标题"java自动生成bean 根据数据库表及字段"描述的就是这样一个功能,它可以根据数据库中的表和字段信息,自动生成对应的Java Bean源代码,同时还能根据配置的模板添加特定的注释,如MySQL的注释。 在Java世界里,...

    JAVA跨数据库导出导入数据:SQL2000 导入到 MYSQL(附件)

    本话题聚焦于如何使用JAVA来实现SQL Server 2000中的数据导出并导入到MySQL的过程。这是一个涉及多平台兼容性和数据转换的问题,通常需要特定的工具或自定义代码来完成。 首先,SQL Server 2000是微软提供的一个...

    金蝶BOS开发之导入导出

    本文详细介绍了在金蝶BOS平台上实现数据导入导出功能的具体步骤,包括如何添加按钮、绑定Action以及编写具体的导入导出逻辑。通过这种方式,开发者可以轻松地为自己的应用添加这一实用功能,从而提高系统的易用性和...

    java使用EasyExcel导入导出excel(csdn)————程序.pdf

    Java使用EasyExcel进行Excel的导入导出是一种高效且便捷的方式,尤其对于大数据量的处理,EasyExcel能够很好地解决内存溢出的问题。以下是关于EasyExcel在Java中应用的详细讲解: 一、准备工作 在使用EasyExcel之前...

    servlet导入导出excel

    在这个场景中,我们讨论的是如何使用Servlet和JSP(JavaServer Pages)来处理Excel文件的导入和导出,尤其是与MySQL数据库的交互。Excel文件有两种主要格式:XLS(Excel 97-2003工作簿)和XLSX(Excel 2007及以后...

Global site tag (gtag.js) - Google Analytics