论坛登陆 用户名:  密 码:
设为首页  加入收藏
08年北京名校秋季招生
名牌院校免试入学宽进严出,突破考分限制,名校与你零距离,以下院校按报名先后顺序录取,24小时网上报名覆盖全国
  您现在的位置: 中国教育招生在线 >> IT >> JAVA认证 >> IT正文
Java、XML与数据库编程实践
 作者:佚名     2007-3-14 17:29:08        来源:不详  浏览次数:

 

 

 

 

 

 

 

 

在开始学习XML和数据库编程时,大家都对一大堆的文档和资料,无从入手。作者在工作中,正好要用到了这些,就手头的一个程序进行整理。其功能很简单,得用java语言,从access数据库中,把一些数据导入到SQL数据库中。
  
  需求:
  
  原Access数据库表结构:
  
  表:production
  
    产品型号  字符串型………产品编号
  
    零件图号  字符串型……….零件编号
  
    图号    字符串型……….工具编号
  
  SQL数据表结构:
  
  Project   产品表
  
    Id     int      标识
  
    Number… varchar64   编号
  
  Product  零件表
  
    Id     int      标识
  
    pid     int      产品标识号(与project表中的id相关联)
  
    Number… varchar64   编号
  
  Componenttype  与零件对应的生产工具表
  
    Id     int      标识
  
    aid     int      零件标识(与product表中的id关联)
  
    Number… varchar64   编号
  
  要求把原来的编号分别放到下面的SQL三个表格中,并用id关联起来。
  
  考虑到数据库连接可能有变化,决定使用xml来配置数据连接。Dbs.xml文件内容如下:
  
  
  
   
  
   
  
    sun.jdbc.odbc.JdbcOdbcDriver
  
    jdbc:odbc:asrs
  
    ""
  
    ""
  
   
  
   
  
    com.microsoft.jdbc.sqlserver.SQLServerDriver
  
    jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=vxms
  
    vxms
  
    vxms
  
   

  
  

  
  文件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(), srcPara.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中,然后再通过ODBC来操作access数据库。
  
  2)    执行时找不到com.microsoft.jdbc.sqlserver.SQLServerDriver类,这是因为在运行这个类时,要下载微软的jdbc包,这个包中有三个文件: msbase.jar,mssqlserver.jar,msutil.jar,把这三个文件包含进去,就不会有问题了。

 

 

 


责任编辑:lss
  相关新闻
JSFToolbox--用Dreamweaver开发JSF
Java模板引擎Velocity基本语法
【JAVA基础】JDBC连接DB2数据库详解
为什么要学习Java,成为Java程序员
Java基础-漫谈EJB在Java中的应用
漫谈EJB在Java中的应用(二)
J2EE技术-漫谈EJB在Java中的应用
JAVA测试:使用JMock来实现孤立测试
看看如何在Struts应用中施展AJAX魔法
通过java.net.Socket类抓取网页内容
为什么要学习Java,成为Java程序员
Java基础-漫谈EJB在Java中的应用
漫谈EJB在Java中的应用(二)
运用Jakarta Struts的七大实战心法
通过Java Swing 看透MVC设计模式
开发保留标准浏览器功能的AJAX应用程序
Web框架趣谈之Java Web 框架的甜点
Web2.0时代的核心应用:Ajax简介
精华:AJAX开发简略(第一部分)
Thinking in AJAX(三)——AJAX框架汇总
  评论
现在有100人对本文发表评论
查看所有评论
 
推  荐
 
100本成功必读热销书
热门招生
  北京文理研修学院   前进大学
  北京明园大学   北京建设大学
  北京邮电大学世纪学院   北方工商管理学院
  联想软件定向委培班   香港数码动画学院
  青年企业管理研修学院   北京华夏管理学院
热门培训
网络化办公专家培训认证 电子科技大学软件学院
软件测试工程师培训认证 北大青鸟十大授权培训
IT硬件工程师培训认证班 北京环球雅思荷兰预科
JAVA开发工程师培训 潜能时代IT服务管理培训
网络信息化工程师培训 清华大学继续教育学院
论坛精选
 
有些细节是男人也该注意的风度!最容易读错的字
某强人手机里保存的30条短信 中国十大高薪职业
最感人的十大韩剧经典台词 嫁给工程师的N个理由
爆强!只有一句话的鬼故事 转贴教你如何做妖精
 女人一定要記住的話 女人最好别嫁给最爱的男人
城市联盟
 大连 上海 天津 广州 西安 深圳  天津  青岛  大连  福州  沈阳  青海  连云港  南京  吉林  厦门  威海  辽宁  呼和浩特
Copyright © 2006   www.edu999.com   All rights reserved. 中国教育招生在线  版权所有
北京市通信管理局[2004]字第552号函    京ICP证040442号