CREATE TABLE TAB1
(
COL1 VARCHAR(20) NOT NULL,
COL2 INTEGERQ?br />
PRIMARY KEY(COL1)
);
CREATE TABLE TAB2
(
COL1 VARCHAR(20) NOT NULL,
PRIMARY KEY(COL1)
);
CREATE TABLE TAB3
(
COL1 VARCHAR(20) NOT NULL,
PRIMARY KEY(COL1)
);
CREATE OR REPLACE TRIGGER T_TAB3 BEFORE INSERT ON TAB3 FOR EACH
ROW
DECLARE
NUM1 NUMBER;
BEGIN
NUM1:=1;
LOOP
EXIT WHEN NUM1>10000;
INSERT INTO TAB1 VALUES (NUM1,NUM1);
IF NUM1<=5000 THEN INSERT INTO TAB2 VALUES (NUM1);
END IF;
NUM1:=NUM1+1;
END LOOP;
END;
INSERT INTO TAB3 VALUES('1');
下面Q我们将?个例子来具体说明使用q接替换IN、NOT IN、EXISTS、NOT EXISTS的方法?br /> d?中第2列(COL2Q数据的dQ且其第1列数据存在于?的第1列中?br />
1. 使用IN的SQL语句Q?br />
SELECT SUM(COL2) FROM TAB1 WHERE COL1 IN(SELECT COL1 FROM TAB2)
2. 使用EXISTS的SQL语句Q?br />
SELECT SUM(COL2) FROM TAB1 WHERE EXISTS(SELECT * FROM TAB2 WHERE
TAB1.COL1=TAB2.COL1)
3. 使用q接的SQL语句Q?br />
SELECT SUM(A.COL2) FROM TAB1 A,TAB2 B
WHERE A.COL1=B.COL1 d?中第2列(COL2Q数据的dQ且其第1列数据不存在于表2的第1列中?br />
1. 使用NOT IN的SQL语句Q?br />
SELECT SUM(COL2) FROM TAB1 WHERE COL1 NOT IN(SELECT COL1 FROM TAB2)
2. 使用NOT EXISTS的SQL语句Q?br />
SELECT SUM(COL2) FROM TAB1 WHERE NOT EXISTS(SELECT * FROM TAB2 WHERE
TAB1.COL1=TAB2.COL1)
3. 使用外连接的SQL语句Q?br />
SELECT SUM(A.COL2) FROM TAB1 A,TAB2 B WHERE A.COL1=B.COL1(+) AND
B.COL1 IS NULL
下面介绍IN、NOT IN、EXIST、NOT EXIST在DELETE和UPDATE语句中的效率提高Ҏ?br />
下面所丄例子在Microsoft SQL Server
7.0下运行通过Q但所推荐的方法在各种大型数据库上皆适用。下面,我们创Z些数据库表和数据Q用于D例说明。我们将分别在表AQTAQ中存入
10000条数据,表BQTBQ中存入5000条数据?
SQL语句如下Q?
CREATE TABLE TA
(
CA INT
)
CREATE TABLE TB
(
CA INT
)
CREATE TABLE TC
(
CA INT
)
CREATE TRIGGER TRA ON TC
FOR INSERT
AS
DECLARE @MINT INT
BEGIN
SELECT @MINT=1
WHILE (@MINT<=5000)
BEGIN
INSERT INTO TA VALUES(@MINT)
INSERT INTO TB VALUES(@MINT)
SELECT @MINT=@MINT+1
END
WHILE (@MINT<=10000)
BEGIN
INSERT INTO TA VALUES(@MINT)
SELECT @MINT=@MINT+1
END
END
GO
INSERT INTO TC VALUES(1)
GO
删除表A中表A和表B相同的数?br />
1Q?用IN的SQL语句Q?br />
DELETE FROM TA WHERE TA.CA IN (SELECT CA FROM TB)
2Q?用EXISTS的SQL语句Q?br />
DELETE FROM TA WHERE EXISTS (SELECT * FROM TB WHERE TB.CA=TA.CA)
3Q?使用q接的SQL语句Q?br />
DELETE TA FROM TA,TB WHERE TA.CA=TB.CA 删除表A中表A存在但表B中不存在的数?br />
1. 使用IN的SQL语句Q?br />
DELETE FROM TA WHERE TA.CA NOT IN (SELECT CA FROM TB)
2. 使用EXISTS的SQL语句Q?br />
DELETE FROM TA WHERE NOT EXISTS (SELECT CA FROM TB WHERE TB.CA=TA.CA)
3. 使用q接的SQL语句Q?br />
DELETE TA FROM TA LEFT OUTER JOIN TB ON TA.CA=TB.CA WHERE TB.CA
IS NULL 更新表A中表A和表B相同的数?br />
1. 使用IN的SQL语句Q?br />
UPDATE TA SET CA=CA+10000 WHERE CA IN (SELECT CA FROM TB)
2. 使用EXISTS的SQL语句Q?br />
UPDATE TA SET CA=CA+10000 WHERE EXISTS (SELECT CA FROM TB WHERE
TB.CA=TA.CA)
3. 使用q接的SQL语句Q?br />
UPDATE TA SET TA.CA=TA.CA+10000 FROM TA,TB WHERE TA.CA=TB.CA 更新表A中表A存在但表B中不存在的数?br />
1. 使用IN的SQL语句Q?br />
UPDATE TA SET CA=CA+10000 WHERE CA NOT IN (SELECT CA FROM TB)
2. 使用EXISTS的SQL语句Q?br />
UPDATE TA SET CA=CA+10000 WHERE NOT EXISTS (SELECT CA FROM TB WHERE
TB.CA=TA.CA)
3. 使用q接的SQL语句Q?br />
UPDATE TA SET TA.CA=TA.CA+10000 FROM TA LEFT OUTER JOIN TB ON TA.CA=TB.CA
WHERE TB.CA IS NULL
J2EEq一个品,而是一pd的标准。市Z可以看到很多实现了J2EE的品,如BEA WebLogicQIBM WebSphere以及开?/a>?a target="_new">JBoss{等?/font>
J2EEQ是sun公司提出的一个标准,W合q个标准的品叫"实现"Q其中你下蝲的sun公司的j2ee开发包中就有一个这L"实现"Q? jbossQweblogicQwebsphere都是j2ee标准的一?实现"。由于jbossQweblogicQwebsphere自n带有 j2ee?a target="_new">apiQ所以可以不使用sun的j2ee实现?/font>
一. J2EE的概?/strong>
目前QJava 2q_?个版本,它们是适用于小型设备和卡的Java 2q_Micro版(Java 2 Platform Micro EditionQ?a target="_new">J2MEQ、适用于桌面系l的Java 2q_标准版(Java 2 Platform Standard EditionQJ2SEQ、适用于创建服务器应用E序和服务的Java2q_企业版(Java 2 Platform Enterprise EditionQJ2EEQ?/font>
J2EE是一U利用Java 2q_来简化企业解x案的开发、部|和理相关的复杂问题的体系l构。J2EE技术的基础是核心Javaq_或Java 2q_的标准版QJ2EE不仅巩固了标准版中的许多优点Q例?~写一ơ、随处运?的特性、方便存?a target="_new">数据?/a>?a target="_new">JDBC API?a target="_new">CORBA技术以及能够在Internet应用中保护数据的安全模式{等Q同时还提供了对 EJBQ?a target="_new">Enterprise JavaBeansQ、Java Servlets API、JSPQJava Server PagesQ以及XML技术的全面支持。其最l目的就是成Z个能够企业开发者大q羃短投攑ָ场时间的体系l构?
J2EE体系l构提供中间?/a>集成框架用来满无需太多费用而又需要高可用性、高可靠性以及可扩展性的应用?a target="_new">需?/a>。通过提供l一的开发^収ͼJ2EE降低了开发多层应用的费用和复杂性,同时提供对现有应用程序集成强有力支持Q完全支持Enterprise JavaBeansQ有良好的向导支持打包和部v应用Q添加目录支持,增强了安全机Ӟ提高了性能?/font>
? J2EE的优?/strong>
J2EE为搭建具有可伸羃性、灵zL、易l护性的商务pȝ提供了良好的机制:
保留现存的IT资: ׃企业必须适应新的商业需求,利用已有的企?a target="_new">信息pȝ斚w的投资,而不是重新制定全盘方案就变得很重要。这P一个以渐进的(而不是激q的Q全盘否定的Q方式徏立在已有pȝ之上的服务器端^台机制是公司所需求的。J2EE架构?
以充分利用用户原有的投资Q如一些公怋用的BEA Tuxedo、IBM CICS, IBM Encina,、Inprise
VisiBroker 以及Netscape Application
Server。这之所以成为可能是因ؓJ2EE拥有q泛的业界支持和一些重要的'企业计算'领域供应商的参与。每一个供应商都对现有的客h供了不用废弃
已有投资Q进入可UL的J2EE领域的升U途径。由于基于J2EEq_的品几乎能够在M操作pȝ和硬仉|上q行Q现有的操作pȝ和硬件也能被保留使用?/font>
高效的开? J2EE允许公司把一些通用的、很J琐的服务端d交给中间?/a>供应商去完成。这样开发h员可以集中精力在如何创徏商业逻辑上,相应地羃短了开发时间。高U中间g供应商提供以下这些复杂的中间件服?
状态管理服?-- 让开发h员写更少的代码,不用兛_如何理状态,q样能够更快地完成程序开发?br /> 持箋性服?-- 让开发h员不用对数据讉K逻辑q行~码p~写应用E序Q能生成更轻巧,与数据库无关的应用程序,q种应用E序更易于开发与l护?br /> 分布式共享数?a target="_new">对象CACHE服务 -- 让开发h员编刉性能的系l,极大提高整体部v的~性?br /> 支持异构环境: J2EE能够开发部|在异构环境中的可移植程序。基于J2EE的应用程序不依赖M特定操作pȝ、中间g、硬件。因此设计合理的ZJ2EE的程序只需开 发一ơ就可部|到各种q_。这在典型的异构企业计算环境中是十分关键的。J2EE标准也允许客戯购与J2EE兼容的第三方的现成的lgQ把他们部v到异构环境中Q节省了p己制订整个方案所需的费用?br /> 可~? 企业必须要选择一U服务器端^収ͼq种q_应能提供极佳的可伸羃性去满那些在他们系l上q行商业q作的大Ҏ客户。基于J2EEq_的应用程序可被部|? 到各U操作系l上。例如可被部|到高端UNIX与大型机pȝQ这U系l单机可支持64?56个处理器。(q是NT服务器所望尘莫及的)J2EE领域的供 应商提供了更为广泛的负蝲q{略。能消除pȝ中的瓉Q允许多台服务器集成部v。这U部|可达数千个处理器,实现可高度~的pȝQ满x来商业应用的 需要?br /> E_的可用? 一个服务器端^台必能全天候运转以满公司客户、合作伙伴的需要。因为INTERNET是全球化的、无处不在的Q即使在夜间按计划停Z可能造成严重? 失。若是意外停机,那会有灾难性后果。J2EE部v到可靠的操作环境中,他们支持长期的可用性。一些J2EE部v在WINDOWS环境中,客户也可选择? 壮性能更好的操作系l如Sun Solaris、IBM OS/390。最健壮的操作系l可辑ֈ99.999%的可用性或每年只需5分钟停机旉。这是实时性很强商业系l理想的选择?/font>
? J2EE 的四层模?/strong>
J2EE使用多层的分布式应用模型Q应用逻辑按功能划分ؓlgQ各个应用组件根据他们所在的层分布在不同的机器上。事实上Qsun设计J2EE的初h是ؓ了解决两层模?client/server)的弊端,在传l模式中Q?a target="_new">客户?/a>? 当了q多的角色而显得臃肿,在这U模式中Q第一ơ部|的时候比较容易,但难于升U或改进Q可伸展性也不理惻I而且l常Z某种专有的协议――通常是某U数 据库协议。它使得重用业务逻辑和界面逻辑非常困难。现在J2EE 的多层企业应用模型两层化模型中的不同层面切分成许多层。一个多层化应用能够Z同的每种服务提供一个独立的层,以下?J2EE 典型的四层结?
q行在客L机器上的客户层组?br /> q行在J2EE服务器上的Web层组?br /> q行在J2EE服务器上的业务逻辑层组?br /> q行?a target="_new">EIS服务器上的企业信息系l?Enterprise information system)?a target="_new">软g
J2EE应用E序lg
J2EE应用E序是由lg构成?J2EElg是具有独立功能的软g单元Q它们通过相关?a target="_new">c?/a>?a target="_new">文gl装成J2EE应用E序Qƈ与其他组件交互。J2EE说明书中定义了以下的J2EElg:
应用客户端程序和applets是客户层lg.
Java Servlet和JavaServer Pages(JSP)是web层组?
Enterprise JavaBeans(EJB)是业务层lg.
客户层组?br /> J2EE应用E序可以是基于web方式?也可以是Z传统方式?
web 层组件J2EE web层组件可以是JSP 面或Servlets.按照J2EE规范Q静态的HTML面和Applets不算是web层组件?/font>
正如下图所C的客户层那Pweb层可能包含某?JavaBean 对象来处理用戯入,q把
输入发送给q行在业务层上的enterprise bean 来进行处理?/font>
业务层组?br /> 业务层代码的逻辑用来满银行Q零售,金融{特D商务领域的需?p行在业务层上的enterprise bean q行处理. 下图表明了一个enterprise bean 是如何从客户端程序接收数据,q行处理(如果必要的话), q发送到EIS 层储存的Q这个过E也可以逆向q行?/font>
有三U企业的bean: 会话(session) beans, 实体(entity) beans, ?消息? ?message-driven) beans. 会话bean 表示与客LE序的时交? 当客LE序执行完后, 会话bean 和相x据就会消? 相反, 实体bean 表示数据库的表中一行永久的记录. 当客LE序中止或服务器关闭? ׃有潜在的服务保证实体bean 的数据得以保?消息驱动 bean l合了会话bean ?JMS的消息监听器的特? 允许一个业务层lg异步接收JMS 消息.
企业信息pȝ?br /> 企业信息pȝ层处理企业信息系l?a target="_new">软g?/a>括企业基pȝ例如企业资源计划 (ERP), 大型Z务处? 数据库系l?/a>,和其它的遗留信息pȝ. 例如QJ2EE 应用lg可能Z数据库连接需要访问企业信息系l?/font>
我们J2EE的各U组件、服务和APIQ进行更加详l的阐述Q看看在开发不?a target="_new">cd的企业应用ӞҎ各自需求和目标的不同,应当如何灉|使用q组合不同的lg和服务?/font>
· Servlet
Servlet是Javaq_上的CGI技术。Servlet在服务器端运行,动态地生成Web面。与传统的CGI和许多其它类似CGI的技术相比, Java Servleth更高的效率ƈ更容易用。对于ServletQ重复的h不会D同一E序的多ơ{载,它是依靠U程的方式来支持q发讉K的?/font>
· JSP
JSP(Java Server Page)是一U实现普通静态HTML和动态页面输出合编码的技术。从q一Ҏ看,非常cMMicrosoft ASP?a target="_new">PHP{? 技术。借助形式上的内容和外观表现的分离QWeb面制作的Q务可以比较方便地划分l页面设计h员和E序员,q方便地通过JSP来合成。在q行时态, JSP会被首先{换成ServletQƈ以Servlet的Ş态编译运行,因此它的效率和功能与Servlet相比没有差别Q一样具有很高的效率?/font>
· EJB
EJB定义了一l可重用的组ӞEnterprise Beans。开发h员可以利用这些组Ӟ像搭U木一样徏立分布式应用。在装配lgӞ所有的Enterprise Beans都需要配|到EJB服务?一般的Weblogic、WebSphere{?a target="_new">J2EE应用服务?/a>? 是EJB服务?中。EJB服务器作为容器和低层q_的桥梁管理着EJB容器Qƈ向该容器提供讉Kpȝ服务的能力。所有的EJB实例都运行在EJB容器 中。EJB容器提供了系l的服务,控制了EJB的生命周期。EJB容器为它的开发h员代了诸如安全性、远E连接、生命周期管理及事务理{技术环节, 化了商业逻辑的开发。EJB中定义了三种Enterprise BeansQ?/font>
?Session Beans
?Entity Beans
?Message-driven Beans
· JDBC
JDBC(Java Database ConnectivityQ?a target="_new">Java数据库连?/a>)API是一个标?a target="_new">SQL(Structured Query LanguageQ? l构化查询语a)数据库访问接口,它数据库开发h员能够用标准Java API~写数据库应用程序。JDBC API主要用来q接数据库和直接调用SQL命o执行各种SQL语句。利用JDBC API可以执行一般的SQL语句、动态SQL语句及带IN和OUT参数的存储过E。Java中的JDBC相当与Microsoftq_中的ODBC(Open Database Connectivity)?/font>
· JMS
JMS(Java Message ServiceQ?a target="_new">Java消息服务) 是一lJava应用接口Q它提供创徏、发送、接收、读取消息的服务。JMS API定义了一l公q应用E序接口和相应语法,使得Java应用能够和各U消息中间gq行通信Q这些消息中间g包括IBM MQ-Series、Microsoft MSMQ及纯Java的SonicMQ。通过使用JMS APIQ开发h员无需掌握不同消息产品的用方法,也可以用统一的JMS API来操U各U消息中间g。通过使用JMSQ能够最大限度地提升消息应用的可UL性?JMS既支持点对点的消息通信Q也支持发布/订阅式的消息通信?/font>
· JNDI
׃J2EE应用E序lg一般分布在不同的机器上Q所以需要一U机制以便于lg客户使用者查扑֒引用lg及资源。在J2EE体系中,使用JNDI (Java Naming and Directory Interface)定位各种对象Q这些对象包括EJB、数据库驱动、JDBC数据源及消息q接{。JNDI API为应用程序提供了一个统一的接口来完成标准的目录操作,如通过对象属性来查找和定位该对象。由于JNDI是独立于目录协议的,应用q可以? JNDI讉K各种特定的目录服务,如LDAP、NDS和DNS{?/font>
· JTA
JTA(Java Transaction API)提供了J2EE中处理事务的标准接口Q它支持事务的开始、回滚和提交。同时在一般的J2EEq_上,L供一个JTS(Java Transaction Service)作ؓ标准的事务处理服务,开发h员可以用JTA来用JTS?/font>
· JCA
JCA(J2EE Connector Architecture)是J2EE体系架构的一部分Qؓ开发h员提供了一套连接各U企业信息系l?EISQ包括ERP?a target="_new">SCM、CRM{?的体pL构,对于EIS开发商而言Q它们只需要开发一套基于JCA的EISq接适配器,开发h员就能够在Q何的J2EE应用服务器中q接q用它。基于JCA的连接适配器的实现Q需要涉及J2EE中的事务理、安全管理及q接理{服务组件?/font>
· JMX
JMX(Java Management Extensions)的前w是JMAPI。JMX致力于解军_布式pȝ理的问题。JMX是一U?a target="_new">应用~程接口? 可扩展对象和Ҏ的集合体Q可以跨各U异构操作系l^台、系l体pȝ构和|络传输协议Q开发无~集成的面向pȝ、网l和服务的管理应用。JMX是一个完 整的|络理应用E序开发环境,它同时提供了厂商需要收集的完整的特性清单、可生成资源清单表格、图形化的用h口;讉KSNMP的网lAPIQ主机间q程q程调用Q数据库讉KҎ{?/font>
· JAAS
JAAS(Java Authentication and Authorization Service)实现了一个Java版本的标准Pluggable Authentication Module(PAM)的框架。JAAS可用来进行用戯n份的鉴定Q从而能够可靠ƈ安全地确定谁在执行Java代码。同时JAASq能通过对用戯行授 权,实现Z用户的访问控制?/font>
· JACC
JACC(Java Authorization Service Provider Contract for Containers)在J2EE应用服务器和特定的授权认证服务器之间定义了一个连接的协约Q以便将各种授权认证服务器插入到J2EE产品中去?/font>
· JAX-RPC
通过使用JAX-RPC(Java API for XML-based RPC)Q已有的JavacLJava应用都能够被重新包装Qƈ以Web Services的Ş式发布。JAX-RPC提供了将RPC参数(in/out)~码和解码的APIQ开发h员可以方便地使用SOAP消息来完成RPC 调用。同P对于那些使用EJB(Enterprise JavaBeans)的商业应用而言Q同样可以用JAX-RPC来包装成Web服务Q而这个Web Servoce的WSDL界面是与原先的EJB的方法是对应一致的。JAX-RPC为用户包装了Web服务的部|和实现Q对Web服务的开发h员而言Q? SOAP/WSDL变得透明Q这有利于加速Web服务的开发周期?/font>
· JAXR
JAXRQJava API for XML RegistriesQ提供了与多U类型注册服务进行交互的API。JAXRq行客户端访问与JAXR规范相兼容的Web ServcicesQ这里的Web Services即ؓ注册服务。一般来_注册服务L以Web Services的Ş式运行的。JAXR支持三种注册服务cdQJAXR Pluggable Provider、Registry-specific JAXR Provider、JAXR Bridge Provider(支持UDDI Registry和ebXML Registry/Repository{??/font>
· SAAJ
SAAJ(SOAP with Attachemnts API for Java)是JAX-RPC的一个增强,行低层次的SOAP消息操纵提供了支持?/font>
? J2EE 的结?/strong>
q种ZlgQ具有^台无x的J2EE l构使得J2EE E序的编写十分简单,因ؓ业务逻辑被封装成可复用的lgQƈ且J2EE 服务器以容器的Ş式ؓ所有的lgcd提供后台服务. 因ؓ你不用自己开发这U服? 所以你可以集中_֊解决手头的业务问?
容器和服?/font>
容器讄定制了J2EE服务器所提供得内在支持,包括安全Q事务管理,JNDI(Java Naming and Directory Interface)d,q程q接{服务,以下列出最重要的几U服务:
J2EE安全(Security)模型可以让你配置 web lg或enterprise bean ,q样只有被授权的用户才能讉Kpȝ资源. 每一客户属于一个特别的角色Q而每个角色只允许Ȁzȝ定的Ҏ。你应在enterprise bean的布|描qC声明角色和可被激zȝҎ。由于这U声明性的ҎQ你不必~写加强安全性的规则?/font>
J2EE 事务理QTransaction ManagementQ模型让你指定组成一个事务中所有方法间的关p,q样一个事务中的所有方法被当成一个单一的单? 当客LȀzM个enterprise bean中的ҎQ容器介入一理事务。因有容器管理事务,在enterprise bean中不必对事务的边界进行编码。要求控制分布式事务的代码会非常复杂。你只需在布|描q文件中声明enterprise bean的事务属性,而不用编写ƈ调试复杂的代码。容器将L文gqؓ你处理此enterprise bean的事务?/font>
JNDI d(JNDI Lookup)服务向企业内的多重名字和目录服务提供了一个统一的接?q样应用E序lg可以讉K名字和目录服?
J2EEq程q接QRemote Client ConnectivityQ模型管理客L和enterprise bean间的低层交互. 当一个enterprise bean创徏? 一个客L可以调用它的Ҏp它和客户端位于同一虚拟Z一?
生存周期理QLife Cycle ManagementQ模型管理enterprise bean的创建和U除,一个enterprise bean在其生存周期中将会历l几U状态。容器创建enterprise beanQƈ在可用实例池与活动状态中Ud他,而最l将其从容器中移除。即使可以调用enterprisebean的create及removeҎQ容 器也会在后台执行这些Q务?/font>
五、企业应用CZ
下面我们通过假设一个企业应用的J2EE实现Q来了解各种lg和服务的应用。假讑ֺ用对象是计算?/a>产品的生产商/零售商的销售系l,q个销售系l能够通过自己的网站发布品信息,同时也能品目录传送给计算Z品交易市场。销售系l能够在U接受订?来自自己的Web|站或者来自计机产品交易市场)Qƈ随后转入内部企业理pȝq行相关的后l处理?/font>
参见?Q这个企业应用可以这U方式架构。该企业应用的核心是产品目录理和品定购管理这两个业务逻辑Q用EJB加以实现Qƈ部v在EJB容器中。由于品目录和定购信息都需要持久化Q因此用JDBCq接数据库,q用JTA来完成数据库存取事务?/font>
? J2EE应用CZ
然后使用JSP/Servlet来实现应用的Web表现Q在U品目录浏览和在线定购。ؓ了将产品目录发送给特定的交易市场,使用JMS实现异步的基于消 息的产品目录传输。ؓ了得更多的其它外部交易市场能够集成产品目录和定购业务,需要用Web Services技术包装商业逻辑的实现。由于品定购管理需要由公司内部雇员q行处理Q因此需要集成公司内部的用户pȝ和访问控制服务以方便雇员的 用,使用JACC集成内部的访问控制服务,使用JNDI集成内部的用L录,q用JAASq行讉K控制。由于品订购事务会触发后箋的企业ERPpȝ? 相关操作(包括仓储、胦务、生产等)Q需要用JCAq接企业ERP?/font>
最后ؓ了将q个应用U_C业整体的pȝ理体系中去Q用Application Client架构了一个管理客L(与其它企业应用管理应用部|在一台机器上)Qƈ通过JMX理q个企业应用?/font>
(
摘自中科永联
高技术培训中?/font>
)
moneyice 发表? 2006 q?06 ?19 ?
~写JUnit试的理?/font>
·JUnit在保证质量的同时提高代码~写速度
看v来不可思议Q但是事实。用JUnit后,花在调试的时间就会更,在改变代码的时候更有信心。有了这U信心,你可以在重构代码Q添加新Ҏ的时候更有闯劌Ӏ?
?
果没有测试,那么重构或者添加新Ҏ很Ҏ成ؓ妄想Q因Z无法知晓什么地方会被破坏掉。如果拥有完善的试套,在改变代码后Q立卌行测试,q样可?
得到信心Q你的改变没有破坏Q何东ѝ当q行试Ӟ如果出bugQ因Z码在脑v里还很清楚,所以bug很容易被解决。用JUnit~写试Q可?
使你的代码编写达到极限速度Q而且快速定位bug?
·JUnit 及其?br />试应该很简单,q一点很关键。如果测试太复杂Q花费太多时_~写试׃太值得了。用JUnitQ你可以快速的写出试代码来验证程序。随着软g的增长相应的增加试代码?br />使用JUnitQ运行测试也变得很简单而且很快速?br />·JUnit 验证它们自己的结果,而且能够立即反馈
JUnit试能够自动q行Q它们检查自w的l果。运行测试后Q你会立卛_到可视化的反馈,试通过或者失败。不需要手工来输出试l果报告?br />·JUnit 试可以被组合ؓ不同层次的测试套
JUnit试可以被整合到试套中Q测试套可以包含试用例或者其他的试套。JUnit试的组合行Z你可以聚集一l测试用例ؓ一个测试套Q也可以多个测试套l合C个测试套中。你可以q行M一个层ơ的试套?br />·~写 JUnit 试代h很小
使用JUnit试框架Q你可以代h很小的编写测试,而且享受着试框架提供的便利。写试单到Q就是编写一个方法,使用一下要试的代码,定义一个期望的l果?
·JUnit 试增强了Y件的E_性。测试越,代码的稳定性就差。测试验证了软g的稳定性,保证了更Ҏ有在目中引hLUҎ应?/font>
JUnit 试是程序员的测试。JUnit试是用来提高程序员的效率和代码质量。与功能试不同Q功能测试是整个系l视作黑盒,从整体保证Y件有效。单元测试是 用来试实现基本功能的代码块。程序员~写q维护JUnit试代码。当一ơ开发P代完成,试代码也要同步的更斎ͼ作ؓҎơP代的质量验证?
试习惯
~写JUnit试Ӟ保以下牢记在心:
·只用试到的地方才会q行的很好?br />·一?写一? 一?写一?..
·取保所有的试都要执行?br />·最每天一ơ运行所有的试用例 (或一??br />·为最有破坏可能性的代码~写完善的测试?br />·Z最有可能获得回报的地方~写试?br />·如果你L在调试某个地方,~写JUnit试自动验证l果来代替调试?br />·如果有bug被报告,~写试来暴露这个bug?br />·有h让你帮助调试的时候,帮助他写试用例?br />·在编写代码之前编写单元测试代码,只有试p|的时候才写新代码。写最单的C码让试通过?br />