在开始学习xml和数据库编程时,大家都对一大堆的文档和资料,无从入手。作者在工作中,正好要用到了这些,就手头的一个程序进行整理,其功能很简单,用java语言从access数据库中,把一些数据导入到sql数据库中。
原access数据库表结构:
表:production
| 产品型号 | 字符串型 | 产品编号 |
| 零件图号 | 字符串型 | 零件编号 |
| 图号 | 字符串型 | 工具编号 |
sql server中数据表结构:
project 产品表
| id | int | 标识 |
| number | varchar64 | 编号 |
product 零件表
| id | int | 标识 |
| pid | int | 产品标识号(与project表中的id相关联) |
| number | varchar64 | 编号 |
componenttype 与零件对应的生产工具表
| id | int | 标识 |
| aid | int | 零件标识(与product表中的id关联) |
| number | varchar64 | 编号 |
要求把原来的编号分别放到下面的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,把这三个文件包含进去,就不会有问题了。
闽公网安备 35060202000074号