﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-nbtymm-随笔分类-Java2EE</title><link>http://www.blogjava.net/nbtymm/category/12091.html</link><description>&lt;/br&gt;&lt;a href="http://www.fastonlineusers.com"&gt;&lt;b&gt;&lt;font color=red&gt;共有&lt;script src=http://fastonlineusers.com/online.php?d=bluedavy.blogjava.net&gt;&lt;/script&gt;人在同时阅读此Blog&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 02:03:33 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 02:03:33 GMT</pubDate><ttl>60</ttl><item><title>Eclipse快速上手指南之使用Ant </title><link>http://www.blogjava.net/nbtymm/archive/2006/08/14/63398.html</link><dc:creator>nbt</dc:creator><author>nbt</author><pubDate>Mon, 14 Aug 2006 01:34:00 GMT</pubDate><guid>http://www.blogjava.net/nbtymm/archive/2006/08/14/63398.html</guid><wfw:comment>http://www.blogjava.net/nbtymm/comments/63398.html</wfw:comment><comments>http://www.blogjava.net/nbtymm/archive/2006/08/14/63398.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/nbtymm/comments/commentRss/63398.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nbtymm/services/trackbacks/63398.html</trackback:ping><description><![CDATA[                                    作者：佚名     来自：J2ME开发网<br /><br />Ant是Java平台下非常棒的批处理命令执行程序，能自动完成编译，测试，打包，部署等等一系列任务。 
<p>　　Ant是Java平台下非常棒的批处理命令执行程序，能非常方便地自动完成编译，测试，打包，部署等等一系列任务，大大提高开发效率。如果你现在还没有开始使用Ant，那就要赶快开始学习使用，使自己的开发水平上一个新台阶。</p><p>　　<a href="http://www.javafan.net/special/eclipse/index.jsp" target="_blank">Eclipse</a> 中已经集成了Ant，我们可以直接在Eclipse中运行Ant。</p><p>　　以前面建立的Hello工程为例，创建以下目录结构：</p><p align="center"><img height="315" src="http://www.javafan.net/uploadfiles/20041220112701100.jpg" width="236" /></p><p>　　新建一个build.xml，放在工程根目录下。build.xml定义了Ant要执行的批处理命令。虽然Ant也可以使用其它文件名，但是遵循标准能更使开发更规范，同时易于与别人交流。</p><p>　　通常，src存放Java源文件，classes存放编译后的class文件，lib存放编译和运行用到的所有jar文件，web存放JSP等web文件，dist存放打包后的jar文件，doc存放API文档。</p><p>　　然后在根目录下创建build.xml文件，输入以下内容： </p><p style="BACKGROUND: #eeeeee">&lt;xml version="1.0"?&gt;<br />&lt;project name="Hello world" default="doc"&gt;<br /><br />&lt;-- properies --&gt;<br />&lt;property name="src.dir" value="src" /&gt;<br />&lt;property name="report.dir" value="report" /&gt;<br />&lt;property name="classes.dir" value="classes" /&gt;<br />&lt;property name="lib.dir" value="lib" /&gt;<br />&lt;property name="dist.dir" value="dist" /&gt;<br />&lt;property name="doc.dir" value="doc"/&gt;<br /><br />&lt;-- 定义classpath --&gt;<br />&lt;path id="master-classpath"&gt;<br />&lt;fileset file="${lib.dir}/*.jar" /&gt;<br />&lt;pathelement path="${classes.dir}"/&gt;<br />&lt;path&gt;<br /><br />&lt;-- 初始化任务 --&gt;<br />&lt;target name="init"&gt;<br />&lt;target&gt;<br /><br />&lt;-- 编译 --&gt;<br />&lt;target name="compile" depends="init" description="compile the source files"&gt;<br />&lt;mkdir dir="${classes.dir}"/&gt;<br />&lt;javac srcdir="${src.dir}" destdir="${classes.dir}" target="1.4"&gt;<br />&lt;classpath refid="master-classpath"/&gt;<br />&lt;javac&gt;<br />&lt;target&gt;<br /><br />&lt;-- 测试 --&gt;<br />&lt;target name="test" depends="compile" description="run junit test"&gt;<br />&lt;mkdir dir="${report.dir}"/&gt;<br />&lt;junit printsummary="on"<br />haltonfailure="false"<br />failureproperty="tests.failed"<br />showoutput="true"&gt;<br />&lt;classpath refid="master-classpath" /&gt;<br />&lt;ormatter type="plain"/&gt;<br />&lt;batchtest todir="${report.dir}"&gt;<br />&lt;fileset dir="${classes.dir}"&gt;<br />&lt;include name="**/*Test.*"/&gt;<br />&lt;fileset&gt;<br />&lt;batchtest&gt;<br />&lt;junit&gt;<br />&lt;fail if="tests.failed"&gt;<br />***********************************************************<br />**** One or more tests failed! Check the output ... ****<br />***********************************************************<br />&lt;fail/&gt;<br />&lt;target/&gt;<br /><br />&lt;-- 打包成jar --&gt;<br />&lt;target name="pack" depends="test" description="make .jar file"&gt;<br />&lt;mkdir dir="${dist.dir}" /&gt;<br />&lt;jar destfile="${dist.dir}/hello.jar" basedir="${classes.dir}"&gt;<br />&lt;xclude name="**/*Test.*" /&gt;<br />&lt;xclude name="**/Test*.*" /&gt;<br />&lt;jar/&gt;<br />&lt;targe/t&gt;<br /><br />&lt;-- 输出api文档 --&gt;<br />&lt;target name="doc" depends="pack" description="create api doc"&gt;<br />&lt;mkdir dir="${doc.dir}" /&gt;<br />&lt;javadoc destdir="${doc.dir}"<br />author="true"<br />version="true"<br />use="true"<br />windowtitle="Test API"&gt;<br />&lt;packageset dir="${src.dir}" defaultexcludes="yes"&gt;<br />&lt;include name="example/**" /&gt;<br />&lt;packageset/&gt;<br />&lt;doctitle&gt;[CDATA[&lt;1&gt;ello, test&lt;h1&gt;]&gt;doctitle&gt;<br />&lt;dottom&gt;[CDATA[&lt;&gt;ll Rights Reserved.&lt;i&gt;]&gt;bottom&gt;<br />&lt;tag name="todo" scope="all" description="To do:" /&gt;<br />&lt;javadoc/&gt;<br />&lt;target/&gt;<br />&lt;project/&gt;</p><p>　　以上xml依次定义了init（初始化），compile（编译），test（测试），doc（生成文档），pack（打包）任务，可以作为模板。</p><p>　　选中Hello工程，然后选择“Project”，“Properties”，“Builders”，“New…”，选择“Ant Build”：</p><p align="center"><img height="546" src="http://www.javafan.net/uploadfiles/20041220112701200.jpg" width="604" /></p><p>　　填入Name：Ant_Builder；Buildfile：build.xml；Base Directory：${workspace_loc:/Hello}（按“Browse Workspace”选择工程根目录），由于用到了junit.jar包，搜索Eclipse目录，找到junit.jar，把它复制到Hello/lib目录下，并添加到Ant的Classpath中：</p><p align="center"><img height="546" src="http://www.javafan.net/uploadfiles/20041220112701300.jpg" width="604" /></p><p>　　然后在Builder面板中钩上Ant_Build，去掉Java Builder：</p><p align="center"><img height="283" src="http://www.javafan.net/uploadfiles/20041220112701400.jpg" width="459" /></p><p>　　再次编译，即可在控制台看到Ant的输出：</p><p style="BACKGROUND: #eeeeee">Buildfile: F:\eclipse-projects\Hello\build.xml<br /><br />init:<br /><br />compile:<br />[mkdir] Created dir: F:\eclipse-projects\Hello\classes<br />[javac] Compiling 2 source files to F:\eclipse-projects\Hello\classes<br /><br />test:<br />[mkdir] Created dir: F:\eclipse-projects\Hello\report<br />[junit] Running example.HelloTest<br />[junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.02 sec<br /><br />pack:<br />[mkdir] Created dir: F:\eclipse-projects\Hello\dist<br />[jar] Building jar: F:\eclipse-projects\Hello\dist\hello.jar<br /><br />doc:<br />[mkdir] Created dir: F:\eclipse-projects\Hello\doc<br />[javadoc] Generating Javadoc<br />[javadoc] Javadoc execution<br />[javadoc] Loading source files for package example...<br />[javadoc] Constructing Javadoc information...<br />[javadoc] Standard Doclet version 1.4.2_04<br />[javadoc] Building tree for all the packages and classes...<br />[javadoc] Building index for all the packages and classes...<br />[javadoc] Building index for all classes...<br />[javadoc] Generating F:\eclipse-projects\Hello\doc\stylesheet.css...<br />[javadoc] Note: Custom tags that could override future standard tags: @todo. To avoid potential overrides, use at least one period character (.) in custom tag names.<br />[javadoc] Note: Custom tags that were not seen: @todo<br />BUILD SUCCESSFUL<br />Total time: 11 seconds </p><p>　　Ant依次执行初始化，编译，测试，打包，生成API文档一系列任务，极大地提高了开发效率。将来开发J2EE项目时，还可加入部署等任务。并且，即使脱离了Eclipse环境，只要正确安装了Ant，配置好环境变量ANT_HOME=&lt;nt解压目录&gt;Path=…;%ANT_HOME%\bin，在命令行提示符下切换到Hello目录，简单地键入ant即可。</p><img src ="http://www.blogjava.net/nbtymm/aggbug/63398.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nbtymm/" target="_blank">nbt</a> 2006-08-14 09:34 <a href="http://www.blogjava.net/nbtymm/archive/2006/08/14/63398.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IIS 集成 Tomcat </title><link>http://www.blogjava.net/nbtymm/archive/2006/07/06/56887.html</link><dc:creator>nbt</dc:creator><author>nbt</author><pubDate>Thu, 06 Jul 2006 00:46:00 GMT</pubDate><guid>http://www.blogjava.net/nbtymm/archive/2006/07/06/56887.html</guid><wfw:comment>http://www.blogjava.net/nbtymm/comments/56887.html</wfw:comment><comments>http://www.blogjava.net/nbtymm/archive/2006/07/06/56887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nbtymm/comments/commentRss/56887.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nbtymm/services/trackbacks/56887.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 制作环境：																										  						Windows 2003 + IIS6、jre1.5.0_06、apache-tomcat-5.5.17																						 																								首先需要做以下准备工作								...&nbsp;&nbsp;<a href='http://www.blogjava.net/nbtymm/archive/2006/07/06/56887.html'>阅读全文</a><img src ="http://www.blogjava.net/nbtymm/aggbug/56887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nbtymm/" target="_blank">nbt</a> 2006-07-06 08:46 <a href="http://www.blogjava.net/nbtymm/archive/2006/07/06/56887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于J2EE轻量级架构的多层应用的研究 (转载自http://www.blogjava.net/caoqingsong/archive/2006/06/16/53158.html)</title><link>http://www.blogjava.net/nbtymm/archive/2006/06/16/53191.html</link><dc:creator>nbt</dc:creator><author>nbt</author><pubDate>Fri, 16 Jun 2006 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/nbtymm/archive/2006/06/16/53191.html</guid><wfw:comment>http://www.blogjava.net/nbtymm/comments/53191.html</wfw:comment><comments>http://www.blogjava.net/nbtymm/archive/2006/06/16/53191.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nbtymm/comments/commentRss/53191.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nbtymm/services/trackbacks/53191.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1  								  																				J2EE						多层应用分析																		1.1          								J2EE				层次结构																																		J2EE				的三层结构在业界是指表示...&nbsp;&nbsp;<a href='http://www.blogjava.net/nbtymm/archive/2006/06/16/53191.html'>阅读全文</a><img src ="http://www.blogjava.net/nbtymm/aggbug/53191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nbtymm/" target="_blank">nbt</a> 2006-06-16 11:20 <a href="http://www.blogjava.net/nbtymm/archive/2006/06/16/53191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ant+cactus+tomcat5.5容器内单元测试简明手册</title><link>http://www.blogjava.net/nbtymm/archive/2006/06/12/52167.html</link><dc:creator>nbt</dc:creator><author>nbt</author><pubDate>Mon, 12 Jun 2006 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/nbtymm/archive/2006/06/12/52167.html</guid><wfw:comment>http://www.blogjava.net/nbtymm/comments/52167.html</wfw:comment><comments>http://www.blogjava.net/nbtymm/archive/2006/06/12/52167.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nbtymm/comments/commentRss/52167.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nbtymm/services/trackbacks/52167.html</trackback:ping><description><![CDATA[
		<div class="center">
				<h4>摘要:</h4>折腾了一个星期，终于搞定ant+cactus+tomcat5.5容器内单元测试，为感谢cleverpig斑竹的热心回贴，特首发于matrix apache版。 </div>
		<div class="right">
				<div class="help">
						<h4>文章工具</h4>
						<a href="http://www.matrix.org.cn/favorite.shtml;jsessionid=70E464F4A6F960A00ACB9C782C527E45?type=article&amp;title=ant%252Bcactus%252Btomcat5.5%25E5%25AE%25B9%25E5%2599%25A8%25E5%2586%2585%25E5%258D%2595%25E5%2585%2583%25E6%25B5%258B%25E8%25AF%2595%25E7%25AE%2580%25E6%2598%258E%25E6%2589%258B%25E5%2586%258C&amp;url=resource%2Farticle%2F44%2F44173_ant%2Bcactus%2Btomcat5.5.html">收藏</a>
						<br />
						<a href="http://www.matrix.org.cn/resource/article/44/44173_ant+cactus+tomcat5.5.html#avote">投票评分</a>
						<br />
						<a href="http://www.matrix.org.cn/resource/article/44/44173_ant+cactus+tomcat5.5.html#areview">发表评论</a>
						<br />
						<a onclick="copyLink('ant+cactus+tomcat5.5容器内单元测试简明手册');" href="http://www.matrix.org.cn/resource/article/44/44173_ant+cactus+tomcat5.5.html#">复制链接</a>
						<br />
				</div>
		</div>
		<!-- end of summary line -->
		<div class="overflow" id="text">折腾了一个星期，终于搞定ant+cactus+tomcat5.5容器内单元测试，为感谢cleverpig斑竹(<a href="http://blog.matrix.org.cn/page/cleverpig" target="_new">http://blog.matrix.org.cn/page/cleverpig</a>)的热心回贴，特首发于matrix apache版。关于ant的使用，请搜索ant的使用手册，网上大把中文的。<br /><br /><span style="COLOR: blue">一、下载并解压缩cactus</span><br />下载地址为<a href="http://apache.freelamp.com/jakarta/cactus/binaries/jakarta-cactus-12-1.7.1.zip" target="_new">http://apache.freelamp.com/jakarta/cactus/binaries/jakarta-cactus-12-1.7.1.zip</a>。将cactus的lib目录下的cactus-ant-1.7.1.jar复制到ant的lib目录。<br /><br /><br /><span style="COLOR: blue">二、配置cactus</span><br />cactus的配置很简单，新建一个cactus.properties文件，并把它放在ant脚本中的cactus任务的classpath下，文件中包括如下内容<br /><pre class="overflow">cactus.sysproperties=cactus.contextURL<br />#cactus-sample-servlet-cactified就是你的测试应用所在路径，8080是端口号<br />cactus.contextURL = http://localhost:8080/cactus-sample-servlet-cactified<br />cactus.servletRedirectorName = ServletRedirector<br />cactus.jspRedirectorName = JspRedirector<br />cactus.filterRedirectorName = FilterRedirector </pre><br />具体的做法结合ant脚本再进一步解释。<br /><br /><span style="COLOR: blue">三、运行ant脚本</span><br />  ant脚本主要执行以下任务<br /><br /><span style="COLOR: green">1、设定classpath</span><br />    <pre class="overflow">&lt;path id="project.classpath"&gt;<br />        &lt;fileset dir="${lib.dir}"&gt;<br />           &lt;include name="*.jar"/&gt;<br />        &lt;/fileset&gt;<br />        &lt;!-- cactus.properties文件就需要放在lib.dir所对应的路径中 --&gt;<br />        &lt;pathelement location="${lib.dir}"/&gt;<br />        &lt;pathelement location="${tomcat.home}/common/lib/jsp-api.jar"/&gt;<br />        &lt;pathelement location="${tomcat.home}/common/lib/servlet-api.jar"/&gt;<br />    &lt;/path&gt;</pre><br /><br /><span style="COLOR: green">2、定义相关任务</span><br />   <pre class="overflow">&lt;taskdef resource="cactus.tasks" classpathref="project.classpath"/&gt;<br />   &lt;taskdef name="runservertests" classname="org.apache.cactus.integration.ant.RunServerTestsTask"&gt;<br />            &lt;classpath&gt;<br />                &lt;path refid="project.classpath"/&gt;<br />            &lt;/classpath&gt;<br />        &lt;/taskdef&gt;</pre><br /><br /><span style="COLOR: green">3、编译应用的类文件和测试的类文件</span><br /><br /><span style="COLOR: green">4、打包整个应用为war文件</span><br />需要注意的是，不仅要打包应用类，测试类也要打包<br />   <br />   <pre class="overflow">&lt;target name="war" depends="compile.java"<br />            description="Generate the runtime war"&gt;<br /><br />        &lt;war warfile="${target.dir}/${project.name}.war"<br />             webxml="${src.webapp.dir}/WEB-INF/web.xml"&gt;<br />            &lt;fileset dir="${src.webapp.dir}"&gt;<br />                &lt;exclude name="cactus-report.xsl"/&gt;<br />                &lt;exclude name="WEB-INF/cactus-web.xml"/&gt;<br />                &lt;exclude name="WEB-INF/web.xml"/&gt;<br />            &lt;/fileset&gt;<br />            &lt;classes dir="${target.classes.java.dir}"/&gt;<br />            &lt;!-- 别忘了打包测试类 --&gt;<br />            &lt;classes dir="${target.classes.test.dir}"/&gt;<br />            &lt;!-- 别忘了打包各种相关的jar文件 --&gt;<br />            &lt; lib dir="project.classpath"/&gt;<br />        &lt;/war&gt;<br />    &lt;/target&gt;</pre><br /><br /><span style="COLOR: green">5、在应用的web.xml文件中添加测试所需的各种映射</span><br />cactus提供了两个task来完成这个工作，CactifyWar和WebXmlMerge。<br />CactifyWar的功能是自动在已经打包的应用的web.xml文件中添加所需的映射。WebXmlMerge是提供合并两个web.xml文件的功能。<br /><pre class="overflow">&lt;target name="test.prepare"<br />            depends="war, compile.cactus, test.prepare.logging"&gt;<br /><br />        &lt;!-- Cactify the web-app archive --&gt;<br />        &lt;cactifywar srcfile="${target.dir}/${project.name}.war"<br />                    destfile="${tomcat.home}/webapps/${project.name}-cactified.war"<br />                &gt;<br />            &lt;classes dir="${target.classes.java.dir}"/&gt;<br />            &lt;classes dir="${target.classes.test.dir}"/&gt;<br />            &lt;lib dir="project.classpath"/&gt;<br />       &lt;/cactifywar&gt;<br />&lt;/target&gt;</pre><br /><br /><span style="COLOR: green">6、运行测试</span><br />cactus提供了cactus和RunServerTests两个task来运行测试。<br />"cactus" task是通过复制容器服务器的最小文件并运行来运行测试，因此需要制定容器服务器的类型，启动速度稍快点，另外配置比较方便，但是无法测试象tomcat连接池等资源。另外对tomcat5.5的支持也不好。<br />"RunServerTests"是通过直接启动容器服务起来运行测试，因此速度稍慢，且配置较麻烦，但能测试各种资源。<br />   <pre class="overflow">&lt;target name="test" depends="test.prepare"<br />             description="Run tests on Tomcat "&gt;<br /><br />        &lt;!-- Start the servlet engine, wait for it to be started, run the<br />             unit tests, stop the servlet engine, wait for it to be stopped.<br />             The servlet engine is stopped if the tests fail for any reason --&gt;<br />        &lt;!-- 8080是服务器的端口号，${project.name}-cactified是项目的路径，和上一步的cactifywar 的destfile相对应 --&gt;<br />        &lt;runservertests<br />                testURL="http://localhost:8080/${project.name}-cactified/ServletRedirector?Cactus_Service=RUN_TEST"<br />                startTarget="_StartTomcat"<br />                stopTarget="_StopTomcat"<br />                testTarget="_Test"/&gt;<br /><br />    &lt;/target&gt;</pre><br />    <br />    <pre class="overflow">&lt;!-- _Test就是一个普通的junit任务 --&gt;<br />    &lt;target name="_Test"&gt;<br />        &lt;junit printsummary="yes" fork="yes"&gt;<br />            &lt;classpath&gt;<br />                &lt;path refid="project.classpath"/&gt;<br />                &lt;pathelement location="${target.classes.java.dir}"/&gt;<br />                &lt;pathelement location="${target.classes.test.dir}"/&gt;<br />            &lt;/classpath&gt;<br />            &lt;formatter type="brief" usefile="false"/&gt;<br />            &lt;formatter type="xml"/&gt;<br /><br />            &lt;batchtest&gt;<br />                &lt;fileset dir="${src.test.dir}"&gt;<br />                    &lt;!-- Due to some Cactus synchronization bug, the 'unit' tests need<br />              to run before the 'sample' tests --&gt;<br />                    &lt;include name="**/Test*.java"/&gt;<br />                    &lt;exclude name="**/Test*All.java"/&gt;<br />                &lt;/fileset&gt;<br />            &lt;/batchtest&gt;<br />        &lt;/junit&gt;<br />    &lt;/target&gt;</pre></div>
<img src ="http://www.blogjava.net/nbtymm/aggbug/52167.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nbtymm/" target="_blank">nbt</a> 2006-06-12 11:48 <a href="http://www.blogjava.net/nbtymm/archive/2006/06/12/52167.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JUnit 最佳实践(转载)</title><link>http://www.blogjava.net/nbtymm/archive/2006/06/12/52115.html</link><dc:creator>nbt</dc:creator><author>nbt</author><pubDate>Mon, 12 Jun 2006 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/nbtymm/archive/2006/06/12/52115.html</guid><wfw:comment>http://www.blogjava.net/nbtymm/comments/52115.html</wfw:comment><comments>http://www.blogjava.net/nbtymm/archive/2006/06/12/52115.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nbtymm/comments/commentRss/52115.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nbtymm/services/trackbacks/52115.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Techniques for building resilient, relocatable, multithreaded JUnit tests一项灵活的、可重定位的多线程JUnit测试技术 作者 Andy Schneider译者 雷云飞 javawebstart Barret gstian [AKA]校对 gstian [AKA]Summary摘要 Extreme Programming's ...&nbsp;&nbsp;<a href='http://www.blogjava.net/nbtymm/archive/2006/06/12/52115.html'>阅读全文</a><img src ="http://www.blogjava.net/nbtymm/aggbug/52115.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nbtymm/" target="_blank">nbt</a> 2006-06-12 09:39 <a href="http://www.blogjava.net/nbtymm/archive/2006/06/12/52115.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cactus实例讲解(转载)</title><link>http://www.blogjava.net/nbtymm/archive/2006/06/12/52111.html</link><dc:creator>nbt</dc:creator><author>nbt</author><pubDate>Mon, 12 Jun 2006 01:34:00 GMT</pubDate><guid>http://www.blogjava.net/nbtymm/archive/2006/06/12/52111.html</guid><wfw:comment>http://www.blogjava.net/nbtymm/comments/52111.html</wfw:comment><comments>http://www.blogjava.net/nbtymm/archive/2006/06/12/52111.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nbtymm/comments/commentRss/52111.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nbtymm/services/trackbacks/52111.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="558" border="0">
				<tbody>
						<tr>
								<td valign="top" align="right" colspan="2" height="10">
								</td>
						</tr>
						<tr>
								<td valign="top" align="right" width="2%" height="10">
										<div align="left">
										</div>
								</td>
								<td valign="top" align="right" width="98%" bgcolor="#ffffff">
										<div class="daxiao14" align="left">
												<p class="style2">Cactus简介</p>
												<p>
														<strong>．　简介 </strong>
												</p>
												<p>Cactus实现了对JUnit测试框架的无缝扩展，可以方便地测试服务端应用程序。Cactus可以在下面几种情况下使用：</p>
												<ul>
														<li>测试Servlet以及任何使用了像HttpServletRequest，HttpServletResponse，……这样的对象的代码。使用ServletTestCase。 
</li>
														<li>测试Filter以及任何使用了像FilterConfig，……这样的对象的代码。使用FilterTestCase。 
</li>
														<li>测试JSP 。使用ServletTestCase或JspTestCase。 
</li>
														<li>测试Taglibs以及任何使用了像PageContext，……这样的对象的代码。使用JspTestCase。 
</li>
														<li>测试EJB。ServletTestCase或JspTestCase或FilterTestCase。 </li>
												</ul>
												<p>Cactus的使用也是非常简单的，你写的测试类只需继承ServletTestCase或者JspTestCase、FilterTestCase（它们都继承了JUnit的TestCase）。写好测试代码后需要启动web容器，然后执行测试代码。在下面的章节中我们将通过例子向你详细讲解。</p>
												<p>Cactus项目Apache Jakarta Commons的一个子项目，网址是：<a href="http://jakarta.apache.org/commons/cactus/"><font color="#000000">http://jakarta.apache.org/commons/cactus/</font></a>。</p>
												<p>
														<strong>．　TestCase框架</strong>
												</p>
												<p>在Cactus下，我们写的TestCase与JUnit有所不同，先看一段代码，如下：</p>　　　　　　　public class TestSample extendsServletTestCase/JspTestCase/FilterTestCase {<br />　　　　　　　public TestSample (String testName) {<br />　　　　　　　super(testName);<br />　　　　　　　}<br />　　　　　　　public void setUp() {<br />　　　　　　　}<br />　　　　　　　public void tearDown() {<br />　　　　　　　}<br />　　　　　　　public void beginXXX(WebRequest theRequest) {<br />　　　　　　　}<br />　　　　　　　public void testXXX() {<br />　　　　　　　}<br />　　　　　　　public void endXXX(WebResponse theResponse) {<br />　　　　　　　}<br /><p>上面是一个Cactus测试类的完整代码框架，其中的extends部分需要按你所测试的不同目标来继承不同的类（简介中有所描述）。</p><p>另外我们注意到两个新的方法beginXXX和endXXX的，这两个方法分别会在testXXX执行前和执行后执行，它们和setUp、tearDown不同的是beginXXX和endXXX会在相应的testXXX前执行，而setUp和tearDown则在每个testXXX方法前都会执行。另外beginXXX和endXXX是客户端代码，所以在这两个方法里是无法使用request这样的服务端对象的。</p><p>对于endXXX方法需要另加说明的是，在Cactus v1.1前（包括v1.1），它的形式是这样的public void endXXX(HttpURLConnection theConnection)，而在Cactus v1.2开始它的形式有两种可能：</p><ul><li>public void endXXX(org.apache.cactus.WebResponse theResponse)； 
</li><li>public void endXXX(com.meterware.httpunit.WebResponse theResponse)； </li></ul><p>可以看到区别在于引用的包不同，为什么会这样的呢？因为在v1.2开始Cactus集成了HttpUnit这个组件。如果你熟悉HttpUnit这个组件，我想应该明白为什么要集成HttpUnit。下面我们来看一段代码开比较一下两者的区别：</p><p align="left">public void endXXX(org.apache.cactus.WebResponse theResponse) {</p><p align="left">String content = theResponse.getText();</p><p align="left">assertEquals(content, "&lt;html&gt;&lt;body&gt;&lt;h1&gt;Hello world!&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;");</p><p align="left">}</p><p align="left">public void endXXX(com.meterware.httpunit.WebResponse theResponse) {</p><p align="left">WebTable table = theResponse.getTables()[0];</p><p align="left">assertEquals("rows", 4, table.getRowCount());</p><p align="left">assertEquals("columns", 3, table.getColumnCount());</p><p align="left">assertEquals("links", 1, table.getTableCell(0, 2).getLinks().length);</p><p align="left">}</p><p>当然，在实际应用中你需要根据不同的需要来选择不同的endXXX。两个WebResponse的差别可以参见两者各自的API Doc，这里就不再多说了。</p><p class="style2">如何在Cactus里写测试</p><p><strong>．　写测试代码</strong></p><p>首先，我们给出被测类的代码，是一个Servlet：</p><p>public class SampleServlet extends HttpServlet {</p><p>public void doGet(HttpServletRequest theRequest,</p><p>HttpServletResponse theResponse) throws IOException {</p><p>PrintWriter pw = theResponse.getWriter();</p><p>theResponse.setContentType("text/html");</p><p>pw.print("&lt;html&gt;&lt;head/&gt;&lt;body&gt;");</p><p>pw.print("A GET request");</p><p>pw.print("&lt;/body&gt;&lt;/html&gt;");</p><p>}</p><p>public String checkMethod(HttpServletRequest theRequest) {</p><p>return theRequest.getMethod();</p><p>}</p><p>}</p><p>Cactus中的测试类框架已经在上面给出。下面来看一下例子，例子是从中Cactus自带的实例中抽取的一部分，如下：</p><p>public class TestSampleServlet extends ServletTestCase {</p><p>public void testReadServletOutputStream() throws IOException {</p><p>SampleServlet servlet = new SampleServlet();</p><p>servlet.doGet(request, response);</p><p>}</p><p>public void endReadServletOutputStream(WebResponse theResponse)</p><p>throws IOException {</p><p>String expected = "&lt;html&gt;&lt;head/&gt;&lt;body&gt;A GET request&lt;/body&gt;&lt;/html&gt;";</p><p>String result = theResponse.getText();</p><p>assertEquals(expected, result);</p><p>}</p><p>public void beginPostMethod(WebRequest theRequest) {</p><p>theRequest.addParameter("param", "value", WebRequest.POST_METHOD);</p><p>}</p><p>public void testPostMethod() {</p><p>SampleServlet servlet = new SampleServlet();</p><p>assertEquals("POST", servlet.checkMethod(request));</p><p>assertEquals("value", request.getParameter("param"));</p><p>} </p><p>}</p><p>第一个方法testReadServletOutputStream，调用doGet，相当于在客户端提交请求，然后在Servlet处理后会产生一个回馈，所以，在endReadServletOutputStream方法里，我们通过调用response的相应方法判断回馈是否符合预期结果。</p><p>第二个方法testPostMethod，在这之前有一个beginPostMethod，在这个方法里我们以POST方式往request里增加一个表单数据param，值为”value”。下面在testPostMethod我们就要验证表单数据是否以POST方式提交到了服务端的Servlet里，所以，我们看到了两个assertEquals，分别进行了判断。在这里我们要注意到beginPostMethod方法中的theRequest和testPostMethod中的request的区别，在前面我们已经提到过，beginPostMethod是在客户端执行的，所以它方法内的所有操作事实上是模拟页面操作的，比如上面的设置表单数据，而testPostMethod是服务端执行的，其中的request也是服务端的。</p><span class="style2"><strong>配置cactus.properties和web.xml</strong></span><p><strong>cactus.properties</strong></p><ul><li>cactus.contextURL </li></ul><p>这个属性是必须的，它指定了web应用的访问地址</p><p>例：cactus.contextURL = <a href="http://localhost:8080/test"><font color="#000000">http://localhost:8080/test</font></a></p><ul><li>cactus.servletRedirectorName </li></ul><p>可选，当测试类继承ServletTestCase时用于指定Cactus Servlet Redirector的映射名称。默认：ServletRedirector</p><p>例：cactus.servletRedirectorName = ServletRedirector</p><ul><li>cactus.jspRedirectorName </li></ul><p>可选，当测试类继承ServletTestCase时用于指定Cactus Jsp Redirector的映射名称。默认：ServletRedirector</p><p>例：cactus.jspRedirectorName = JspRedirector</p><ul><li>cactus.<a class="style3">filterRedirectorName </a>(For J2EE API 1.3 only) </li></ul><p>可选，当测试类继承ServletTestCase时用于指定Cactus Filter Redirector的映射名称。默认：ServletRedirector</p><p>例：cactus.filterRedirectorName = FilterRedirector</p><p>Cactus.properties你可以放置在WEB-INF/classes/下。</p><p><strong>web.xml</strong></p><p>在web.xml里要为相应的测试类指定相应的Cactus Redirector。</p><p>ServletTestCase对应org.apache.cactus.server.ServletTestRedirector</p><p>JspTestCase对应/jspRedirector.jsp</p><p>FilterTestCase对应org.apache.cactus.server.FilterTestRedirector</p><p>&lt;web-app&gt;</p><p>&lt;filter&gt;</p><p>&lt;filter-name&gt;FilterRedirector&lt;/filter-name&gt;</p><p>&lt;filter-class&gt;org.apache.cactus.server.FilterTestRedirector&lt;/filter-class&gt;</p><p>&lt;/filter&gt;</p><p>&lt;filter-mapping&gt;</p><p>&lt;filter-name&gt;FilterRedirector&lt;/filter-name&gt;</p><p>&lt;url-pattern&gt;/FilterRedirector&lt;/url-pattern&gt;</p><p>&lt;/filter-mapping&gt;</p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt;ServletRedirector&lt;/servlet-name&gt;</p><p>&lt;servlet-class&gt;org.apache.cactus.server.ServletTestRedirector&lt;/servlet-class&gt;</p><p>&lt;/servlet&gt;</p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt;JspRedirector&lt;/servlet-name&gt;</p><p>&lt;jsp-file&gt;<a class="style3">/jspRedirector.jsp</a>&lt;/jsp-file&gt;</p><p>&lt;/servlet&gt;</p><p>&lt;servlet-mapping&gt;</p><p>&lt;servlet-name&gt;ServletRedirector&lt;/servlet-name&gt;</p><p>&lt;url-pattern&gt;/ServletRedirector&lt;/url-pattern&gt;</p><p>&lt;/servlet-mapping&gt;</p><p>&lt;servlet-mapping&gt;</p><p>&lt;servlet-name&gt;JspRedirector&lt;/servlet-name&gt;</p><p>&lt;url-pattern&gt;/JspRedirector&lt;/url-pattern&gt;</p><p>&lt;/servlet-mapping&gt;</p><p>&lt;/web-app&gt;</p><p>如果你的测试类继承了JspTestCase则需要将jspRedirector.jsp文件放置到你在web.xml中指定的路径里。</p><p class="style2">安装说明</p><ul><li>在使用Cactus时，strutstest.jar还需要有下列包的支持。包可放置在WEB-INF/lib下 </li></ul><p>如下：</p><ul><ul><li><a class="style3">Client</a>端，需要如下包 </li></ul></ul><p align="left">junit.jar</p><p align="left">servlet.jar</p><p align="left">cactus.jar</p><p align="left">httpclient.jar</p><p align="left">commons-logging.jar</p><p align="left">httpunit.jar，Tidy.jar，xerces.jar（可选，如果你集成了httpunit的话就需要，也就是在endXXX中使用了httpunit）</p><ul><ul><li>Server端（也就是web容器）需要如下包 </li></ul></ul><p align="left">cactus.jar</p><p align="left">junit.jar</p><p align="left">aspectjrt.jar</p><p align="left">commons-logging.jar</p><ul><li>写好测试代码后将class放置在WEB-INF/classes下 
</li><li>被测代码也放置在WEB-INF/classes下 
</li><li>写好cactus.properties和web.xml两个配置文件 
</li><li>启动web容器 
</li><li>运行测试代码 </li></ul></div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/nbtymm/aggbug/52111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nbtymm/" target="_blank">nbt</a> 2006-06-12 09:34 <a href="http://www.blogjava.net/nbtymm/archive/2006/06/12/52111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC连接大全</title><link>http://www.blogjava.net/nbtymm/archive/2006/06/12/52104.html</link><dc:creator>nbt</dc:creator><author>nbt</author><pubDate>Mon, 12 Jun 2006 01:11:00 GMT</pubDate><guid>http://www.blogjava.net/nbtymm/archive/2006/06/12/52104.html</guid><wfw:comment>http://www.blogjava.net/nbtymm/comments/52104.html</wfw:comment><comments>http://www.blogjava.net/nbtymm/archive/2006/06/12/52104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nbtymm/comments/commentRss/52104.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nbtymm/services/trackbacks/52104.html</trackback:ping><description><![CDATA[Java数据库连接（JDBC）由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的 API，使他们能够用纯Java API 来编写数据库应用程序。然而各个开发商的接口并不完全相同，所以开发环境的变化会带来一定的配置变化。本文主要集合了不同数据库的连接方式。<br /><br />　　<b>一、连接各种数据库方式速查表</b><br /><br />　　下面罗列了各种数据库使用JDBC连接的方式，可以作为一个手册使用。 <br /><br />　　1、Oracle8/8i/9i数据库（thin模式） <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); <br />String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID <br />String user="test"; <br />String password="test"; <br />Connection conn= DriverManager.getConnection(url,user,password); </td></tr></tbody></table><br />　　2、DB2数据库 <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); <br />String url="jdbc:db2://localhost:5000/sample"; //sample为你的数据库名 <br />String user="admin"; <br />String password=""; <br />Connection conn= DriverManager.getConnection(url,user,password); </td></tr></tbody></table><br />　　3、Sql Server7.0/2000数据库 <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); <br />String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb"; <br />//mydb为数据库 <br />String user="sa"; <br />String password=""; <br />Connection conn= DriverManager.getConnection(url,user,password); </td></tr></tbody></table><br />　　4、Sybase数据库 <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>Class.forName("com.sybase.jdbc.SybDriver").newInstance(); <br />String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDB为你的数据库名 <br />Properties sysProps = System.getProperties(); <br />SysProps.put("user","userid"); <br />SysProps.put("password","user_password"); <br />Connection conn= DriverManager.getConnection(url, SysProps); </td></tr></tbody></table><br />　　5、Informix数据库 <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>Class.forName("com.informix.jdbc.IfxDriver").newInstance(); <br />String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver; <br />user=testuser;password=testpassword"; //myDB为数据库名 <br />Connection conn= DriverManager.getConnection(url); </td></tr></tbody></table><br />　　6、MySQL数据库 <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>Class.forName("org.gjt.mm.mysql.Driver").newInstance(); <br />String url ="jdbc:mysql://localhost/myDB?user=soft&amp;password=soft1234&amp;useUnicode=true&amp;characterEncoding=8859_1" <br />//myDB为数据库名 <br />Connection conn= DriverManager.getConnection(url); </td></tr></tbody></table><br />　　7、PostgreSQL数据库 <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>Class.forName("org.postgresql.Driver").newInstance(); <br />String url ="jdbc:postgresql://localhost/myDB" //myDB为数据库名 <br />String user="myuser"; <br />String password="mypassword"; <br />Connection conn= DriverManager.getConnection(url,user,password); </td></tr></tbody></table><br />　　8、access数据库直连用ODBC的<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;<br />String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");<br />Connection conn = DriverManager.getConnection(url,"","");<br />Statement stmtNew=conn.createStatement() ;</td></tr></tbody></table><br />　　<b>二、JDBC连接MySql方式</b><br /><br />　　下面是使用JDBC连接MySql的一个小的教程 <br /><br />　　1、查找驱动程序<br /><br />　　MySQL目前提供的java驱动程序为Connection/J，可以从MySQL官方网站下载，并找到mysql-connector-java-3.0.15-ga-bin.jar文件，此驱动程序为纯java驱动程序，不需做其他配置。<br /><br />　　2、动态指定classpath<br /><br />　　如果需要执行时动态指定classpath，就在执行时采用－cp方式。否则将上面的.jar文件加入到classpath环境变量中。<br /><br />　　3、加载驱动程序<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>try{<br />　Class.forName(com.mysql.jdbc.Driver);<br />　System.out.println(Success loading Mysql Driver!);<br />}catch(Exception e)<br />{<br />　System.out.println(Error loading Mysql Driver!);<br />　e.printStackTrace();<br />}</td></tr></tbody></table><br />　　4、设置连接的url<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>jdbc：mysql：//localhost/databasename[?pa=va][＆pa=va]</td></tr></tbody></table><br /><span class="f14">　　<b>三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧</b><br /><br />　　1、在客户端软件开发中使用Thin驱动程序<br /><br />　　在开发Java软件方面，Oracle的数据库提供了四种类型的驱动程序，二种用于应用软件、applets、servlets等客户端软件，另外二种用于数据库中的Java存储过程等服务器端软件。在客户机端软件的开发中，我们可以选择OCI驱动程序或Thin驱动程序。OCI驱动程序利用Java本地化接口（JNI），通过Oracle客户端软件与数据库进行通讯。Thin驱动程序是纯Java驱动程序，它直接与数据库进行通讯。为了获得最高的性能，Oracle建议在客户端软件的开发中使用OCI驱动程序，这似乎是正确的。但我建议使用Thin驱动程序，因为通过多次测试发现，在通常情况下，Thin驱动程序的性能都超过了OCI驱动程序。<br /><br />　　2、关闭自动提交功能，提高系统性能<br /><br />　　在第一次建立与数据库的连接时，在缺省情况下，连接是在自动提交模式下的。为了获得更好的性能，可以通过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能，如下所示：<br /><br />　　conn.setAutoCommit(false);<br /><br />　　值得注意的是，一旦关闭了自动提交功能，我们就需要通过调用Connection类的commit()和rollback()方法来人工的方式对事务进行管理。<br /><br />　　3、在动态SQL或有时间限制的命令中使用Statement对象<br /><br />　　在执行SQL命令时，我们有二种选择：可以使用PreparedStatement对象，也可以使用Statement对象。无论多少次地使用同一个SQL命令，PreparedStatement都只对它解析和编译一次。当使用Statement对象时，每次执行一个SQL命令时，都会对它进行解析和编译。这可能会使你认为，使用PreparedStatement对象比使用Statement对象的速度更快。然而，我进行的测试表明，在客户端软件中，情况并非如此。因此，在有时间限制的SQL操作中，除非成批地处理SQL命令，我们应当考虑使用Statement对象。<br /><br />　　此外，使用Statement对象也使得编写动态SQL命令更加简单，因为我们可以将字符串连接在一起，建立一个有效的SQL命令。因此，我认为，Statement对象可以使动态SQL命令的创建和执行变得更加简单。<br /><br />　　4、利用helper函数对动态SQL命令进行格式化<br /><br />　　在创建使用Statement对象执行的动态SQL命令时，我们需要处理一些格式化方面的问题。例如，如果我们想创建一个将名字O'Reilly插入表中的SQL命令，则必须使用二个相连的“''”号替换O'Reilly中的“'”号。完成这些工作的最好的方法是创建一个完成替换操作的helper方法，然后在连接字符串心服用公式表达一个SQL命令时，使用创建的helper方法。与此类似的是，我们可以让helper方法接受一个Date型的值，然后让它输出基于Oracle的to_date()函数的字符串表达式。<br /><br />　　5、利用PreparedStatement对象提高数据库的总体效率<br /><br />　　在使用PreparedStatement对象执行SQL命令时，命令被数据库进行解析和编译，然后被放到命令缓冲区。然后，每当执行同一个PreparedStatement对象时，它就会被再解析一次，但不会被再次编译。在缓冲区中可以发现预编译的命令，并且可以重新使用。在有大量用户的企业级应用软件中，经常会重复执行相同的SQL命令，使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务，我会建议在除动态SQL命令之外的所有情况下使用PreparedStatement对象。<br /><br />　　6、在成批处理重复的插入或更新操作中使用PreparedStatement对象<br /><br />　　如果成批地处理插入和更新操作，就能够显著地减少它们所需要的时间。Oracle提供的Statement和 CallableStatement并不真正地支持批处理，只有PreparedStatement对象才真正地支持批处理。我们可以使用addBatch()和executeBatch()方法选择标准的JDBC批处理，或者通过利用PreparedStatement对象的setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制，可以以如下所示的方式调用setExecuteBatch()：<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>PreparedStatement pstmt3D null;<br />try {<br />　((OraclePreparedStatement)pstmt).setExecuteBatch(30);<br />　...<br />　pstmt.executeUpdate();<br />} </td></tr></tbody></table><br />　　调用setExecuteBatch()时指定的值是一个上限，当达到该值时，就会自动地引发SQL命令执行，标准的executeUpdate()方法就会被作为批处理送到数据库中。我们可以通过调用PreparedStatement类的sendBatch()方法随时传输批处理任务。<br /><br />　　7、使用Oracle locator方法插入、更新大对象（LOB）<br /><br />　　Oracle的PreparedStatement类不完全支持BLOB和CLOB等大对象的处理，尤其是Thin驱动程序不支持利用PreparedStatement对象的setObject()和setBinaryStream()方法设置BLOB的值，也不支持利用setCharacterStream()方法设置CLOB的值。只有locator本身中的方法才能够从数据库中获取LOB类型的值。可以使用PreparedStatement对象插入或更新LOB，但需要使用locator才能获取LOB的值。由于存在这二个问题，因此，我建议使用locator的方法来插入、更新或获取LOB的值。<br /><br />　　8、使用SQL92语法调用存储过程<br /><br />　　在调用存储过程时，我们可以使用SQL92或Oracle PL/SQL，由于使用Oracle PL/SQL并没有什么实际的好处，而且会给以后维护你的应用程序的开发人员带来麻烦，因此，我建议在调用存储过程时使用SQL92。<br /><br />　　9、使用Object SQL将对象模式转移到数据库中<br /><br />　　既然可以将Oracle的数据库作为一种面向对象的数据库来使用，就可以考虑将应用程序中的面向对象模式转到数据库中。目前的方法是创建Java bean作为伪装的数据库对象，将它们的属性映射到关系表中，然后在这些bean中添加方法。尽管这样作在Java中没有什么问题，但由于操作都是在数据库之外进行的，因此其他访问数据库的应用软件无法利用对象模式。如果利用Oracle的面向对象的技术，可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作，然后使用JPublisher等工具生成自己的Java bean类。如果使用这种方式，不但Java应用程序可以使用应用软件的对象模式，其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的对象模式。<br /><br />　　10、利用SQL完成数据库内的操作<br /><br />　　我要向大家介绍的最重要的经验是充分利用SQL的面向集合的方法来解决数据库处理需求，而不是使用Java等过程化的编程语言。<br /><br />　　如果编程人员要在一个表中查找许多行，结果中的每个行都会查找其他表中的数据，最后，编程人员创建了独立的UPDATE命令来成批地更新第一个表中的数据。与此类似的任务可以通过在set子句中使用多列子查询而在一个UPDATE命令中完成。当能够在单一的SQL命令中完成任务，何必要让数据在网上流来流去的？我建议用户认真学习如何最大限度地发挥SQL的功能。</span><img src ="http://www.blogjava.net/nbtymm/aggbug/52104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nbtymm/" target="_blank">nbt</a> 2006-06-12 09:11 <a href="http://www.blogjava.net/nbtymm/archive/2006/06/12/52104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>