Java、XML与数据库编程实践

xml|编程|数据|数据库

在开始学习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文件内容如下:
<?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(), 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,把这三个文件包含进去,就不会有问题了。

 

时间: 2024-08-03 16:26:37

Java、XML与数据库编程实践的相关文章

《Java线程与并发编程实践》—— 导读

前言 Java线程与并发编程实践 线程和并发工具并非尤物,但是它们是正式应用的重要部分.本书会向你介绍Java 8 Update 60中线程特性以及并发工具的大部分内容. 第1章介绍了类Thread和接口Runnable.你会学习如何创建Thread以及Runnable对象,获取和设置线程状态.启动线程.中断线程,将一条线程插入另外一条线程以及触发线程睡眠. 第2章关注同步.学习后你会解决一些问题,如没有同步就无法解决的竞态条件.你也能学到如何创建同步方法.块,以及如何使用忽略互斥访问的轻量级同

基于java.nio.channels的编程实践-II

介绍 为了提供并发处理效率,把用户的请求连接随机分配到线程池的线程进行处理,hbase也是采用同样的方式处理用户请求的 客户端代码可以参考:基于java.nio.channels的编程实践-I 代码 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.chan

《Java线程与并发编程实践》—— 第2章 同步 2.1 线程中的问题

第2章 同步 Java线程与并发编程实践 线程交互通常是通过共享变量完成的,当线程之间没有交互时,开发多线程的应用程序会变得简单许多.一旦发生了交互,很多诱发线程不安全(在多线程环境下不正确)的因素就会暴露出来.在这一章中,你将会认识到这些问题,同时也会学习如何正确地使用Java面向同步的特性来克服它们. 2.1 线程中的问题 Java对线程的支持促进了响应式.可扩展应用程序的发展.不过,这样的支持是以增加复杂性作为代价的.如果不多加小心,你的代码就会到处充斥着极难以察觉的bug,而这些bug多

《Java线程与并发编程实践》- 第1章 Thread和Runnable

第1章 Thread和Runnable Java线程与并发编程实践 Java程序是通过线程执行的,线程在程序中具有独立的执行路径.当多条线程执行时,它们彼此之间的路径可以不同.举个例子,一条线程可能在执行switch语句的某个case分支,另一条线程很可能在执行其他case分支. 每个Java应用程序都有一个执行main()函数的默认主线程.应用程序也可以创建线程在后台操作时间密集型任务,以确保对用户的响应.这些封装了代码执行序列的线程对象就被称为runnable. Java虚拟机给每条线程分配

Java 5.0多线程编程实践

Java5增加了新的类库并发集java.util.concurrent,该类库为并发程序提供 了丰富的API多线程编程在Java 5中更加容易,灵活.本文通过一个网络服务器 模型,来实践Java5的多线程编程,该模型中使用了Java5中的线程池,阻塞队列 ,可重入锁等,还实践了Callable, Future等接口,并使用了Java 5的另外一 个新特性泛型. 简介 本文将实现一个网络服务器模型,一旦有客户端连接到该服务器,则启动一 个新线程为该连接服务,服务内容为往客户端输送一些字符信息.一个

基于java.nio.channels的编程实践-I

服务端代码 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketCh

《Java线程与并发编程实践》—— 2.3 谨防活跃性问题

2.3 谨防活跃性问题 活跃性这个词代表着某件正确的事情最终会发生.活跃性失败发生在应用程序触及一种无法继续执行的状态.在单线程的应用程序中,无限循环就是一个例子.多线程应用程序面临着诸如死锁.活锁和饿死的额外挑战. 死锁:线程1等待线程2互斥持有的资源,而线程2也在等待线程1互斥持有的资源.两条线程都无法继续执行. 活锁:线程x持续重试一个总是失败的操作,以致于无法继续执行. 饿死:线程x一直被(调度器)延迟访问其赖以执行的资源.或许是调度器先于低优先级的线程执行高优先级的线程,而总是有一个高

《Java线程与并发编程实践》—— 1.2 操作更高级的线程任务

1.2 操作更高级的线程任务 之前的线程任务都和如何配置一个线程对象以及启动关联的线程相关.不过,Thread类也能支持更多高级的任务,包括中断其他线程.将线程join到另一条线程中以及致使线程睡眠. 1.2.1 中断线程 Thread类提供了一种线程可以中断其他线程的机制.当一个线程被中断时,它会抛出java.lang.InterruptedException.这一机制由下面的3种方法构成. void interrupt():中断调用此方法的Thread对象所关联的线程.当一条线程由于调用了T

《Java线程与并发编程实践》—— 1.4 小结

1.4 小结 Java应用程序通过线程执行,线程在程序代码中具有独立的执行路径.每个Java应用程序都有一个执行main()函数的默认主线程.应用程序也可以创建线程在后台操作时间密集型任务以确保对用户的响应.这些封装了代码执行序列的线程对象就称为runnables. Thread类为底层操作系统的线程体系架构提供一套统一接口(操作系统通常负责创建和管理线程).单个的操作系统线程关联为一个Thread对象. Runnable接口为关联Thread对象的线程提供执行代码.这些代码放在Runnable