[原创]一个Hibernate的开发指南


所属类别:Java

文章作者:未知

特别推荐:免费发布信息 承包关键词~~抢爆了!HOT!


其实不只是Hibernate,还包括了Eclipse和MyEclipse的使用,以及Struts的内容,会写很多多的,现在只是一个开头,这是第一篇:http://bsd.huangdong.com/dev/hibernate/startup/startup.html请高手及时指出不合理和合适的地方,我会及时改进的。:)

【发表回复】【查看CU论坛原帖】【添加到收藏夹】【关闭】 garydo 回复于:2003-12-26 10:39:47 顶一下,写的挺好啊!thanks猫小 回复于:2003-12-26 10:57:09 鼓励原创这是你自己的论坛嘛?希望有时间把全文都共享在CU资源库hdcola 回复于:2003-12-27 21:36:10 没贴上来主要是:图很多,坛里贴图好麻烦的还有就是这个文章还没完全的写完,刚有一个朋友指出一点问题,我正在改呢。希望有一个stable版时再post上来,不过只是文字还是不太过隐的。呵呵,这些日子在系这个系列,希望对struts和hibernate了解的兄弟多多指点一下。让我能写的更好ii 回复于:2003-12-28 10:48:16 [quote:77c4711664="hdcola"]没贴上来主要是:图很多,坛里贴图好麻烦的还有就是这个文章还没完全的写完,刚有一个朋友指出一点问题,我正在改呢。希望有一个stable版时再post上来,不过只是文字还是不太过隐的。呵呵,这些日子在系这个系..........[/quote:77c4711664]黄先生我们是仰慕已久,这的精华中好象也有转的你写的东东.http://www.chinaunix.net/forum/viewtopic.php?t=15889hdcola 回复于:2003-12-29 11:39:52 呵呵,这是很多年前的事了,不知为什么被大家翻了出来。当时CCU的东东不少的,有些(包括这个)我都找不着了,反而被大家找了出来:)qujidong 回复于:2003-12-29 20:31:15 ok有前途hdcola 回复于:2004-01-03 08:14:26 附上内容,但此文图片众多,最好还是看带图片的版本:http://bsd.huangdong.com/dev/hibernate/startup/startup.html前言Hibernate做为一个非常优秀且已经被大量使用的数据库持久层工具已经越来越成熟了。本文主要是针对使用Hibernate的开发者,本章节主要是说明在《Hibernate开发指南》中所使用到的开发环境的初步设置,并使用一个简单的例子以说明Hibernate已经正常运行。本文所主要使用的工具有:JDK:JDK1.4.2开发集成环境:Eclipse2.1.2Hibernate2.1数据库:Oracle9iHibernate的Eclipse插件:TanghanPlugin请先看看你的机器上是否已经安装这些软件,对于数据库,只是因为我的机器上已经安装了Oracle,使用其它的数据库不会有太大的差别的。我的例子还使用了一个struts的框架,因为我认为web应用框架中struts是一个非常不错的选择,而加上Hibernate这个数据库访问层,两者相匹配能达到更好的效果。为了使用Struts,也请确认你安装了以下软件:Web应用服务器:Tomcat4.xStruts1.1包Eclipse的J2EE集成插件:MyEclipse2.7RC1以上版本(2.7开始提供struts的支持)如果你不想使用MyEclipse这个商用的插件,也可以使用lomboz和easystruts来代替它的功能。具体的软件安装和插件安装不在这里多说,以下我们来说说它们安装后的配置。软件配置我们先来配置数据库,同时记下数据库开发时所需要的相关信息。Oracle相关配置参数我在Oracle中建立了一个单独的用户:HD,设置其密码为:abc。为该用户分配好相应的数据库空间,细致的配置方法和信息不再多说,总之你需要得到类似下面的信息以备开发时所使用:机器地址:hdibm(因为是在本机还可以使用localhost和127.0.0.1,如果是另一台机器使用该机器的IP地址)oracle的侦听端口:1521数据库实例名:hdorc访问用户名:hd访问密码:abc需要注意的是要给HD用户分配至少Connect的角色。另外在他所使用的表空间中分配足够或是无限制的限额大小,否则在开发时都会遇到问题。除这些之外还需要你从安装的Oracle或Oracle网站上下载最新的JDBC包,它有两个包,其中一个是与JDK相关的驱动,另一个是多语言支持包(这里我们不使用OCI的驱动,使用Thin的驱动)。因为我使用的JDK为1.4所以驱动包我使用了ojdbc14.jar,JDK1.4使用的多语言支持包与JDK1.2相同都是nls_charset12.jar。在数据库中我们建立一些表以用于程序开发,以一个简单的用户管理为例我们先建立一个简单的用户表(sysuser):表名:sysuser用户ID:userid(vchar:32)用户名:username(vchar:20)用户密码:userpasword(vchar:20)用户最后登录时间:lastlogin(date)你也可以使用这个sql语句来创建表:CREATETABLE"HD"."SYSUSER"("USERID"VARCHAR2(32)NOTNULL,"USERNAME"VARCHAR2(20)NOTNULL,"USERPASWORD"VARCHAR2(20)NOTNULL,"LASTLOGIN"DATE,PRIMARYKEY("USERID"),UNIQUE("USERNAME"))TABLESPACE"USERS" Tomcat安装Tomcat的安装则非常简单了,从Tomcat网站上下载相关的安装包,解到相关的目录就可以了。安装Tomcat之后你需要记下以下信息:Tomcat的安装目录Tomcat的侦听端口(默认为8080)配置HibernateforEclipse的插件TanghanPlugin初次使用这个插件时会有许多人无从下手,主要是不知从哪里使用这个插件。首先要打开这个插件提供的两个视图:DatabaseAccessView和DatabaseDataView。通过菜单上的窗口>显示视图>其它来选择这两个视图:打开DatabaseAccessView视图,我们来配置Oracle的驱动,用鼠标右键点OracleThinDriver>修改驱动程序信息:这里:驱动名称:OracleThinDriver驱动程序包名:浏览选择你的ojdbc14.jar文件驱动程序类:oracle.jdbc.driver.OracleDriver驱动程序前缀:jdbc:oracle:thin:<username>@<password>//<server>[:<1521>]/<database_name>(这里是最新的驱动的URL书写方法,具体的最好看一下相关Oracle驱动的有关URL的说明)配置好驱动程序后我们来增加一个数据库连接:这里:数据库连接名:HDTestDB驱动名称:OracleThinDriver(就是在上面我们建立的)驱动程序类:oracle.jdbc.driver.OracleDriver数据库连接:jdbc:oracle:thin:hd@abc//hdibm:1521/hdorc用户名:hd密码:abc接下来我们试着连接一下数据库:需要我们再选择Shemas,从下拉列表中选择HD,按确定按钮。如果能看到选择Shemas对话框,哪么说明你的数据库配置就没有什么问题了。我们可以在DatabaseAccessView中看到库中的表及表结构:配置MyEclipse从MyEclipse的网站上下载到最新的MyEclipse的试用版以及Struts相关的TLD和Lib包。安装完MyEclipse后,配置Tomcat的使用。主要是配置清楚tomcat的相关路径就可以了:需要注意的是tomcat一定要使用一个JDK,而不是JRE,在tomcat的配置树中可以选择一个JDK以供Tomcat启动使用:接下来将从网站上下载的Struts包解开到文件系统中(也可以手工将Struts1.1包中的lib和tld拆出),在MyEclipse中配置好Struts1.1的相关包:这些配置完成我们就可以建立一个简单的项目了。建立初始的Struts项目我们先建立一个项目,为后续的深入开发做准备,这个项目是一个简单的框架,导入Tomcat部署支持、建立与Struts和Hibernate的库路径。建立Web应用项目首先使用向导建立一个WebModuleProject:输入WebProject的相关信息:按图中所示一一输入。点完成建立Project。为项目加入Tomcat部署支持接下来为项目加入Tomcat部署支持:在弹出的对话框中点Add,并在下拉框中选中Tomcat4:为Web应用加入Struts支持再为项目加入Struts支持:在弹出的对话框中按下图输入信息:这样就为Web应用项目加入了Struts支持,这一步会自动为项目加入Struts的支持包和Struts需要使用的TLD文件(TagLib说明文件)。之后我们可以看到:为Web应用加入Hibernate支持Hibernate中有大量的jar,不建议大家全部加入,以下是你必须加入的jar包(这些包除hibernate2.jar在根下其它都在lib子目录中):hibernate2.jar:Hibernate的核心库。cglib2.jar:Hibernate用来实现PO字节码的动态生成时所需要的库。commons-collections.jar:ApacheCommons提供的比java.util.*功能更强的集合类。commons-lang.jar:ApacheCommons提供了扩展java.lang.*的功能。commons-logging.jar:ApacheCommons提供的一个通用日志接口工具。它会使用Log4j、JDK的java.util.logging、commons-logging的SimpleLogger的顺序来寻找可用的logAPI。dom4j.jar:一个访问XML的java接口实现,Hibernate使用该包来完成XML的操作。odmg.jar:ODMG是一个ORM的规范,Hibernate使用这个包实现了ODMG规范。xalan.jar、xerces.jar和xml-apis.jar:XSLT处理器、SAX解析、标准JAXPAPI包,都是用于XML的处理。(大多应用服务器带有这三个包)以下包依据你应用中的情况做为选项可以加入,由你自己来定了:c3p0.jar:C3PO数据库连接池所使用的包。commons-dbcp.jar和commons-pool.jar:ApacheCommons提供的名为DBCP的数据库连接池所使用的包。jboss-cache.jar、concurrent.jar、jboss-common.jar、jboss-jmx.jar、jboss-system.jar:TreeCache所使用的包,它实现了一个可以集群的cache。connector.jar:标准JCAAPI包。大多应用服务器都带了。(*)ehcache.jar:EHCachecache包,Hibernate默认使用这个包来完成cache功能。jaas.jar:标准JAASAPI包。大多应用服务器也带有这个包,这个包是供JCA来使用的。(JDK1.4也已经包含这个包了)jcs.jar:JCScache包。jdbc2_0-stdext.jar:标准JDBC2.0API扩展包。大多应用服务器也包含了这个包。swarmcache.jar和jgroups.jar:SwarmCache可复制的分布式Cache所使用的包。它使用JavaGroups进行组通讯,适合于集群环境的数据库应用Cache。(*)jta.jar:标准JTAAPI包。大多数应用服务器也带有这个包。log4j.jar:Log4包,Log4j是Logger工具中一个非常好的选择。oscache.jar:由OpenSymphony所提供的OSCache包,用于数据库的Cache。proxool.jar:ProxoolJDBC数据库连接池包。还有一些其它的包,都不是运行时刻所使用的包,附在这里以做了解了:ant.jar:编译Hibernat时使用的ant核心包。junit.jar:JUnit测试框架包,编译时为测试代码进行测试所使用的。optional.jar:Ant使用的辅助包,包括了一些附加的task。加入包的方法很简单,使用资源管理器将jar文件拖入web目录下的WEB-INF中的lib目录就可以了。MyEclipse会自动将该目录中的所有的jar文件加入到project的编译classpath中去的。注意,除必须的包之外,前面有(*)的包也请加入到项目中去。由于是使用Tomcat,在必须的包中的有关XML包也可以不加入。如下图:为Web应用加入JDBC驱动包将之前准备好的Oracle驱动包也加入到Web项目中。主要是这两个文件:nls_charset12.jarojdbc14.jar下图是配置到最后所有的包的列表,也请大家一一核对:配置Hibernate的配置文件配置Hibernate数据库连接配置数据库的连接配置很简单,在项目的src目录下建立一个xml文件,名为hibernate.cfg.xml。这个文件的内容为:<?xmlversion='1.0'encoding='UTF-8'?><!DOCTYPEhibernate-configurationPUBLIC"-//Hibernate/HibernateConfigurationDTD//EN""http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">net.sf.hibernate.dialect.Oracle9Dialectoracle.jdbc.driver.OracleDriverhdabcjdbc:oracle:thin:@localhost:1521:hdorc 1 25 50 30 true <!--Mappingfiles--> 我们对这里的各个property元素一一说明:dialect:使用了Oracle9的对照connection.driver_class:Oracle的JDBC驱动类名connection.username:Oracle数据库访问用户名connection.password:Oracle数据库访问密码connection.url:Oracle数据库访问URLconnection.pool.size:数据库连接池大小statement_cache.size:JDBCstatement缓冲大小jdbc.fetch_size:设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数jdbc.batch_size:设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小show_sql:设定是否在控制台上显示向数据库提交的SQL语句,在开发调试时比较有用提下来的mappingresource则是我们对数据库表的一个个的映射文件的清单,我们下面会对SYSUSER表进行映射,所以现在就已经加了进去。而这个xml会放在com.huangdong.demo.dao包中,所以要把load时的路径也写进来。配置Hibernate表映射在DatabaseAccessView中选择SYSUSER表,在菜单中选择生成HBM文件:在向导对话框中按下图输入相关信息:按完成按钮后,就会在com.huangdong.demo.dao包中生成SysUser类和SysUser.hb.xml文件。由于在Java中使用java.util.Date有很多不方便的地方,所以我将lastlogin的映射后的java属性改为了calendar。这是修改后的SysUser.hbm.xml文件:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD2.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> 这是修改后的SysUser.java文件:packagecom.huangdong.demo.dao;importjava.io.Serializable;importorg.apache.commons.lang.builder.EqualsBuilder;importorg.apache.commons.lang.builder.HashCodeBuilder;importorg.apache.commons.lang.builder.ToStringBuilder;/**@authorHibernateCodeGenerator*/publicclassSysUserimplementsSerializable{/**identifierfield*/privateStringuserid;/**persistentfield*/privateStringusername;/**persistentfield*/privateStringuserpasword;/**nullablepersistentfield*/privatejava.util.Calendarlastlogin;/**fullconstructor*/publicSysUser(java.lang.Stringusername,java.lang.Stringuserpasword,java.util.Calendarlastlogin){this.username=username;this.userpasword=userpasword;this.lastlogin=lastlogin;}/**defaultconstructor*/publicSysUser(){}/**minimalconstructor*/publicSysUser(java.lang.Stringusername,java.lang.Stringuserpasword){this.username=username;this.userpasword=userpasword;}publicjava.lang.StringgetUserid(){returnthis.userid;} publicvoidsetUserid(java.lang.Stringuserid){ this.userid=userid; }publicjava.lang.StringgetUsername(){returnthis.username;} publicvoidsetUsername(java.lang.Stringusername){ this.username=username; }publicjava.lang.StringgetUserpasword(){returnthis.userpasword;} publicvoidsetUserpasword(java.lang.Stringuserpasword){ this.userpasword=userpasword; }publicjava.util.CalendargetLastlogin(){returnthis.lastlogin;} publicvoidsetLastlogin(java.util.Calendarlastlogin){ this.lastlogin=lastlogin; }publicStringtoString(){returnnewToStringBuilder(this).append("userid",getUserid()).toString();}publicbooleanequals(Objectother){if(!(otherinstanceofSysUser))returnfalse;SysUsercastOther=(SysUser)other;returnnewEqualsBuilder().append(this.getUserid(),castOther.getUserid()).isEquals();}publicinthashCode(){returnnewHashCodeBuilder().append(getUserid()).toHashCode();}} 建立测试用的Servlet创建Servlet框架使用新建Servlet的向导我们来建立一个测试用的Servlet,下图是新建Servlet时输入的参数和选项:在下一步的XMLWizard对话框中记得将DisplayName和Description的“TestSystemFunctionServlet”都清除,如下图所示:这样就建立了一个初始的Servlet框架。编写数据库连接获取类我们编写一个单独的类,用于从SessionFactory中获取数据库连接session。这个类名为HibernateUtil,我们将其放于com.huangdong.demo.util包中,具体的代码如下:packagecom.huangdong.demo.util;importnet.sf.hibernate.HibernateException;importnet.sf.hibernate.Session;importnet.sf.hibernate.SessionFactory;importnet.sf.hibernate.cfg.Configuration;publicclassHibernateUtil{ privatestaticfinalSessionFactorysessionFactory; static{ try{ sessionFactory= newConfiguration().configure().buildSessionFactory(); }catch(HibernateExceptionex){ thrownewRuntimeException( "ExceptionbuildingSessionFactory:"+ex.getMessage(), ex); } } publicstaticfinalThreadLocalsession=newThreadLocal(); publicstaticSessioncurrentSession()throwsHibernateException{ Sessions=(Session)session.get(); //OpenanewSession,ifthisThreadhasnoneyet if(s==null){ s=sessionFactory.openSession(); session.set(s); } returns; } publicstaticvoidcloseSession()throwsHibernateException{ Sessions=(Session)session.get(); session.set(null); if(s!=null) s.close(); }} 我们可以通过currentSession方法来获取数据库连接,如果系统中有可用的session就会反回可用的,如果没有时才会创建一个新的session。当session操作完成后,需要操作者使用closeSession方法释放使用的session。建立测试Bean接下来我们建立一个TestHibernate的JavaBean,主要加入一些Hibernate的测试方法,以下是建立该类所输入的相关信息:我们为该类加入一个向数据库中增加数据的方法: publicbooleanTestAdd(){ try{ Sessionsession=HibernateUtil.currentSession(); Transactiontx=session.beginTransaction(); SysUseruser=newSysUser(); user.setUsername("丫丫"); user.setUserpasword("uhkuhkqepdwqi"); user.setLastlogin(Calendar.getInstance()); session.save(user); tx.commit(); HibernateUtil.closeSession(); }catch(HibernateExceptione){ e.printStackTrace(); returnfalse; } returntrue; } 第一次我写这个代码时感到非常的意外,总感觉应该再多写点什么,但是真的是这样,我们只用了这么几句话就向数据库加入了一条记录。在Servlet中调用TestAdd方法这就很简单了,更改TestServlet.java类的doGet方法,初始化TestHibernate类,并调用TestAdd方法就可以了: publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html;charset=GBK"); PrintWriterout=response.getWriter(); out.println( "<!DOCTYPEHTMLPUBLIC\"-//W3C//DTDHTML4.01Transitional//EN\">"); out.println(""); out.println("AServlet"); out.println("");

//调用TestAdd TestHibernatetest=newTestHibernate(); out.println("TestAdd:"+test.TestAdd()+"");

out.println(""); out.println(""); out.flush(); out.close(); } 如果TestAdd方法执行成功则会在页面上返回True,否则会返回False。下面我们就来测试一把。测试我们第一个基于Servlet的Hibernate应用启动Tomcat如果之前按本文配置好了Tomcat的部署,哪么这里就不会有任何问题,如图操作则会进入Eclipse的调试视图:在Debug视图中看到所有的线程启动,并在控制台窗口中看到“StartingCoyoteHTTP/1.1onport8080”则说明Tomcat启动成功并侦听了8080端口,如下图:打开浏览器,在地址栏中输入:http://localhost:8080/Demo/servlet/TestServlet 如果返回的页面如下图所示,则代表数据库更新成功:同时在Eclipse的控制台中我们可以看到Hibernate的log输出,说明了它工作的细节情况:2003-12-2615:10:37net.sf.hibernate.cfg.Environment信息:Hibernate2.1.12003-12-2615:10:37net.sf.hibernate.cfg.Environment信息:hibernate.propertiesnotfound2003-12-2615:10:37net.sf.hibernate.cfg.Environment信息:usingCGLIBreflectionoptimizer2003-12-2615:10:37net.sf.hibernate.cfg.Configurationconfigure信息:configuringfromresource:/hibernate.cfg.xml2003-12-2615:10:37net.sf.hibernate.cfg.ConfigurationgetConfigurationInputStream信息:Configurationresource:/hibernate.cfg.xml2003-12-2615:10:38net.sf.hibernate.cfg.ConfigurationaddResource信息:Mappingresource:com/huangdong/demo/dao/SysUser.hbm.xml2003-12-2615:10:38net.sf.hibernate.cfg.BinderbindRootClass信息:Mappingclass:com.huangdong.demo.dao.SysUser->SYSUSER2003-12-2615:10:39net.sf.hibernate.cfg.ConfigurationdoConfigure信息:ConfiguredSessionFactory:null2003-12-2615:10:39net.sf.hibernate.cfg.ConfigurationsecondPassCompile信息:processingone-to-manyassociationmappings2003-12-2615:10:39net.sf.hibernate.cfg.ConfigurationsecondPassCompile信息:processingone-to-oneassociationpropertyreferences2003-12-2615:10:39net.sf.hibernate.cfg.ConfigurationsecondPassCompile信息:processingforeignkeyconstraints2003-12-2615:10:39net.sf.hibernate.dialect.Dialect信息:Usingdialect:net.sf.hibernate.dialect.Oracle9Dialect2003-12-2615:10:39net.sf.hibernate.cfg.SettingsFactorybuildSettings信息:JDBCresultsetfetchsize:502003-12-2615:10:39net.sf.hibernate.cfg.SettingsFactorybuildSettings信息:Useouterjoinfetching:true2003-12-2615:10:39net.sf.hibernate.connection.DriverManagerConnectionProviderconfigure信息:UsingHibernatebuilt-inconnectionpool(notforproductionuse!)2003-12-2615:10:39net.sf.hibernate.connection.DriverManagerConnectionProviderconfigure信息:Hibernateconnectionpoolsize:202003-12-2615:10:39net.sf.hibernate.connection.DriverManagerConnectionProviderconfigure信息:usingdriver:oracle.jdbc.driver.OracleDriveratURL:jdbc:oracle:thin:@localhost:1521:hdorc2003-12-2615:10:39net.sf.hibernate.connection.DriverManagerConnectionProviderconfigure信息:connectionproperties:{user=hd,password=abc,pool.size=1}2003-12-2615:10:39net.sf.hibernate.transaction.TransactionManagerLookupFactorygetTransactionManagerLookup信息:NoTransactionManagerLookupconfigured(inJTAenvironment,useofprocesslevelread-writecacheisnotrecommended)2003-12-2615:10:45net.sf.hibernate.cfg.SettingsFactorybuildSettings信息:Usescrollableresultsets:true2003-12-2615:10:45net.sf.hibernate.cfg.SettingsFactorybuildSettings信息:JDBC2maxbatchsize:302003-12-2615:10:45net.sf.hibernate.cfg.SettingsFactorybuildSettings信息:echoingallSQLtostdout2003-12-2615:10:45net.sf.hibernate.cfg.SettingsFactorybuildSettings信息:Querylanguagesubstitutions:{}2003-12-2615:10:45net.sf.hibernate.cfg.SettingsFactorybuildSettings信息:cacheprovider:net.sf.ehcache.hibernate.Provider2003-12-2615:10:45net.sf.hibernate.cfg.ConfigurationconfigureCaches信息:instantiatingandconfiguringcaches2003-12-2615:10:46net.sf.hibernate.impl.SessionFactoryImpl信息:buildingsessionfactory2003-12-2615:10:47net.sf.hibernate.impl.SessionFactoryObjectFactoryaddInstance信息:noJNDInameconfiguredHibernate:insertintoSYSUSER(username,userpasword,lastlogin,userid)values(?,?,?,?) 在最后我们可以看到Hibernate生成的数据库操作语句。走到这里可以说你已经成功的运行了许多东西。让我们再列出来,请你一一考虑一下它们是如何被你运行和部署起来的,它们有什么:EclipseMyEclipseTomcatOracle/OracleJDBCDriverHibernateStruts(其实到现在我们还没有使用到它的功能)查看表中的数据是否更新在DatabaseAccessView中可以很方便的查看数据表中的数据:这样就在DatabaseDataView中看到了SYSUSER表中的数据:留在最后的话本文只是简单的给大家介绍了开发基于Java的Web应用的基础环境,同时介绍了一系列的开发工具和组件。这些工具还有更多的功能,这里就不再一一介绍了,请大家多参考Eclipse、MyEclipse的说明文档,它们还有许多丰富的功能。对于Struts和Hibernate这两个强大的组件最在后续的文章中再慢慢说明。如果你对本文有什么意见和建议请联系我,告诉我你的想法,另外也可以到技术天空BBS的Java版中讨论与Java相关的各种技术。你可以从这里下载到完整的EclipseProject包。另外本文中的所有代码在以下环境中由作者实际测试完全没有问题:Eclipse2.1.2Struts1.1Hibernate2.1.1Tomcat4.1.29/Jetty4.2.15com.tanghan.plugin_0.1.0.12.21JDK1.4.2_02ForWindows/FreeBSD4.8/FreeBSD4.9FreeBSD4.8/FreeBSD4.9/Windows2000/WindowsXPOracle9.2.0.1.0 关闭本页

相关信息

· flash工作流程设计

· KchmViewer 3.1 发布

· 实施电子供应链的意义何在

·  MST








....

58846 49973