服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java+xml将数据导入sql server中


  在开始学习xml和数据库编程时,大家都对一大堆的文档和资料,无从入手。作者在工作中,正好要用到了这些,就手头的一个程序进行整理,其功能很简单,用java语言从access数据库中,把一些数据导入到sql数据库中。



  原access数据库表结构:

   表:production

产品型号字符串型产品编号
零件图号字符串型零件编号
图号 字符串型工具编号

  sql server中数据表结构:

   project 产品表

id int 标识
numbervarchar64编号

   product 零件表

id int 标识
pidint产品标识号(与project表中的id相关联)
numbervarchar64编号

   componenttype 与零件对应的生产工具表

idint标识
aidint零件标识(与product表中的id关联)
numbervarchar64 编号

  要求把原来的编号分别放到下面的sql server数据库的三个表格中,并用id关联起来。

  考虑到数据库连接可能有变化,决定使用xml来配置数据连接。dbs.xml文件内容如下:

<?xml version="1.0" encoding="gbk"?>
<dbcopy>
 <source>
  <class>sun.jdbc.odbc.jdbcodbcdriver</class>
  <url>jdbc:odbc:asrs</url>
  <user>""</user>
  <password>""</password>
 </source>

 <dest>
  <class>com.microsoft.jdbc.sqlserver.sqlserverdriver</class>
  <url>jdbc:microsoft:sqlserver://localhost:1433;databasename=vxms</url>
  <user>vxms</user>
  <password>vxms</password>
 </dest>
</dbcopy>


  文件connpara.java,表示以类形式表示的数据库连接参数。

public class connpara
{
 string dbclass=null;
 string url=null;
 string username=null;
 string password=null;

 public connpara() { }

 public connpara(string pdbclass,string purl,string pusername,string ppassword)
 {
  dbclass=pdbclass;
  url=purl;
  username=pusername;
  password=ppassword;
 }

 public string getdbclass(){return dbclass;}
 public string geturl(){return url;}
 public string getusername(){return username;}
 public string getpassword(){return password;}
 public void setdbclass(string str){ dbclass=str;}
 public void seturl(string str){ url=str;}
 public void setusername(string str){username=str;}
 public void setpassword(string str){password=str;}
}

  文件dbxmlparser.java封装了对xml文件的操作。

import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import java.io.*;

public class dbxmlparser
{
 static string xmlfile;
 public dbxmlparser(string filename)
 {
  xmlfile=filename;
 }

 public static element loaddocument()
 {
  try
  {
   //工厂
   documentbuilderfactory dcfactory=documentbuilderfactory.newinstance();
   //文档构造器
   documentbuilder db=dcfactory.newdocumentbuilder();
   //构造的文档
   document doc=db.parse(xmlfile);
   //根元素
   element root=doc.getdocumentelement();
   return root;
  }catch( parserconfigurationexception e){
   system.out.println("parserconfigurationexception");
   e.printstacktrace();
  }catch(ioexception e) {
   system.out.println("ioexception ");
   e.printstacktrace();
  }catch(saxexception e) {
   system.out.println("saxexception ");
   e.printstacktrace();
  }catch(exception e) {
   e.printstacktrace();
  }
  return null;
 }

 public connpara getsource()
 {
  element root=loaddocument();
  if( root==null) { return null; }
  nodelist nodes=root.getelementsbytagname("source");
  if(nodes.getlength()>0)
  {
   node node=nodes.item(0);
   string connclass=getchildelementvalue(node,"class");
   string url=getchildelementvalue(node,"url");
   string username=getchildelementvalue(node,"user");
   string password=getchildelementvalue(node,"password");
   return new connpara(connclass,url,username,password);
  }
  return null;
 }

 public connpara getdest()
 {
  element root=loaddocument();
  if( root==null) return null;
   nodelist nodes=root.getelementsbytagname("dest");
  if(nodes.getlength()>0)
  {
   node node=nodes.item(0);
   string connclass=getchildelementvalue(node,"class");
   string url=getchildelementvalue(node,"url");
   string username=getchildelementvalue(node,"user");
   string password=getchildelementvalue(node,"password");
   return new connpara(connclass,url,username,password);
  }
  return null;
 }

 //得到子元素的值
 private string getchildelementvalue(node node,string subtagname)
 {
  string returnstring = "";
  if(node != null)
  {
   nodelist children = node.getchildnodes();
   for(int innerloop = 0; innerloop < children.getlength(); innerloop++)
   {
    node child = children.item(innerloop);
    if(child == null || child.getnodename() == null || !child.getnodename().equals(subtagname))
     continue;
    node grandchild = child.getfirstchild();
    if(grandchild.getnodevalue() != null)
     return grandchild.getnodevalue();
   }
  }
  return returnstring;
 }
}


  文件dbinput.java则是真正的数据拷贝部分:

import java.sql.*;

public class dbinput
{
 connection src=null;
 connection dest=null;
 connection connformax=null;
 connpara srcpara;
 connpara destpara;

 public dbinput(){}
 public void dbinit()
 {
  dbxmlparser xmlparser=new dbxmlparser("dbs.xml");
  srcpara=xmlparser.getsource();
  destpara=xmlparser.getdest();
  try {
   class.forname("sun.jdbc.odbc.jdbcodbcdriver" );
   class.forname("com.microsoft.jdbc.sqlserver.sqlserverdriver");
   src = drivermanager.getconnection( srcpara.geturl(),rcpara.getusername(),srcpara.getpassword());
   dest =drivermanager.getconnection( destpara.geturl(), destpara.getusername(),destpara.getpassword());
   connformax= drivermanager.getconnection( destpara.geturl(), destpara.getusername(),destpara.getpassword());

  }

  //捕获加载驱动程序异常

  catch ( classnotfoundexception cnfex ) {
   system.err.println( "装载 jdbc/odbc 驱动程序失败。" );
   cnfex.printstacktrace();
   system.exit( 1 ); // terminate program
  } catch ( sqlexception ex )
  {
   system.err.println( "连接失败" );
   ex.printstacktrace();
   system.exit( 1 ); // terminate program
  }
 }

 public void copyproduct()
 {
  statement st=null;
  resultset rset=null;
  string sqlstr;
  try {
   //执行sql语句
   string query = "select * from production";
   st = src.createstatement();
   rset = st.executequery(query);
   int pid,ljid,cid,ciid;
   while(rset.next())
   {
    string pnumber=rset.getstring(1);
    string ljnumber=rset.getstring(2);
    string cnumber=rset.getstring(3);
    //插入到产品表
    pid=getidfromnumber("project","number",pnumber);
    if(pid==0) //插入一条新记录
    {
     pid=getmax("project");//system.out.println(pid);
     sqlstr="insert into project(id,number) values("+pid+",'"+pnumber+"')";
     execute(destpara,sqlstr);
    }
    //插入到零件表
    ljid=getidfromnumber("product","number",ljnumber);
    if(ljid==0) //插入一条新记录
    {
     ljid=getmax("product");
     sqlstr="insert into product(id,pid,number) values("+ljid+","+pid+",'"+ljnumber+"')";
     execute(destpara,sqlstr);
    }
    //插入工具表
    cid=getidfromnumber("componenttype","number",cnumber);
    if(cid==0) //插入一条新记录
    {
     cid=getmax("componenttype");
     sqlstr="insert into componenttype(id,aid,number)values("+cid+","+ljid+",'"+cnumber+"')";
     execute(destpara,sqlstr);
    }
   }
  }
  catch ( sqlexception sqlex ) {
   sqlex.printstacktrace();
  }
 }

 protected boolean alreadyin(string tname,string colname, string value)
 {
  int result;
  resultset rst=null;
  try {
   //执行sql语句
   string query = "select "+colname+" from "+tname+" where "+colname+"='"+value+"'";
   statement statement = connformax.createstatement();
   rst = statement.executequery( query );
   if(rst.next())
   {
    statement.close();
    rst.close();
    return true;
   }
  }
  catch ( sqlexception sqlex ) {
   sqlex.printstacktrace();
   return false;
  }
  return false;
 }

 protected int getidfromnumber(string tname,string colname, string value)
 {
  int result;
  resultset rst=null;
  try {
   connection conn= drivermanager.getconnection( destpara.geturl(), destpara.getusername(),destpara.getpassword());

   string query = "select id,"+colname+" from "+tname+" where "+colname+"='"+value+"'";

   system.out.println(query);
   statement statement = conn.createstatement();
   rst = statement.executequery( query );
   if(rst.next())
   {
    return rst.getint("id");
   }
  }
  catch ( sqlexception sqlex ) {
   sqlex.printstacktrace();
   return 0;
  }
  return 0;
 }

 /**
  * 得到某个表中的最大的id号
 */

 protected int getmax(string tname)
 {
  int result;
  resultset rst=null;
  try {
   //执行sql语句
   string query = "select max(id) from "+tname;
   statement statement = connformax.createstatement();
   rst = statement.executequery( query );
   if(rst.next())
   {
    return rst.getint(1)+1;
   }
  }
  catch ( sqlexception sqlex ) {
   sqlex.printstacktrace();
   return 0;
  }
  return 1;
 }

 /**
  * 执行某一段sql语句
 */

 public static void execute(connpara connpara,string stmt) throws sqlexception
 {
  connection conn=null;
  preparedstatement ps = null;
  try {
   conn=drivermanager.getconnection( connpara.geturl(), connpara.getusername(), connpara.getpassword());
   system.out.println(stmt);
   ps = conn.preparestatement(stmt);
   ps.executeupdate();
  } catch (exception e) {
   e.printstacktrace();
   system.out.println(e.getmessage());
  } finally {
   if (ps!=null) ps.close();
   if (conn!=null)conn.close();
  }
 }

 public static void main(string argc[])
 {
  dbinput copydb=new dbinput();
  copydb.dbinit();
  copydb.copyproduct();
 }
}

  问题:

  1) access数据库不能直接由jdbc读写,解决办法是先把access配置在odbc中,然后再通过jbdc-odbc桥来操作access数据库。

  2) 执行时找不到com.microsoft.jdbc.sqlserver.sqlserverdriver类,这是因为在运行这个类时,要下载微软的jdbc包,这个包中有三个文件: msbase.jar,mssqlserver.jar,msutil.jar,把这三个文件包含进去,就不会有问题了。

扫描关注微信公众号