﻿<?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-小阁飞空 一池碧映垂杨路 绛云深处 听尽潇潇雨-文章分类-JAVA</title><link>http://www.blogjava.net/xiaoxiaoyupku/category/1681.html</link><description>At times , people will simply not come through for you in the way you need.Forgive them and move on.</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 07:37:03 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 07:37:03 GMT</pubDate><ttl>60</ttl><item><title>[数据库]oracle 日期类型字段的操作(转载自http://blogger.org.cn/blog/more.asp?name=dashee&amp;id=6452)</title><link>http://www.blogjava.net/xiaoxiaoyupku/articles/42800.html</link><dc:creator>潇潇雨</dc:creator><author>潇潇雨</author><pubDate>Mon, 24 Apr 2006 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/xiaoxiaoyupku/articles/42800.html</guid><wfw:comment>http://www.blogjava.net/xiaoxiaoyupku/comments/42800.html</wfw:comment><comments>http://www.blogjava.net/xiaoxiaoyupku/articles/42800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaoxiaoyupku/comments/commentRss/42800.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaoxiaoyupku/services/trackbacks/42800.html</trackback:ping><description><![CDATA[
		<table style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellspacing="1" cellpadding="3" width="98%" bgcolor="#cccccc" border="0">
				<tbody>
						<tr bgcolor="#f8f8f8">
								<td>
										<p>
												<a href="http://blogger.org.cn/blog/blog.asp?name=dashee" target="_blank">ideation</a> 发表于 2005-6-8 16:26:22 </p>
								</td>
						</tr>
						<tr bgcolor="#ffffff">
								<td height="0">
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<p>在java对oracle的操作中，日期字段是很头疼的事情，其实仔细研究一下也并不难掌握。</p>
																		<p>举个例子来说明：</p>
																		<p>表 book  中有name varchar2(20)//书籍名称,buydate Date //购买日期 两个字段。</p>
																		<p>已经创建了数据库连接Connection conn;</p>
																		<p>方法一、使用java.sql.Date实现比较简单的yyyy-mm-dd格式日期。</p>
																		<p dir="ltr" style="MARGIN-RIGHT: 0px">java.sql.Date不支持时间格式。切记不要使用new java.sql.Date(int year,int month,int date),因为还要处理时间差问题。</p>
																		<p dir="ltr" style="MARGIN-RIGHT: 0px">PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,?)");</p>
																		<p dir="ltr" style="MARGIN-RIGHT: 0px">java.sql.Date buydate=java.sql.Date.valueOf("2005-06-08");<br />pstmt.setString(1, "Java编程思想");<br />pstmt.setDate(2,buydate );<br />pstmt.execute();</p>
																		<p>方法二、使用java.sql.Timestamp,同上不使用new Timestamp(....)</p>
																		<p dir="ltr" style="MARGIN-RIGHT: 0px">PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,?)");</p>
																		<p dir="ltr" style="MARGIN-RIGHT: 0px">java.sql.Timestamp buydate=java.sql.Timestamp.valueOf("2004-06-08 05:33:99");<br />pstmt.setString(1, "Java编程思想");<br />pstmt.setTimestamp(2,buydate );<br />pstmt.execute();</p>
																		<p>方法三、使用oracle 的to_date内置函数</p>
																		<p dir="ltr" style="MARGIN-RIGHT: 0px">PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,to_date(?, 'yyyy-mm-dd hh24:mi:ss')");</p>
																		<p dir="ltr" style="MARGIN-RIGHT: 0px">String buydate="2004-06-08 05:33:99";<br />pstmt.setString(1, "Java编程思想");<br />pstmt.setString(2,buydate );<br />pstmt.execute();</p>
																		<p dir="ltr" style="MARGIN-RIGHT: 0px">附:oracle日期格式参数 含义说明  <br />d: 一周中的星期几  <br />day: 天的名字，使用空格填充到9个字符  <br />dd: 月中的第几天  <br />ddd: 年中的第几天  <br />dy: 天的简写名  <br />iw: ISO标准的年中的第几周  <br />iyyy: ISO标准的四位年份  <br />yyyy: 四位年份  <br />yyy,yy,y: 年份的最后三位，两位，一位  <br />hh: 小时，按12小时计  <br />hh24: 小时，按24小时计  <br />mi: 分  <br />ss: 秒  <br />mm: 月  <br />mon: 月份的简写  <br />month: 月份的全名  <br />w: 该月的第几个星期  <br />ww: 年中的第几个星期<br /><br />到此刻，你应该烦恼已消，轻松了很多吧。</p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/xiaoxiaoyupku/aggbug/42800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaoxiaoyupku/" target="_blank">潇潇雨</a> 2006-04-24 11:20 <a href="http://www.blogjava.net/xiaoxiaoyupku/articles/42800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle与java中date类型（汇总）待续</title><link>http://www.blogjava.net/xiaoxiaoyupku/articles/42736.html</link><dc:creator>潇潇雨</dc:creator><author>潇潇雨</author><pubDate>Sun, 23 Apr 2006 15:26:00 GMT</pubDate><guid>http://www.blogjava.net/xiaoxiaoyupku/articles/42736.html</guid><wfw:comment>http://www.blogjava.net/xiaoxiaoyupku/comments/42736.html</wfw:comment><comments>http://www.blogjava.net/xiaoxiaoyupku/articles/42736.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaoxiaoyupku/comments/commentRss/42736.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaoxiaoyupku/services/trackbacks/42736.html</trackback:ping><description><![CDATA[Oracle的解惑一二to_date()与24小时制表示法及mm分钟的显示：<br />一、在使用Oracle的to_date函数来做日期转换时，很多Java程序员也许会和我一样，直觉的采用“yyyy-MM-dd HH:mm:ss”的格式作为格式进行转换，但是在Oracle中会引起错误：“ORA 01810 格式代码出现两次”。<br />如：select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mm:ss') from dual;<br />原因是SQL中不区分大小写，MM和mm被认为是相同的格式代码，所以Oracle的SQL采用了mi代替分钟。<br />select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual;<br /><br />二、另要以24小时的形式显示出来要用HH24<br />select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;//mi是分钟<br />select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual;//mm会显示月份<img src ="http://www.blogjava.net/xiaoxiaoyupku/aggbug/42736.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaoxiaoyupku/" target="_blank">潇潇雨</a> 2006-04-23 23:26 <a href="http://www.blogjava.net/xiaoxiaoyupku/articles/42736.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【Java开源 Java测试工具】</title><link>http://www.blogjava.net/xiaoxiaoyupku/articles/32624.html</link><dc:creator>潇潇雨</dc:creator><author>潇潇雨</author><pubDate>Mon, 27 Feb 2006 05:26:00 GMT</pubDate><guid>http://www.blogjava.net/xiaoxiaoyupku/articles/32624.html</guid><wfw:comment>http://www.blogjava.net/xiaoxiaoyupku/comments/32624.html</wfw:comment><comments>http://www.blogjava.net/xiaoxiaoyupku/articles/32624.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaoxiaoyupku/comments/commentRss/32624.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaoxiaoyupku/services/trackbacks/32624.html</trackback:ping><description><![CDATA[<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open30443.htm">JUnit</A>&nbsp;&nbsp;</H2>
<P>JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架（regression testing framework）。Junit测试是程序员测试，即所谓白盒测试，因为程序员知道被测试的软件如何（How）完成功能和完成什么样（What）的功能。Junit是一套框架，继承TestCase类，就可以用Junit进行自动测试了。 </P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open30543.htm">Cactus&nbsp;</A>&nbsp;<SPAN class=NavigationColor>&nbsp;</SPAN></H2>
<P>Cactus是一个基于JUnit框架的简单测试框架，用来单元测试服务端Java代码。Cactus框架的主要目标是能够单元测试服务端的使用Servlet对象的Java方法如HttpServletRequest,HttpServletResponse,HttpSession等</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open30643.htm">Abbot</A>&nbsp;&nbsp;<SPAN class=NavigationColor>&nbsp;</SPAN></H2>
<P>Abbot是一个用来测试Java GUIs的框架。用简单的基于XML的脚本或者Java代码，你就可以开始一个GUI。</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open30743.htm">JUnitPerf</A>&nbsp;&nbsp;<SPAN class=NavigationColor>&nbsp;</SPAN></H2>
<P>Junitperf实际是junit的一个decorator，通过编写用于junitperf的单元测试，我们也可使测试过程自动化。</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open30843.htm">DbUnit</A>&nbsp;&nbsp;</H2>
<P>DbUnit是为数据库驱动的项目提供的一个对JUnit 的扩展，除了提供一些常用功能，它可以将你的数据库置于一个测试轮回之间的状态。 </P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open30943.htm">Mockrunner</A>&nbsp;&nbsp;</H2>
<P>Mockrunner用在J2EE环境中进行应用程序的单元测试。它不仅支持Struts actions, servlets，过滤器和标签类还包括一个JDBC和一个JMS测试框架，可以用于测试基于EJB的应用程序。</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open31043.htm">DBMonster</A>&nbsp;&nbsp;<SPAN class=NavigationColor>&nbsp;</SPAN></H2>
<P>DBMonster是一个用生成随机数据来测试SQL数据库的压力测试工具。</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open31143.htm">MockEJB</A>&nbsp;&nbsp;<SPAN class=NavigationColor>&nbsp;</SPAN></H2>
<P>MockEJB是一个不需要EJB容器就能运行EJB并进行测试的轻量级框架。</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open31243.htm">StrutsTestCase</A>&nbsp;&nbsp;<SPAN class=NavigationColor>&nbsp;</SPAN></H2>
<P>StrutsTestCase 是Junit TestCase类的扩展，提供基于Struts框架的代码测试。StrutsTestCase同时提供Mock 对象方法和Cactus方法用来实际运行Struts ActionServlet，你可以通过运行servlet引擎来测试。因为StrutsTestCase使用ActionServlet控制器来测试你的代码，因此你不仅可以测试Action对象的实现，而且可以测试mappings，from beans以及forwards声明。StrutsTestCase不启动servlet容器来测试struts应用程序（容器外测试）也属于Mock对象测试，但是与EasyMock不同的是，EasyMock是提供了创建Mock对象的API，而StrutsTest则是专门负责测试Struts应用程序的Mock对象测试框架。 </P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open31343.htm">JFCUnit</A>&nbsp;&nbsp;<SPAN class=NavigationColor>&nbsp;</SPAN></H2>
<P>JFCUnit使得你能够为Java偏移应用程序编写测试例子。它为从用代码打开的窗口上获得句柄提供了支持；为在一个部件层次定位部件提供支持；为在部件中发起事件（例如按一个按钮）以及以线程安全方式处理部件测试提供支持。</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open31443.htm">JTestCase</A>&nbsp;&nbsp;</H2>
<P>JTestCase 使用XML文件来组织多测试案例数据，声明条件（操作和期望的结果），提供了一套易于使用的方法来检索XML中的测试案例，按照数据文件的定义来声明结果。</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open31543.htm">SQLUnit</A>&nbsp;&nbsp;</H2>
<P>SQLUnit是一个单元测试框架，用于对数据库存储过程进行加归测试。用 Java/JUnit/XML开发。 </P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open59643.htm">JTR</A>&nbsp;&nbsp;<SPAN class=NavigationColor>&nbsp;</SPAN></H2>
<P>JTR (Java Test Runner)是一个开源的基于反转控制(IOC)的J2EE测试框架。它允许你构建复杂的J2EE测试套件(Test Suites)并连到应用服务器执行测试,可以包括多个测试实例。JTR的licensed是GPL协议。</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open64143.htm">Marathon</A>&nbsp;&nbsp;</H2>
<P>Marathon是一个针对使用Java/Swing开发GUI应用程序的测试框架，它由recorder, runner 和 editor组成，测试脚本是python代码。Marathon的焦点是放在最终用户的测试上。</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open64243.htm">TestNG</A>&nbsp;&nbsp;<SPAN class=NavigationColor>&nbsp;</SPAN></H2>
<P>TestNG是根据JUnit 和 NUnit思想而构建的一个测试框架，但是TestNG增加了许多新的功能使得它变得更加强大与容易使用比如：<BR>*支持JSR 175注释（JDK 1.4利用JavaDoc注释同样也支持）<BR>*灵活的Test配置<BR>*支持默认的runtime和logging JDK功能<BR>*强大的执行模型（不再TestSuite）<BR>*支持独立的测试方法。</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open64343.htm">Surrogate Test framework</A>&nbsp;&nbsp;<SPAN class=NavigationColor>&nbsp;</SPAN></H2>
<P>Surrogate Test framework是一个值得称赞单元测试框架，特别适合于大型，复杂Java系统的单元测试。这个框架能与JUnit,MockEJB和各种支持模拟对象（mock object ）的测试工具无缝给合。这个框架基于AspectJ技术。</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open64443.htm">MockCreator</A>&nbsp;&nbsp;<SPAN class=NavigationColor>&nbsp;</SPAN></H2>
<P>MockCreator可以为给定的interface或class生成模拟对象（Mock object）的源码。</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open64543.htm">jMock</A>&nbsp;&nbsp;</H2>
<P>jMock利用mock objects思想来对Java code进行测试。jMock具有以下特点:容易扩展，让你快速简单地定义mock objects,因此不必打破程序间的关联，让你定义灵活的超越对象之间交互作用而带来测试局限，减少你测试地脆弱性。</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open64643.htm">EasyMock</A>&nbsp;&nbsp;</H2>
<P>EasyMock为Mock Objects提供接口并在JUnit测试中利用Java的proxy设计模式生成它们的实例。EasyMock最适合于测试驱动开发。</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open64743.htm">The Grinder</A>&nbsp;&nbsp;<SPAN class=NavigationColor>&nbsp;</SPAN></H2>
<P>The Grinder是一个负载测试框架。在BSD开源协议下免费使用。</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open64843.htm">XMLUnit</A>&nbsp;&nbsp;</H2>
<P>XMLUnit不仅有Java版本的还有.Net版本的。Java开发的XMLUnit提供了两个JUnit 扩展类XMLAssert和XMLTestCase,和一组支持的类。这些类可以用来比较两张XML之间的不同之处，展示XML利用XSLT来,校验XML,求得XPath表达式在XML中的值,遍历XML中的某一节点利DOM展开,</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open64943.htm">Jameleon</A>&nbsp;&nbsp;</H2>
<P>Jameleon一个自动化测试工具。它被用来测试各种各样的应用程序，所以它被设计成插件模式。为了使整个测试过程变得简单Jameleon提供了一个GUI,因此Jameleon实现了一个Swing 插件。</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open79343.htm">J2MEUnit</A>&nbsp;&nbsp;</H2>
<P>J2MEUnit是应用在J2ME应用程序的一个单元测试框架。它基于JUnit.</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open83943.htm">Jetif</A> </H2>
<P>Jetif是一个用纯Java实现的回归测试框架。它为Java程序单元测试以及功能测试提供了一个简单而且可 伸缩的架构，可以用于个人开发或企业级开发的测试。它容易使用，功能强大，而且拥有一些企业级测试的 重要功能。Jetif来源于JUnit, JTestCase以及TestNG的启发，有几个基本的概念直接来自于JUnit， 比如说断言机制，Test Listener的概念，因此从JUnit转到Jetif是非常容易的。</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open84043.htm">GroboUtils</A> </H2>
<P>GroboUtils使得扩展Java测试变得可能。它包括用在Java不同方面测试的多个子项目。在GroboUtils中最常被到的工具是:多线程测试(multi-threaded tests),整体单元测试(hierarchial unit tests),代码覆盖工具(code coverage tool)。</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open85343.htm">Testare</A></H2>
<P>TESTARE是用来简化分布式应用程序(比如:在SERVLETS,JMS listeners, CORBA ORBs或RMI环境下)测试开发过程的一个测试框架.</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open97143.htm">MockLib</A> </H2>
<P>MockLib是一个很小的包所以可容易地动态创建一个模拟对象.你可以从模拟的系统中抛出异常来确保你的系统能够正确处理错误.它同样也是一个线程安全的模拟对象库.</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open99243.htm">JellyUnit</A> </H2>
<P>JellyUnit是一个基于Jelly的JUnit测试机制.它允许用Jelly脚本来完成单元测试.尤其是对于XML,XPath,SQL,HTTP,JMS和SOAP交互的测试特别有用.</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open99343.htm">Pisces</A> </H2>
<P>这个项目继承于JUnit目的是提供一个分布式的测试环境.它给开发者/测试人员一个运行远程JUnits和复杂测试案例的能力，这个案例由几个并行运行的远程JUnit测试组成。</P></DIV>
<DIV class=story>
<H2><IMG height=14 src="http://www.open-open.com/image/item.gif" width=13>&nbsp;<A href="http://www.open-open.com/open99443.htm">JUnitEE</A></H2>
<P>JUnitEE是对JUnit的一个简单扩展，可以支持在一个J2EE应用程序服务器上执行标准的测试案例。它主要由一个把测试结果输出为html的servlet组成。</P></DIV><img src ="http://www.blogjava.net/xiaoxiaoyupku/aggbug/32624.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaoxiaoyupku/" target="_blank">潇潇雨</a> 2006-02-27 13:26 <a href="http://www.blogjava.net/xiaoxiaoyupku/articles/32624.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过JDBC连接oracle数据库的十大技巧 </title><link>http://www.blogjava.net/xiaoxiaoyupku/articles/20756.html</link><dc:creator>潇潇雨</dc:creator><author>潇潇雨</author><pubDate>Mon, 21 Nov 2005 05:46:00 GMT</pubDate><guid>http://www.blogjava.net/xiaoxiaoyupku/articles/20756.html</guid><wfw:comment>http://www.blogjava.net/xiaoxiaoyupku/comments/20756.html</wfw:comment><comments>http://www.blogjava.net/xiaoxiaoyupku/articles/20756.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaoxiaoyupku/comments/commentRss/20756.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaoxiaoyupku/services/trackbacks/20756.html</trackback:ping><description><![CDATA[<HR>
&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; Java数据库连接（JDBC）API是一系列能够让Java编程人员访问数据库的接口，各个开发商的接口并不完全相同。在使用多年的Oracle公司的JDBC后，我积累了许多技巧，这些技巧能够使我们更好地发挥系统的性能和实现更多的功能。 <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>PreparedStatement pstmt3D null; <BR>try { <BR>((OraclePreparedStatement) <BR>pstmt).setExecuteBatch(30); <BR>... <BR>pstmt.executeUpdate(); <BR>} <BR><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的功能。<BR><img src ="http://www.blogjava.net/xiaoxiaoyupku/aggbug/20756.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaoxiaoyupku/" target="_blank">潇潇雨</a> 2005-11-21 13:46 <a href="http://www.blogjava.net/xiaoxiaoyupku/articles/20756.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过JDBC操纵Oracle数据库LOB字段的几种情况分析</title><link>http://www.blogjava.net/xiaoxiaoyupku/articles/20062.html</link><dc:creator>潇潇雨</dc:creator><author>潇潇雨</author><pubDate>Wed, 16 Nov 2005 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/xiaoxiaoyupku/articles/20062.html</guid><wfw:comment>http://www.blogjava.net/xiaoxiaoyupku/comments/20062.html</wfw:comment><comments>http://www.blogjava.net/xiaoxiaoyupku/articles/20062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaoxiaoyupku/comments/commentRss/20062.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaoxiaoyupku/services/trackbacks/20062.html</trackback:ping><description><![CDATA[<FONT color=#008000>&nbsp;&nbsp;&nbsp; 在Oracle中，LOB（Large Object，大型对象）类型的字段现在用得越来越多了。因为这种类型的字段，容量大（最多能容纳4GB的数据），且一个表中可以有多个这种类型的字段，很灵活，适用于数据量非常大的业务领域（如图象、档案等）。而LONG、LONG RAW等类型的字段，虽然存储容量也不小（可达2GB），但由于一个表中只能有一个这样类型的字段的限制，现在已很少使用了。 <BR>&nbsp;&nbsp;&nbsp; LOB类型分为BLOB和CLOB两种：BLOB即二进制大型对象（Binary Large Object），适用于存贮非文本的字节流数据（如程序、图象、影音等）。而CLOB，即字符型大型对象（Character Large Object），则与字符集相关，适于存贮文本型的数据（如历史档案、大部头著作等）。<BR>&nbsp;&nbsp;&nbsp; 下面以程序实例说明通过JDBC操纵Oracle数据库LOB类型字段的几种情况。<BR>&nbsp;&nbsp;&nbsp; 先建立如下两个测试用的数据库表，Power Designer PD模型如下：<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <IMG src="http://www.jcwcn.com/news/UploadFiles_5180/200509/20050922154245343.jpg" onload="javascript:if(this.width>screen.width-300)this.width=screen.width-300" border=0><BR><BR>建表SQL语句为：<BR>CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)<BR>CREATE TABLE TEST_BLOB ( ID NUMBER(3), BLOBCOL BLOB)<BR><BR></FONT><FONT color=#008000><STRONG>一、 CLOB对象的存取<BR></STRONG><BR></FONT><FONT color=#008000><STRONG>1、往数据库中插入一个新的CLOB对象<BR></STRONG>public static void clobInsert(String infile) throws Exception<BR>{<BR>/* 设定不自动提交 */<BR>boolean defaultCommit = conn.getAutoCommit();<BR>conn.setAutoCommit(false);<BR>try {<BR>/* 插入一个空的CLOB对象 */<BR>stmt.executeUpdate("INSERT INTO TEST_CLOB valueS ('111', EMPTY_CLOB())");<BR>/* 查询此CLOB对象并锁定 */<BR>ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");<BR>while (rs.next()) {<BR>/* 取出此CLOB对象 */<BR>oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");<BR>/* 向CLOB对象中写入数据 */<BR>BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());<BR>BufferedReader in = new BufferedReader(new FileReader(infile));<BR>int c;<BR>while ((c=in.read())!=-1) {<BR>out.write(c);<BR>}<BR>in.close();<BR>out.close();<BR>}<BR>/* 正式提交 */<BR>conn.commit();<BR>} catch (Exception ex) {<BR>/* 出错回滚 */<BR>conn.rollback();<BR>throw ex;<BR>}<BR>/* 恢复原提交状态 */<BR>conn.setAutoCommit(defaultCommit);<BR>}<BR><BR><STRONG>2、修改CLOB对象（是在原CLOB对象基础上进行覆盖式的修改）</STRONG><BR>public static void clobModify(String infile) throws Exception<BR>{<BR>/* 设定不自动提交 */<BR>boolean defaultCommit = conn.getAutoCommit();<BR>conn.setAutoCommit(false);<BR>try {<BR>/* 查询CLOB对象并锁定 */<BR>ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");<BR>while (rs.next()) {<BR>/* 获取此CLOB对象 */<BR>oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");<BR>/* 进行覆盖式修改 */<BR>BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());<BR>BufferedReader in = new BufferedReader(new FileReader(infile));<BR>int c;<BR>while ((c=in.read())!=-1) {<BR>out.write(c);<BR>}<BR>in.close();<BR>out.close();<BR>}<BR>/* 正式提交 */<BR>conn.commit();<BR>} catch (Exception ex) {<BR>/* 出错回滚 */<BR>conn.rollback();<BR>throw ex;<BR>}<BR>/* 恢复原提交状态 */<BR>conn.setAutoCommit(defaultCommit);<BR>} <BR><BR><STRONG>3、替换CLOB对象（将原CLOB对象清除，换成一个全新的CLOB对象）</STRONG><BR>public static void clobReplace(String infile) throws Exception<BR>{<BR>/* 设定不自动提交 */<BR>boolean defaultCommit = conn.getAutoCommit();<BR>conn.setAutoCommit(false);<BR>try {<BR>/* 清空原CLOB对象 */<BR>stmt.executeUpdate("UPDATE TEST_CLOB SET CLOBCOL=EMPTY_CLOB() WHERE ID='111'");<BR>/* 查询CLOB对象并锁定 */<BR>ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");<BR>while (rs.next()) {<BR>/* 获取此CLOB对象 */<BR>oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");<BR>/* 更新数据 */<BR>BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());<BR>BufferedReader in = new BufferedReader(new FileReader(infile));<BR>int c;<BR>while ((c=in.read())!=-1) {<BR>out.write(c);<BR>}<BR>in.close();<BR>out.close();<BR>}<BR>/* 正式提交 */<BR>conn.commit();<BR>} catch (Exception ex) {<BR>/* 出错回滚 */<BR>conn.rollback();<BR>throw ex;<BR>}<BR>/* 恢复原提交状态 */<BR>conn.setAutoCommit(defaultCommit);<BR>}<BR><BR><STRONG>4、CLOB对象读取</STRONG><BR>public static void clobRead(String outfile) throws Exception<BR>{<BR>/* 设定不自动提交 */<BR>boolean defaultCommit = conn.getAutoCommit();<BR>conn.setAutoCommit(false);<BR>try {<BR>/* 查询CLOB对象 */<BR>ResultSet rs = stmt.executeQuery("SELECT * FROM TEST_CLOB WHERE ID='111'");<BR>while (rs.next()) {<BR>/* 获取CLOB对象 */<BR>oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");<BR>/* 以字符形式输出 */<BR>BufferedReader in = new BufferedReader(clob.getCharacterStream());<BR>BufferedWriter out = new BufferedWriter(new FileWriter(outfile));<BR>int c;<BR>while ((c=in.read())!=-1) {<BR>out.write(c);<BR>}<BR>out.close();<BR>in.close();<BR>}<BR>} catch (Exception ex) {<BR>conn.rollback();<BR>throw ex;<BR>}<BR>/* 恢复原提交状态 */<BR>conn.setAutoCommit(defaultCommit);<BR>}<BR><BR><STRONG>二、 BLOB对象的存取</STRONG><BR><BR></FONT><FONT color=#008000><STRONG>1、 向数据库中插入一个新的BLOB对象<BR></STRONG>public static void blobInsert(String infile) throws Exception<BR>{<BR>/* 设定不自动提交 */<BR>boolean defaultCommit = conn.getAutoCommit();<BR>conn.setAutoCommit(false);<BR>try {<BR>/* 插入一个空的BLOB对象 */<BR>stmt.executeUpdate("INSERT INTO TEST_BLOB valueS ('222', EMPTY_BLOB())");<BR>/* 查询此BLOB对象并锁定 */<BR>ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE");<BR>while (rs.next()) {<BR>/* 取出此BLOB对象 */<BR>oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");<BR>/* 向BLOB对象中写入数据 */<BR>BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());<BR>BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));<BR>int c;<BR>while ((c=in.read())!=-1) {<BR>out.write(c);<BR>}<BR>in.close();<BR>out.close();<BR>}<BR>/* 正式提交 */<BR>conn.commit();<BR>} catch (Exception ex) {<BR>/* 出错回滚 */<BR>conn.rollback();<BR>throw ex;<BR>}<BR>/* 恢复原提交状态 */<BR>conn.setAutoCommit(defaultCommit);<BR>}<BR><BR><STRONG>2、修改BLOB对象（是在原BLOB对象基础上进行覆盖式的修改）</STRONG><BR>public static void blobModify(String infile) throws Exception<BR>{<BR>/* 设定不自动提交 */<BR>boolean defaultCommit = conn.getAutoCommit();<BR>conn.setAutoCommit(false);<BR>try {<BR>/* 查询BLOB对象并锁定 */<BR>ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE");<BR>while (rs.next()) {<BR>/* 取出此BLOB对象 */<BR>oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");<BR>/* 向BLOB对象中写入数据 */<BR>BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());<BR>BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));<BR>int c;<BR>while ((c=in.read())!=-1) {<BR>out.write(c);<BR>}<BR>in.close();<BR>out.close();<BR>}<BR>/* 正式提交 */<BR>conn.commit();<BR>} catch (Exception ex) {<BR>/* 出错回滚 */<BR>conn.rollback();<BR>throw ex;<BR>}<BR>/* 恢复原提交状态 */<BR>conn.setAutoCommit(defaultCommit);<BR>}<BR><BR><STRONG>3、替换BLOB对象（将原BLOB对象清除，换成一个全新的BLOB对象）</STRONG><BR>public static void blobReplace(String infile) throws Exception<BR>{<BR>/* 设定不自动提交 */<BR>boolean defaultCommit = conn.getAutoCommit();<BR>conn.setAutoCommit(false);<BR>try {<BR>/* 清空原BLOB对象 */<BR>stmt.executeUpdate("UPDATE TEST_BLOB SET BLOBCOL=EMPTY_BLOB() WHERE ID='222'");<BR>/* 查询此BLOB对象并锁定 */<BR>ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE");<BR>while (rs.next()) {<BR>/* 取出此BLOB对象 */<BR>oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");<BR>/* 向BLOB对象中写入数据 */<BR>BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());<BR>BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));<BR>int c;<BR>while ((c=in.read())!=-1) {<BR>out.write(c);<BR>}<BR>in.close();<BR>out.close();<BR>}<BR>/* 正式提交 */<BR>conn.commit();<BR>} catch (Exception ex) {<BR>/* 出错回滚 */<BR>conn.rollback();<BR>throw ex;<BR>}<BR>/* 恢复原提交状态 */<BR>conn.setAutoCommit(defaultCommit);<BR>}<BR><BR></FONT><FONT color=#008000><STRONG>4、BLOB对象读取<BR></STRONG>public static void blobRead(String outfile) throws Exception<BR>{<BR>/* 设定不自动提交 */<BR>boolean defaultCommit = conn.getAutoCommit();<BR>conn.setAutoCommit(false);<BR>try {<BR>/* 查询BLOB对象 */<BR>ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222'");<BR>while (rs.next()) {<BR>/* 取出此BLOB对象 */<BR>oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");<BR>/* 以二进制形式输出 */<BR>BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outfile));<BR>BufferedInputStream in = new BufferedInputStream(blob.getBinaryStream());<BR>int c;<BR>while ((c=in.read())!=-1) {<BR>out.write(c);<BR>}<BR>in.close();<BR>out.close();<BR>}<BR>/* 正式提交 */<BR>conn.commit();<BR>} catch (Exception ex) {<BR><BR>/* 出错回滚 */<BR>conn.rollback();<BR>throw ex;<BR>}<BR><BR>/* 恢复原提交状态 */<BR>conn.setAutoCommit(defaultCommit);<BR>}<BR><BR>&nbsp;&nbsp;&nbsp; 观察上述程序对LOB类型字段的存取，我们可以看出，较之其它类型字段，有下面几个显著不同的特点：<BR><BR><STRONG>一是必须取消自动提交。</STRONG><BR><BR>&nbsp;&nbsp;&nbsp; 存取操作开始前，必须用setAutoCommit(false)取消自动提交。其它类型字段则无此特殊要求。这是因为存取LOB类型字段时，通常要进行多次操作可以完成。不这样的话，Oracle将抛出“读取违反顺序”的错误。<BR><BR></FONT><FONT color=#008000><STRONG>二是插入方式不同。<BR></STRONG><BR>&nbsp;&nbsp;&nbsp; LOB数据不能象其它类型数据一样直接插入（INSERT）。插入前必须先插入一个空的LOB对象，CLOB类型的空对象为EMPTY_CLOB()，BLOB类型的空对象为EMPTY_BLOB()。之后通过SELECT命令查询得到先前插入的记录并锁定，继而将空对象修改为所要插入的LOB对象。<BR><BR><STRONG>三是修改方式不同。</STRONG><BR><BR>&nbsp;&nbsp;&nbsp; 其它类型的字段修改时，用UPDATE … SET…命令即可。而LOB类型字段，则只能用SELECT … FOR UPDATE命令将记录查询出来并锁定，然后才能修改。且修改也有两种改法：一是在原数据基础上的修改（即覆盖式修改），执行SELECT … FOR UPDATE后再改数据；二是替换（先将原数据清掉，再修改），先执行UPDATE命令将LOB字段之值设为空的LOB对象，然后进行第一种改法。建议使用替换的方法，以实现与其它字段UPDATE操作后一样的效果。<BR><BR><STRONG>四是存取时应使用由数据库JDBC驱动程序提供的LOB操作类。</STRONG><BR><BR>&nbsp;&nbsp;&nbsp; 对于Oracle数据库，应使用oracle.sql.CLOB和oracle.sql.BLOB。不使用由数据库JDBC驱动程序提供的LOB类时，程序运行时易于出现“抽象方法调用”的错误，这是因为JDBC所定义的java.sql.Clob与java.sql.Blob接口，其中的一些方法并未在数据库厂家提供的驱动程序中真正实现。<BR><BR><STRONG>五是存取手段与文件操作相仿。</STRONG><BR><BR>&nbsp;&nbsp;&nbsp; 对于BLOB类型，应用InputStream/OutputStream类，此类不进行编码转换，逐个字节存取。oracle.sql.BLOB类相应提供了getBinaryStream()和getBinaryOutputStream()两个方法，前一个方法用于读取Oracle的BLOB字段，后一个方法用于将数据写入Oracle的BLOB字段。<BR>&nbsp;&nbsp;&nbsp; 对于CLOB类型，应用Reader/Writer类，此类进行编码转换。oracle.sql.CLOB类相应提供了getCharacterStream()和getCharacterOutputStream()两个方法，前一个方法用于读取Oracle的CLOB字段，后一个方法用于将数据写入Oracle的CLOB字段。<BR>&nbsp;&nbsp;&nbsp; 需要说明的是，为了大幅提高程序执行效率，对BLOB/CLOB字段的读写操作，应该使用缓冲操作类（带Buffered前缀），即：BufferedInputStream，BufferedOutputStream，BufferedReader，BufferedWriter。例程中全部使用了缓冲操作类。<BR><BR><STRONG>&nbsp;&nbsp;&nbsp; 小结：通过JDBC操纵Oracle数据库的LOB字段，不外乎插入、修改、替换、读取四种方式，掌握起来并不难。在实际操作中要注意上面所说的几点，结合阅读例程源程序，用户会很快明白LOB类型字段的使用的，也必将领悟到这种类型字段的妙处！</STRONG></FONT><img src ="http://www.blogjava.net/xiaoxiaoyupku/aggbug/20062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaoxiaoyupku/" target="_blank">潇潇雨</a> 2005-11-16 15:04 <a href="http://www.blogjava.net/xiaoxiaoyupku/articles/20062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle数据库中CLOB字段的处理问题 </title><link>http://www.blogjava.net/xiaoxiaoyupku/articles/20053.html</link><dc:creator>潇潇雨</dc:creator><author>潇潇雨</author><pubDate>Wed, 16 Nov 2005 06:35:00 GMT</pubDate><guid>http://www.blogjava.net/xiaoxiaoyupku/articles/20053.html</guid><wfw:comment>http://www.blogjava.net/xiaoxiaoyupku/comments/20053.html</wfw:comment><comments>http://www.blogjava.net/xiaoxiaoyupku/articles/20053.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaoxiaoyupku/comments/commentRss/20053.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaoxiaoyupku/services/trackbacks/20053.html</trackback:ping><description><![CDATA[在Oracle中，LOB（Large Object，大型对象）类型的字段现在用得越来越多了。因为这种类型的字段，容量大（最多能容纳4GB的数据），且一个表中可以有多个这种类型的字段，很灵活，适用于数据量非常大的业务领域（如图象、档案等）。而LONG、LONG RAW等类型的字段，虽然存储容量也不小（可达2GB），但由于一个表中只能有一个这样类型的字段的限制，现在已很少使用了。 <BR><BR>LOB类型分为BLOB和CLOB两种：BLOB即二进制大型对象（Binary Large Object），适用于存贮非文本的字节流数据（如程序、图象、影音等）。而CLOB，即字符型大型对象（Character Large Object），则与字符集相关，适于存贮文本型的数据（如历史档案、大部头著作等）。<BR><BR>对于一般的java应用程序，clob类型的数据用对象形式插入即可，连接方式采用Oracle Thin JDBC Driver<BR>注意：存取操作开始前，必须用setAutoCommit(false)取消自动提交，否则Oracle将抛出“读取违反顺序”的错误。<BR><BR>取： ...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.setAutoCommit(false);<BR>....<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(rss.next())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Clob clob = rss.getClob(1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(clob!=null)<BR>&nbsp;&nbsp; //直接转换为String返回，也可使用getCharacterOutputStream()或getAsciiOutputStream() <BR>&nbsp;&nbsp; //<BR>&nbsp;&nbsp; String str=clob.getSubString((long) 1, (int) clob.length());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>写：LOB类型字段，则只能用SELECT … FOR UPDATE命令将记录查询出来并锁定，然后才能修改<BR>import oracle.sql.CLOB;<BR>OracleResultSet rss=(OracleResultSet)stmt.executeQuery("select my_clob from test where id=1 for update");&nbsp; <BR>if(rss.next())<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLOB clob=(CLOB)rss.getClob(1);<BR>//content为大于4k 的String,当然也可使用流形式写入<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clob.putString(1,content);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .....<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OraclePreparedStatement pstmt=(OraclePreparedStatement)con.prepareStatement("update test set my_clob=?");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pstmt.setClob(1,(Clob)clob);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pstmt.executeUpdate();<BR>...<BR>}<BR><BR><BR>但同样的方法在BEA WLS 8.1SP2上取数据没有问题，写CLOB会有问题的，会报一种这样的错误:java.lang.ClassCastException<BR>对此bea 是这样解释并解决的：<BR>For most extensions that Oracle provides, you can use the standard technique as described in Using Vendor Extensions to JDBC Interfaces. However, the Oracle Thin driver does not provide public interfaces for its extension methods in the following classes:<BR><BR>oracle.sql.ARRAY <BR>oracle.sql.STRUCT <BR>oracle.sql.REF <BR>oracle.sql.BLOB <BR>oracle.sql.CLOB <BR>WebLogic Server provides its own interfaces to access the extension methods for those classes:<BR><BR>weblogic.jdbc.vendor.oracle.OracleArray <BR>weblogic.jdbc.vendor.oracle.OracleStruct <BR>weblogic.jdbc.vendor.oracle.OracleRef <BR>weblogic.jdbc.vendor.oracle.OracleThinBlob <BR>weblogic.jdbc.vendor.oracle.OracleThinClob <BR><BR>意思即是采用weblogic.jdbc.vendor.oracle.OracleThinClob 替代oracle.sql.CLOB <BR><BR>修改后的写CLOB字段，只用修改一句,其他不变。<BR>weblogic.jdbc.vendor.oracle.OracleThinClob&nbsp; clob=(OracleThinClob)rss.getClob(1);<img src ="http://www.blogjava.net/xiaoxiaoyupku/aggbug/20053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaoxiaoyupku/" target="_blank">潇潇雨</a> 2005-11-16 14:35 <a href="http://www.blogjava.net/xiaoxiaoyupku/articles/20053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Java中文问题的几条分析原则(转自IBM)</title><link>http://www.blogjava.net/xiaoxiaoyupku/articles/19897.html</link><dc:creator>潇潇雨</dc:creator><author>潇潇雨</author><pubDate>Tue, 15 Nov 2005 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/xiaoxiaoyupku/articles/19897.html</guid><wfw:comment>http://www.blogjava.net/xiaoxiaoyupku/comments/19897.html</wfw:comment><comments>http://www.blogjava.net/xiaoxiaoyupku/articles/19897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaoxiaoyupku/comments/commentRss/19897.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaoxiaoyupku/services/trackbacks/19897.html</trackback:ping><description><![CDATA[<P>尽管关于Java中文问题的讨论已经相当多了，但由于Java的相关技术标准繁多，面向Java的Web服务器、应用服务器以及JDBC数据库驱动等都没有官方的标准，所以Java应用在处理中文时所存在的问题不仅没有消失而且随着所选用的服务器、驱动程序以及运行环境等因素的不同而变化。那么我们如何从众多现象中找出问题所在，并进行分析和解决呢？与大部分的讨论不同，本文将主要从如何预测、发现和检查问题的角度给出建议，帮助开发人员找出可能引起问题的各种源头，从而更好地解决Java的中文问题。</P>
<P>　　<STRONG>引言</STRONG></P>
<P>　　尽管对于Java中文处理问题的讨论已不乏其数，但由于Java技术涉及内容广（J2EE包含了十几种相关技术），技术供应商繁多，面向Java的Web服务器、应用服务器以及JDBC数据库驱动等都没有官方的标准，所以Java应用在处理中文过程中出了存在固有的问题外也存在随着选用的服务器，驱动程序的不同而带来的Java中文问题的多变性，增加了问题的复杂度。那么，我们如何在这么纷繁的现象中找到问题的症结呢？</P>
<P>　　<STRONG>Java中文问题的一般解决办法</STRONG></P>
<P>　　事实上，Java的中文问题都是由于Java应用所采用的缺省编码格式与目标或者应用所要读入字符的编码格式不同而造成的（具体参见文献1）。对于如何解决Java的中文问题，通常有四种方法：</P>
<P>　　1）选择JDK的中文本地化版本。尽管Java2 JDK的中文本地化版本（<A href="http://java.sun.com/products/jdk/1.2/chinesejdk.html" target=_blank>http://java.sun.com/products/jdk/1.2/chinesejdk.html</A>）并不是一个官方的版本，Sun公司也没有承诺会对该本地化版本进行升级，但其仍不失为一个Java中文问题的解决方案。</P>
<P>　　2）选择合适的编译参数。对于Java的国际版本来讲，我们也可以在编译Java应用的时候通过指定确定的编码机制来实现其编译结果对中文的支持。例如，对于需要支持繁体中文和简体中文应用可以通过javac -encoding big5 sourcefile.java 和javac -encoding gb2312 sourcefile.java来编译源程序。</P>
<P>　　3）通过编程的方式实现字符编码的转换代码。通过编程的方式来解决Java的中文问题，已经成为了一种较为普遍的做法。下面就是一种最常见的字符编码转换函数，其将字符的编码格式转换为中文Windows系统的GBK编码形式。</P>
<P style="BACKGROUND: #eeeeee">public static String toChinese(String strvalue)<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(strvalue==null)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return strvalue;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp; }</P>
<P>　　4）定义字符输出集。对于JSP应用，我们可以通过&lt;%@ page contentType="text/html; charset=GBK" %&gt;或&lt;%@ page contentType="text/html; charset=GB2312" %&gt;来定义JSP页面的字符输出集。当然，我们也可以通过HTML的标记&lt;META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312"&gt;来定义字符的输出集。</P>
<P>　　<STRONG>存在的问题</STRONG></P>
<P>　　根据方法实现的方式，我们可以将以上四种方法分为两类，一类是通过利用某些标准或者规则来实现的方法，上面的1)、2)、4）都属于此类；一类是通过针对性的编程来实现的方法，上面所提的方法3）就属于此类。</P>
<P>　　由于方法1)，2)，4）是具有规范性的一类方法，所以方法比较简单，解决方案也不具备较大的针对性，较为通用，例如我们可以采用方法2）的编译方式通过编译Java源文件来实现内码的预置，而无需考虑源码到底有哪些部分出现了Java的中文处理问题，诸如输出乱码等等。</P>
<P>　　但是，正由于这些方法不具备针对性，解决问题的方法过于统一，所以在某些情况下，它们并不能彻底地解决Java的中文问题。举一个非常常见的例子。在通常情况下，用户的Java应用往往需要与其它Java应用接口进行交互，例如通过某种版本的JDBC访问数据库。由于JDBC的驱动所支持的编码随着提供商乃至版本的不同而不同，所以如果在数据库的输入输出过程中出现中文不能正确处理问题时，我们需要在数据的输入和输出过程做两次正好相反的编码转换，这对于方法1），2），4）来说，往往是无法解决的。当然，对于方法2，我们也可以通过采用一些技巧使来满足上面的情况，一个最有效的办法就是尽量将Java应用的各个部分组件化。例如我们可以通过将数据库的读入和输出代码分解在不同的源文件上来实现分别编译，从而满足不同的字符编码要求。但是通常的程序设计都不太可能满足这种要求，因为这种程序的划分结果很可能是不合理的。例如，我们将数据库的读出和写入方法封装到一个类中是比较合适的一种设计，但如果将该类的这两个方法分别实现在两个文件里则变得非常不合理。因此对于1），2），4）方法来说，虽然实现比较简单，但却具有一些无法克服的缺点。这也是那些实现起来相对复杂的编程方法得以流行的原因。</P>
<P>　　相对于方法1），2），4）来说，方法3）具有更好的针对性和灵活性。程序可以根据不同的情况做出灵活的处理，在任何需要的地方进行字符的编码转换，但是该方法的特点也对软件的开发人员提出了更高要求--必须能够准确的捕捉到有可能发生中文处理问题的地方，并做出正确的判断和处理。</P>
<P>　　<STRONG>分析的原则</STRONG></P>
<P>　　总的说来，所有解决Java中文处理的方法都不是很复杂。相反的是，由于Java技术特别是J2EE技术涉及的内容繁多，各种Web服务器、应用服务器以及JDBC数据库驱动等参差不齐，所以如何正确而及时的发现应用的中文处理问题则变得相对复杂的多。那么我们如何来发现这些问题呢？</P>
<P>　　通常，Java处理中文时所产生的问题都是由于用户的Java应用所采用的缺省编码格式与目标或者应用所要读入字符的编码格式不同而造成的，而引起这些不同的一个主要原因就是用户的Java应用与其它应用进行了编码格式不匹配的数据交换（包括直接或间接的数据输入、输出）。所以，为了及时发现问题，我们可以由这一点入手，根据以下的原则对应用进行分析：</P>
<P>　　1. 注意字符变量情况。由于变量的字符编码形式较为隐蔽，多次变量间数值的改变和运算可能会引起字符集的改变；在变量与页面所提交数据的各种操作中，较容易发生不同编码格式字符进行运算的情况。 </P>
<P>　　2. 注意任何形式的字符读入与输出。之所以要提到任何形式，是因为Java应用大多数都是作为网络应用开发的，所以与其它语言的应用相比，Java应用需要面对网络世界各种各样的字符数据交换形式。例如各种表单的数据提交，URL形式的数据读入，经过加密运算的字符数据交换，网页控件选择结果的输入，控件内容的的显示（如List控件）等等。 </P>
<P>　　3. 小心使用第三方的组件和应用。由于第三方组件和应用的实现是非透明的，所以一般情况下，我们很难判断这些组件或驱动的缺省编码格式是什么，也无法对其进行控制。因此，在使用它们所提供的接口函数进行数据交换的时候要特别注意，如果确实出现中文无法正确处理情况，应首先检查我们自己的代码并调整相关代码以适应这些接口，因为这些组件或者应用基本上不会提供调整编码机制的接口。必要时，我们可能需要采用其它可替换的组件或者应用。 </P>
<P>　　4. 注意被请求对象所含有的数据输入与输出。这是非常隐蔽的一类情况，当我们的应用以对象的方式（例如序列化的对象）进行交互时，如果这个对象内部含有字符数据的处理过程，或者含有某些数据的输入、输出，甚至是抛出一段用中文注解的异常，都可能出现中文无法正确显示等问题。由于这些行为往往被封装在对象中，所以我们在编写程序时，很容易忽略这种可能情况。并且这种情况带有一定的不可预见性，例如我们可能不清楚这个对象会在什么时候抛出什么样的异常，所以这时我们就需要做一定的测试工作。 </P>
<P>　　5. 注意数据库的数据访问过程。Java通过JDBC与数据库建立连接。对于JDBC驱动程序来说，由于目前大部分的JDBC驱动程序并不是针对中文系统而设计的(中文数据大都采用ISO-8859-1编码方式)，所以一般情况下在数据读写过程中往往都需要字符编码的转化。但是我们仍建议用户在使用这些JDBC驱动时，仔细阅读它的说明。如果确实无法弄清JDBC字符数据的编码到底是什么，我们的建议是做一些必要的测试。例如下面是一组在简体中文Win2000平台下，采用Weblogic 6.0所提供的JDBC驱动从MS SQL Server2000中正确读入中文字符的代码（例子中进行了字符运算）： </P>
<P style="BACKGROUND: #eeeeee">&nbsp;...<BR>Class.forName("weblogic.jdbc.mssqlserver4.Driver").newInstance();<BR>&nbsp;&nbsp; conn = myDriver.connect("jdbc:weblogic:mssqlserver4", props);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.setCatalog("labmanager");<BR>&nbsp;&nbsp;&nbsp;&nbsp; Statement st = conn.createStatement();<BR>&nbsp;&nbsp;//execute a query<BR>&nbsp;String&nbsp; testStr;<BR>String testTempStr = new String() ;<BR>&nbsp;&nbsp;&nbsp; &nbsp;testStr = new String(testTempStr.getBytes("ISO-8859-1"));//编码转化<BR>&nbsp;DatabaseMetaData DBMetaData =conn.getMetaData();<BR>&nbsp;&nbsp;ResultSet rs = DBMetaData.getTables(null, null,null,new String[]{"TABLE"} );<BR>&nbsp;&nbsp;while (rs.next()){<BR>&nbsp;&nbsp;&nbsp;for(int j=1; j&lt;=rs.getMetaData().getColumnCount(); j++){<BR>testStr = testStr +String(rs.getObject(j).toString().getBytes("ISO-8859-1"));<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}</P>
<P>　　然而，需要注意的是，不同的JDBC驱动对相同的数据库的支持并不同，而同一类JDBC驱动对不同的数据库的支持也不相同，也就是说我们的字符转化代码在JDBC驱动改变甚至是版本变化情况下都有可能无法正确工作。例如对于上面的例子，在同样的环境下改用i-net 的Una 2000 Driver Version 2.03 for MS SQL Server时，是无法正确处理中文的。原因很简单，这个JDBC驱动本身支持的就是GBK的编码机制，所以根本就不需要做任何的编码转化。 </P>
<P>　　6. 必要的测试。由于Java中文问题的产生随着Web服务器，浏览器，运行环境和开发工具的不同都可能发生变化，所以为了更好的避免问题的发生，我们必须作一些针对性的测试。另外，在我们确实无法通过分析来确定Java的中文处理问题是否可能发生的情况下或者无法知道问题的发生是由于哪个环节（是Web服务器，浏览器还是JDBC数据驱动等等）引起的时候，测试工作则变得非常重要。并且我们可能需要较为全面的测试，例如对Web服务器，浏览器和JDBC数据驱动等都要做测试，这样有利于我们找出那些隐藏在多个环节协调过程中所产生的问题。</P>
<P>　　<STRONG>结论</STRONG></P>
<P>　　事实上，Java中文处理之所以存在问题，其根本原因是由于被操作的中文字符（变量）的编码格式与目标的编码格式不同造成的，所有这些问题其实都是发生在字符的读入、输出过程中的，只要我们把握住这一环节，就可以更好的发现、分析、处理和预防Java的中文问题了。</P><img src ="http://www.blogjava.net/xiaoxiaoyupku/aggbug/19897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaoxiaoyupku/" target="_blank">潇潇雨</a> 2005-11-15 15:26 <a href="http://www.blogjava.net/xiaoxiaoyupku/articles/19897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>谈jdbc连接sql server2000数据库(转)</title><link>http://www.blogjava.net/xiaoxiaoyupku/articles/19762.html</link><dc:creator>潇潇雨</dc:creator><author>潇潇雨</author><pubDate>Mon, 14 Nov 2005 12:45:00 GMT</pubDate><guid>http://www.blogjava.net/xiaoxiaoyupku/articles/19762.html</guid><wfw:comment>http://www.blogjava.net/xiaoxiaoyupku/comments/19762.html</wfw:comment><comments>http://www.blogjava.net/xiaoxiaoyupku/articles/19762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaoxiaoyupku/comments/commentRss/19762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaoxiaoyupku/services/trackbacks/19762.html</trackback:ping><description><![CDATA[<P><FONT face=Arial>前提：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.sql&nbsp;server&nbsp;2000&nbsp;任意版本&nbsp;&nbsp;&nbsp;&nbsp;//本人用的是个人版<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.sql&nbsp;server&nbsp;2000&nbsp;sp3升级包<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;你可以在这里下载</FONT><A href="http://www.bossed.com.cn/download/detailcp.asp?id=74"><FONT face=Arial>http://www.bossed.com.cn/download/detailcp.asp?id=74</FONT></A><BR><FONT face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.sql&nbsp;server&nbsp;2000&nbsp;jdbc&nbsp;驱动&nbsp;&nbsp;//这个就需要自己找了!<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.jdk1.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//以下的例子是该版本<BR>在以上条件满足的情况下,作以下事情<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.建立新数据库名为：TESTDB&nbsp;,并在其中建立一个名为test_student的表<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;包括以下几列（Sno，Sname，Sage，Ssex，Sclass）&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.开始编写你自己的连接数据库的类（我这里是借鉴他人的版权不归我所有），你也可以用自己的方法&nbsp;<BR>class&nbsp;Testj{<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])<BR>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;RL&nbsp;=&nbsp;"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=TESTDB";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;user&nbsp;="king";//这里替换成你自已的数据库用户名<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;password&nbsp;=&nbsp;"sql";//这里替换成你自已的数据库用户密码<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sqlStr&nbsp;=&nbsp;"select&nbsp;*&nbsp;from&nbsp;test_student";<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{&nbsp;&nbsp;&nbsp;&nbsp;//这里的异常处理语句是必需的.否则不能通过编译!&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"类实例化成功!"&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("slkdjf");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;=&nbsp;DriverManager.getConnection(RL,user,password);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"创建连接对像成功!"&nbsp;);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;st&nbsp;=&nbsp;con.createStatement();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"创建Statement成功!"&nbsp;);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;st.executeQuery(&nbsp;sqlStr&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"操作数据表成功!"&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"----------------!"&nbsp;);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(rs.next())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(rs.getInt("Sno")&nbsp;+&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(rs.getString("Sname")&nbsp;+&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(rs.getInt("Sage")&nbsp;+&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(rs.getString("Ssex")&nbsp;+&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(rs.getString("Sclass"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch(Exception&nbsp;err){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err.printStackTrace(System.out);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR>下面进行调试：<BR>&nbsp;&nbsp;javac&nbsp;Testj.java<BR>&nbsp;&nbsp;java&nbsp;Testj<BR>&nbsp;&nbsp;如果正确输出应该是：<BR>&nbsp;&nbsp;类实例化成功!<BR>slkdjf<BR>创建连接对像成功!<BR>创建Statement成功!<BR>操作数据表成功!<BR>----------------!<BR>2000&nbsp;&nbsp;&nbsp;&nbsp;小刚&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;21&nbsp;&nbsp;&nbsp;&nbsp;男&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>2001&nbsp;&nbsp;&nbsp;&nbsp;小黄&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;22&nbsp;&nbsp;&nbsp;&nbsp;女&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>2002&nbsp;&nbsp;&nbsp;&nbsp;李娜&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp;&nbsp;&nbsp;女&nbsp;&nbsp;&nbsp;&nbsp;11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>2003&nbsp;&nbsp;&nbsp;&nbsp;王芳&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;19&nbsp;&nbsp;&nbsp;&nbsp;女&nbsp;&nbsp;&nbsp;&nbsp;null<BR>2004&nbsp;&nbsp;&nbsp;&nbsp;黄明&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;22&nbsp;&nbsp;&nbsp;&nbsp;男&nbsp;&nbsp;&nbsp;&nbsp;11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>2005&nbsp;&nbsp;&nbsp;&nbsp;梅兰&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;21&nbsp;&nbsp;&nbsp;&nbsp;女&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>2006&nbsp;&nbsp;&nbsp;&nbsp;李玉&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;22&nbsp;&nbsp;&nbsp;&nbsp;女&nbsp;&nbsp;&nbsp;&nbsp;15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>2007&nbsp;&nbsp;&nbsp;&nbsp;李平&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;32&nbsp;&nbsp;&nbsp;&nbsp;女&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><BR>注意：这里有几点要说明<BR>1.路径问题：<BR>&nbsp;&nbsp;你必须配置你的classpath路径否则他在编译时会抱错<BR>&nbsp;&nbsp;java.lang.ClassNotFoundException:&nbsp;com.microsoft.jdbc.sqlserver.SQLServerDriver<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.net.URLClassLoader$1.run(URLClassLoader.java:199)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.security.AccessController.doPrivileged(Native&nbsp;Method)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.net.URLClassLoader.findClass(URLClassLoader.java:187)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.lang.ClassLoader.loadClass(ClassLoader.java:289)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.lang.ClassLoader.loadClass(ClassLoader.java:235)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.lang.Class.forName0(Native&nbsp;Method)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.lang.Class.forName(Class.java:141)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;Test.main(Test.java:11)&nbsp;<BR>你的路径应该是这样配置：你可以在在安装jdbc驱动后看那里的帮助文档（是英文的）；<BR>//这里指在xp系统下<BR>&nbsp;classpath&nbsp;=&nbsp;,;C:\Program&nbsp;Files\Microsoft&nbsp;SQL&nbsp;Server&nbsp;2000&nbsp;Driver&nbsp;for&nbsp;JDBC\lib\msbase.jar;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\Program&nbsp;Files\Microsoft&nbsp;SQL&nbsp;Server&nbsp;2000&nbsp;Driver&nbsp;for&nbsp;JDBC\lib\mssqlserver.jar;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\Program&nbsp;Files\Microsoft&nbsp;SQL&nbsp;Server&nbsp;2000&nbsp;Driver&nbsp;for&nbsp;JDBC\lib\msutil.jar;<BR>&nbsp;&nbsp;可千万不要写错哟！<BR>&nbsp;2.sp3补丁包问题：<BR>&nbsp;&nbsp;&nbsp;&nbsp;如果你在编译时出现下列问题&nbsp;那么你需要下载并安装sp3补丁包<BR>&nbsp;&nbsp;&nbsp;java.sql.SQLException:&nbsp;[Microsoft][SQLServer&nbsp;2000&nbsp;Driver&nbsp;for&nbsp;JDBC]Error&nbsp;establis<BR>hing&nbsp;socket.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.microsoft.jdbc.base.BaseExceptions.createException(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.microsoft.jdbc.base.BaseExceptions.getException(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.microsoft.jdbc.base.BaseExceptions.getException(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.microsoft.jdbc.sqlserver.tds.TDSConnection.&lt;init&gt;(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.microsoft.jdbc.sqlserver.SQLServerImplConnection.open(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.microsoft.jdbc.base.BaseConnection.getNewImplConnection(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.microsoft.jdbc.base.BaseConnection.open(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.microsoft.jdbc.base.BaseDriver.connect(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.sql.DriverManager.getConnection(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.sql.DriverManager.getConnection(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;Test.main(Test.java:14)&nbsp;<BR>3.权限问题&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;如果你出现类似这样的问题<BR>&nbsp;&nbsp;&nbsp;类实例化成功!<BR>slkdjf<BR>java.sql.SQLException:&nbsp;[Microsoft][SQLServer&nbsp;2000&nbsp;Driver&nbsp;for&nbsp;JDBC][SQLServer]用户&nbsp;'king'&nbsp;登录失败。<BR>原因:&nbsp;未与信任&nbsp;SQL&nbsp;Server&nbsp;连接相关联。<BR>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.microsoft.jdbc.base.BaseExceptions.createException(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.microsoft.jdbc.base.BaseExceptions.getException(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.microsoft.jdbc.sqlserver.tds.TDSRequest.processErrorToken(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.microsoft.jdbc.sqlserver.tds.TDSRequest.processReplyToken(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.microsoft.jdbc.sqlserver.tds.TDSLoginRequest.processReplyToken(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.microsoft.jdbc.sqlserver.tds.TDSRequest.processReply(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.microsoft.jdbc.sqlserver.SQLServerImplConnection.open(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.microsoft.jdbc.base.BaseConnection.getNewImplConnection(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.microsoft.jdbc.base.BaseConnection.open(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.microsoft.jdbc.base.BaseDriver.connect(Unknown&nbsp;Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.sql.DriverManager.getConnection(DriverManager.java:512)<BR>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.sql.DriverManager.getConnection(DriverManager.java:171)<BR>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;Testj.main(Testj.java:14)<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>原困是未设置SQL&nbsp;SERVER登录认证模式为混合认证模式，因为SQL&nbsp;SERVER默认安装后认证模式为WINDOWS认证模式，从而导致出错。<BR>解决方法：启动SQLSERVER企业管理器，选择要进行认证模式设置的服务器。右击该服务器，在弹出菜单中选择属性，SQL&nbsp;SERVER将<BR>弹出属性对话框在属性对话框中选择安全性选项，在身份验证处选择“SQL&nbsp;Server和Windows”，然后确定。</FONT></P><img src ="http://www.blogjava.net/xiaoxiaoyupku/aggbug/19762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaoxiaoyupku/" target="_blank">潇潇雨</a> 2005-11-14 20:45 <a href="http://www.blogjava.net/xiaoxiaoyupku/articles/19762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP中tomcat的SQL Server2000数据库连接池的配置</title><link>http://www.blogjava.net/xiaoxiaoyupku/articles/19757.html</link><dc:creator>潇潇雨</dc:creator><author>潇潇雨</author><pubDate>Mon, 14 Nov 2005 11:34:00 GMT</pubDate><guid>http://www.blogjava.net/xiaoxiaoyupku/articles/19757.html</guid><wfw:comment>http://www.blogjava.net/xiaoxiaoyupku/comments/19757.html</wfw:comment><comments>http://www.blogjava.net/xiaoxiaoyupku/articles/19757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaoxiaoyupku/comments/commentRss/19757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaoxiaoyupku/services/trackbacks/19757.html</trackback:ping><description><![CDATA[转载：转载请保留本信息，本文来自<A href="http://www.matrix.org.cn/resource/article/1/1357.html">http://www.matrix.org.cn/resource/article/1/1357.html</A> 
<DIV id=divarticlecontent>环境：<BR>1. 数据库：Microsoft SQL Server 2000<BR>2. 数据库驱动程序：net.sourceforge.jtds.jdbc.Driver<BR><BR>JNDI（Java Naming and Directory Interface）概述：<BR>Tomcat4（5）提供了一个与Java Enterprise Edition应用服务相兼容的JNDI--InitialContext实现实例。它的初始数据设置在$CATALINA_HOME/conf/server.xml文件里，并可能在网页应用环境描述（/WEB-INF/web.xml）里被下列元素引用：<BR>1) &lt;env-entry&gt;--环境入口，设置应用程序如何操作。<BR>2) &lt;resource-ref&gt;--资源参数，一般是数据库驱动程序、JavaMail Session、自定义类工厂等。<BR>3) &lt;resource-env-ref&gt;--在Servlet 2.4里用来简化设置不需认证信息的资源资源如环境参数、resource-ref变量。<BR><BR>InitialContext在网页应用程序初始化时被设置，用来支持网页应用程序组件。所有的入口和资源都放在JNDI命名空间里的java:comp/env段里。点击下列网址以获取更多信息：<BR>1) Java命名和目录接口（Java Naming and Directory Interface）<BR>2) J2EE平台说明（J2EE Platform Specification）<BR><BR>设置JNDI资源<BR>设置JNDI资源要在$CATALINA_HOME/conf/server.xml文件里使用下列标志符：<BR>1) &lt;Environment&gt;--设置域个可变的JNDI InitialContext入口的名字和值（同上面说的&lt;env-entry&gt;等价）。<BR>2) &lt;Resource&gt;--设置应用程序可用的资源的名字和类型（同上面说的&lt;resource-ref&gt;等价）。<BR>3) &lt;ResourceParams&gt;--设置Java资源类工厂的名称或将用的JavaBean属性。<BR>4) &lt;ResourceLink&gt;--给全局JNDI环境（JNDI Context）添加一个链接。<BR>上述这些标志符必须放在&lt;Context&gt;和&lt;/Context&gt;之间（针对专门的网页应用程序）或&lt;DefaultContext&gt;和&lt;/DefaultContext&gt;之间。<BR>此外，设在网页应用环境描述（Web Application Descriptor）（/WEB-INF/web.xml）里的名字和值也在初始环境（Initial Context）里被设置，当被&lt;Environemt&gt;元素值允许时将被重设初始值。<BR>全局变量能在&lt;Server&gt;子元素的&lt;GlobalNamingResources&gt;里设置。<BR><BR>数据库连接池概述：<BR>数据库连接是一种关键的有限的昂贵的资源，这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性，影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。<BR>数据库连接池负责分配、管理和释放数据库连接，它允许应用程序重复使用一个现有的数据库连接，而再不是重新建立一个；释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。<BR>数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中，这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用，连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数，当应用程序向连接池请求的连接数超过最大连接数量时，这些请求将被加入到等待队列中。数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素：<BR>1) 最小连接数是连接池一直保持的数据库连接，所以如果应用程序对数据库连接的使用量不大，将会有大量的数据库连接资源被浪费；<BR>2) 最大连接数是连接池能申请的最大连接数，如果数据库连接请求超过此数，后面的数据库连接请求将被加入到等待队列中，这会影响之后的数据库操作。<BR>3) 如果最小连接数与最大连接数相差太大，那么最先的连接请求将会获利，之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过，这些大于最小连接数的数据库连接在使用完不会马上被释放，它将被放到连接池中等待重复使用或是空闲超时后被释放。<BR><BR>配置Tomcat数据库连接池的前提：<BR>1. 必须装有Java运行环境；<BR>2. 必须有SQL Server2000数据库服务器（可以不在本地）；<BR>3. 必须有jtds.jar，并将它放在$CATALINA_HOME/common/lib目录下（只能是这里）。使用它是因为Microsoft公司的Java SQL Server驱动程序不支持二次查询，可到网上搜到。目前使用的是jtds-0.6.jar。<BR><BR>在$CATALINA_HOME/conf/server.xml里设置数据库连接池：<BR>下面是配置的代码，必须放在&lt;Host&gt;和&lt;/Host&gt;之间。<BR><PRE class=overflow title="pre code">&lt;Context path="/quality" docBase="quality" debug="0" reloadable="true" crossContext="true"&gt;<BR>&lt;Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_quality_log." suffix=".txt" timestamp="true"/&gt;<BR>&lt;Resource name="jdbc/connectDB" auth="Container" type="javax.sql.DataSource"/&gt;<BR>&lt;ResourceParams name="jdbc/connectDB"&gt;<BR> &lt;parameter&gt;<BR>&nbsp; &lt;name&gt;maxActive&lt;/name&gt;<BR>&nbsp; &lt;!-- Maximum number of DB connections in pool.Set to 0 for no limit. --&gt;<BR>&nbsp; &lt;value&gt;100&lt;/value&gt;<BR> &lt;/parameter&gt;<BR> &lt;parameter&gt;<BR>&nbsp; &lt;name&gt;maxIdle&lt;/name&gt;<BR>&nbsp; &lt;!-- Maximum number of idle DB connections to retain in pool.Set to 0 for no limit. --&gt;<BR>&nbsp; &lt;value&gt;30&lt;/value&gt;<BR> &lt;/parameter&gt;<BR> &lt;parameter&gt;<BR>&nbsp; &lt;name&gt;maxWait&lt;/name&gt;<BR>&nbsp; &lt;!-- Maximum time to wait for a DB connection to become available in ms.An exception is thrown if this timeout is exceeded.Set to -1 to wait indefinitely. --&gt;<BR>&nbsp; &lt;value&gt;10000&lt;/value&gt;<BR> &lt;/parameter&gt;<BR> &lt;parameter&gt;<BR>&nbsp; &lt;name&gt;removeAbandoned&lt;/name&gt;<BR>&nbsp; &lt;!-- Abandoned DB connections are removed and recycled --&gt;<BR>&nbsp; &lt;value&gt;true&lt;/value&gt;<BR> &lt;/parameter&gt;<BR> &lt;parameter&gt;<BR>&nbsp; &lt;name&gt;removeAbandonedTimeout&lt;/name&gt;<BR>&nbsp; &lt;!-- Use the removeAbandonedTimeout parameter to set the number of seconds a DB connection has been idle before it is considered abandoned.&nbsp; --&gt;<BR>&nbsp; &lt;value&gt;60&lt;/value&gt;<BR> &lt;/parameter&gt;<BR> &lt;parameter&gt;<BR>&nbsp; &lt;name&gt;logAbandoned&lt;/name&gt;<BR>&nbsp; &lt;!-- Log a stack trace of the code which abandoned --&gt;<BR>&nbsp; &lt;value&gt;false&lt;/value&gt;<BR> &lt;/parameter&gt;<BR> &lt;parameter&gt;<BR>&nbsp; &lt;name&gt;factory&lt;/name&gt;<BR>&nbsp; &lt;!-DBCP Basic Datasource Factory --&gt;<BR>&nbsp; &lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;<BR> &lt;/parameter&gt;<BR> &lt;parameter&gt;<BR>&nbsp; &lt;name&gt;username&lt;/name&gt;<BR>&nbsp; &lt;!-- Database User Name --&gt;<BR>&nbsp; &lt;value&gt;Iorishinier&lt;/value&gt;<BR> &lt;/parameter&gt;<BR> &lt;parameter&gt;<BR>&nbsp; &lt;name&gt;password&lt;/name&gt;<BR>&nbsp; &lt;!-- User Password --&gt;<BR>&nbsp; &lt;value&gt;mypasswd&lt;/value&gt;<BR> &lt;/parameter&gt;<BR> &lt;parameter&gt;<BR>&nbsp; &lt;name&gt;driverClassName&lt;/name&gt;<BR>&nbsp; &lt;!-- Database Driver Class Name --&gt;<BR>&nbsp; &lt;value&gt;net.sourceforge.jtds.jdbc.Driver&lt;/value&gt;<BR> &lt;/parameter&gt;<BR> &lt;parameter&gt;<BR>&nbsp; &lt;name&gt;url&lt;/name&gt;<BR>&nbsp; &lt;!-- Database Address --&gt;<BR>&nbsp; &lt;value&gt;jdbc:jtds:sqlserver://127.127.127.127:1433/Northwind&lt;/value&gt;<BR> &lt;/parameter&gt;<BR>&lt;/ResourceParams&gt;<BR>&lt;/Context&gt;</PRE><BR>下面是一些参数的说明：<BR>&lt;Context path="/quality" docBase="quality" debug="0" reloadable="true" crossContext="true"&gt;<BR>其中：<BR>1) path 指定路径，这里设定的是$CATALINA_HOME/webapps下的quality目录；<BR>2) docBase 文件根目录。<BR>3) reloader 当网页被更新时是否重新编译。<BR>4) maxActive 连接池的最大数据库连接数。设为0表示无限制。<BR>5) maxIdle 数据库连接的最大空闲时间。超过此空闲时间，数据库连接将被标记为不可用，然后被释放。设为0表示无限制。<BR>6) maxWait 最大建立连接等待时间。如果超过此时间将接到异常。设为－1表示无限制。<BR>7) removeAbandoned 回收被遗弃的（一般是忘了释放的）数据库连接到连接池中。<BR>8) removeAbandonedTimeout 数据库连接过多长时间不用将被视为被遗弃而收回连接池中。<BR>9) logAbandoned 将被遗弃的数据库连接的回收记入日志。<BR>10) driverClassName JDBC驱动程序。<BR>11) url 数据库连接字符串<BR><BR>在$CATALINA_HOME/webapps/quality/WEB-INF/web.xml里设置被引用的资源：<BR>下面是配置代码，必须放在&lt;web-app&gt;和&lt;/web-app&gt;里。<BR><PRE class=overflow title="pre code">&lt;!-- Database Config start --&gt;<BR>&lt;resource-ref&gt;<BR>&lt;description&gt;connectDB test&lt;/description&gt;<BR>&lt;res-ref-name&gt;jdbc/connectDB&lt;/res-ref-name&gt;<BR>&lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;<BR>&lt;res-auth&gt;Container&lt;/res-auth&gt;<BR>&lt;/resource-ref&gt;<BR>&lt;!-- Database Config end --&gt;</PRE><BR><BR>下面是一下参数的必要说明：<BR>1) description 对被引用的资源的描述。<BR>2) res-ref-name 资源名称。见上面的&lt;ResourceParams name="jdbc/connectDB"&gt;<BR>3) res-type 资源类型。见上面的&lt;Resource name="jdbc/connectDB" auth="Container" type="javax.sql.DataSource"/&gt;<BR><BR>在JSP中使用资源：<BR>这是在$CATALINA_HOME/webapps/quality下的某级子目录里的jsp网页文件部分代码：<BR><PRE class=overflow title="pre code">&lt;%@ page contentType="text/html;charset=GBK"%&gt;<BR>&lt;%@ page errorPage="error.jsp"%&gt;<BR>&lt;%@ page import="javax.naming.*"%&gt;<BR>&lt;%@ page import="javax.sql.*"%&gt;<BR>&lt;%@ page import="java.sql.*"%&gt;<BR>&lt;html&gt;<BR> &lt;head&gt;<BR> &lt;/head&gt;<BR> &lt;body&gt;<BR>&nbsp; &lt;%<BR><BR>&nbsp; &nbsp;………………<BR>&nbsp; &nbsp;………………<BR><BR>&nbsp; &nbsp;// 数据库操作<BR>&nbsp; &nbsp;Context ctx=null;<BR>&nbsp; &nbsp;Connection cnn=null;<BR>&nbsp; &nbsp;Statement stmt=null;<BR>&nbsp; &nbsp;ResultSet rs=null;<BR>&nbsp; &nbsp;try<BR>&nbsp; &nbsp;{<BR>&nbsp; &nbsp; ctx=new InitialContext();<BR>&nbsp; &nbsp; if(ctx==null)<BR>&nbsp; &nbsp; &nbsp;throw new Exception("没有匹配的环境");<BR>&nbsp; &nbsp; DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/connectDB");<BR>&nbsp; &nbsp; if(ds==null)<BR>&nbsp; &nbsp; &nbsp;throw new Exception("没有匹配数据库");<BR>&nbsp; &nbsp; <BR>&nbsp; &nbsp; cnn=ds.getConnection();<BR>&nbsp; &nbsp; stmt=cnn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);<BR>&nbsp; &nbsp; rs=stmt.executeQuery("select * from table1");<BR><BR>&nbsp; &nbsp; ………………<BR>&nbsp; &nbsp; ………………<BR><BR>&nbsp; &nbsp;}<BR>&nbsp; &nbsp;finally<BR>&nbsp; &nbsp;{<BR>&nbsp; &nbsp; if(rs!=null)<BR>&nbsp; &nbsp; &nbsp;rs.close();<BR>&nbsp; &nbsp; if(stmt!=null)<BR>&nbsp; &nbsp; &nbsp;stmt.close();<BR>&nbsp; &nbsp; if(cnn!=null)<BR>&nbsp; &nbsp; &nbsp;cnn.close();<BR>&nbsp; &nbsp; if(ctx!=null)<BR>&nbsp; &nbsp; &nbsp;ctx.close();<BR>&nbsp; &nbsp;}<BR>&nbsp; &nbsp; %&gt;<BR> &lt;/body&gt;<BR>&lt;/html&gt;</PRE><BR><BR>代码说明：<BR>DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/connectDB");<BR>上面这句应用了刚才设的资源。<BR>资源使用完要释放，尤其是Context资源，见try-catch-finally部分的finally代码段，这是一种好的习惯。资源释放时如果释放了上级资源，下级资源将先被释放。如：释放了ctx，那么资源释放顺序将是rs，stmt，cnn，ctx。换句话说，如果释放了ctx，那么rs，stmt和cnn都将不可用了。<BR>这里的释放资源只是将数据库连接返回连接池中，并不是把资源真正释放掉，见数据库连接池概述。<BR></DIV><img src ="http://www.blogjava.net/xiaoxiaoyupku/aggbug/19757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaoxiaoyupku/" target="_blank">潇潇雨</a> 2005-11-14 19:34 <a href="http://www.blogjava.net/xiaoxiaoyupku/articles/19757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符编码问题(作者Blog：http://blog.csdn.net/diaokegang/)</title><link>http://www.blogjava.net/xiaoxiaoyupku/articles/6097.html</link><dc:creator>潇潇雨</dc:creator><author>潇潇雨</author><pubDate>Tue, 14 Jun 2005 02:25:00 GMT</pubDate><guid>http://www.blogjava.net/xiaoxiaoyupku/articles/6097.html</guid><wfw:comment>http://www.blogjava.net/xiaoxiaoyupku/comments/6097.html</wfw:comment><comments>http://www.blogjava.net/xiaoxiaoyupku/articles/6097.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaoxiaoyupku/comments/commentRss/6097.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaoxiaoyupku/services/trackbacks/6097.html</trackback:ping><description><![CDATA[<UL>
<LI><STRONG>html</STRONG></LI></UL>
<P>无论是独立的html,还是其他程序生成的,如servlet等,注意在最终的html的&lt;head&gt;和&lt;/head&gt;之间必须加入meta标签,用来指定html中输入字符的编码.如:<BR>　&lt;head&gt;<BR>　<SPAN class=style1>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;</SPAN><BR>　&lt;title&gt;测试GET &amp;&amp; POST-Send&lt;/title&gt;<BR>　&lt;/head&gt;</P>
<UL>
<LI><STRONG>jsp和servlet</STRONG></LI></UL>
<P>　首先必须解决程序输出(如response.writeln(String s))和接受从客户端传来的数据(如request.getParameter(String sname))编码问题，我们可以利用文件过滤功能，具体需要所用的jsp/servlet容器或者服务器提供的功能设置，如在Tomcat5.5.9中可以在webapps/yourAppDirectory/WEB-INF/web.xml中设置如下：</P>
<BLOCKQUOTE>
<P>&lt;filter&gt;<BR>　 &lt;filter-name&gt;SetCharsetEncodingFilter&lt;/filter-name&gt;<BR>　 &lt;display-name&gt;SetCharsetEncodingFilter&lt;/display-name&gt;<BR>　 &lt;description&gt;Set CharsetEncoding Filter&lt;/description&gt;<BR>　 &lt;filter-class&gt;com.gg.comm.web.SetCharsetEncodingFilter&lt;/filter-class&gt;<BR>　 &lt;init-param&gt;<BR>　　 &lt;param-name&gt;encoding&lt;/param-name&gt;<BR>　　 &lt;param-value&gt;gb2312&lt;/param-value&gt;<BR>　 &lt;/init-param&gt;<BR>&lt;/filter&gt;<BR>&lt;filter-mapping&gt;<BR>　 &lt;filter-name&gt;SetCharsetEncodingFilter&lt;/filter-name&gt;<BR>　 &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<BR>&lt;/filter-mapping&gt;</P>
<P>其中SetCharsetEncodingFilter Class就是用来设置request和reponse字符编码的filter类，其中设置语句如下：</P>
<P>　　request.setCharacterEncoding(targetEncoding);<BR>　　response.setContentType("text/html");<BR>　　response.setCharacterEncoding(targetEncoding);</P></BLOCKQUOTE>
<P>　另外为了解决通过get(url中带有参数)方式传递参数的乱码问题，我们还需要设置一下url传递参数所需要的编码，具体在Tomcat5.5.9中可以在${Tomcat_home}\conf\server.xml中的&lt;connector&gt;和&lt;/connector&gt;之间设置，如下：</P>
<BLOCKQUOTE>
<P>&lt;!--<BR>　URIEncoding="GBK":Force GET method String(Chinese) can be transferd properly by http:uri</P>
<P>&nbsp;&nbsp;&nbsp; note:Tomcat only support GBK specification,so not set charset gb2312<BR>--&gt;<BR>&lt;Connector <SPAN class=style4><FONT color=#00cc00>URIEncoding="GBK"</FONT></SPAN> port="80" redirectPort="8443"　maxSpareThreads="75" 　maxThreads="150" minSpareThreads="25"&gt;<BR>&lt;/Connector&gt;</P></BLOCKQUOTE>
<P>　最后为了解决jsp的乱码问题，我们还需要作如下处理，即在左右的jsp头均加上如下指令：</P>
<P>　　&lt;%@ page contentType="text/html;charset=gb2312" language="java"　%&gt;<BR>　　或者<BR>　　&lt;%@ page pageEncoding="gb2312"%&gt;</P>
<UL>
<LI><STRONG>jdbc和数据库</STRONG></LI></UL>
<P>关于写入数据库和读取数据库数据的乱码问题，可以通过如下方式轻松解决：</P>
<UL>
<LI><FONT size=-1>对于JAVA程序的处理方法按我们指定的方法处理。</FONT> 
<LI><FONT size=-1>把数据库默认支持的编码格式改为GBK或GB2312的。</FONT> </LI></UL>
<P>到此，一般来说对于WEB方式的应用来说，中文问题就可以解决了。当然以上方法是根据统一编码的原则解决的以及WEB方式的文件转换关系（file-&gt;class-&gt;load-&gt;execute or transfered or response or request）来做的。</P><img src ="http://www.blogjava.net/xiaoxiaoyupku/aggbug/6097.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaoxiaoyupku/" target="_blank">潇潇雨</a> 2005-06-14 10:25 <a href="http://www.blogjava.net/xiaoxiaoyupku/articles/6097.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE体系结构简单介绍--引自作者Blog：http://blog.csdn.net/dazern/</title><link>http://www.blogjava.net/xiaoxiaoyupku/articles/6035.html</link><dc:creator>潇潇雨</dc:creator><author>潇潇雨</author><pubDate>Mon, 13 Jun 2005 05:32:00 GMT</pubDate><guid>http://www.blogjava.net/xiaoxiaoyupku/articles/6035.html</guid><wfw:comment>http://www.blogjava.net/xiaoxiaoyupku/comments/6035.html</wfw:comment><comments>http://www.blogjava.net/xiaoxiaoyupku/articles/6035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaoxiaoyupku/comments/commentRss/6035.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaoxiaoyupku/services/trackbacks/6035.html</trackback:ping><description><![CDATA[<FONT size=2><FONT face=宋体><STRONG>2005年6月13日13:34:35<BR>一、J2EE提出的背景<BR></STRONG>1、&nbsp;&nbsp;&nbsp;&nbsp;企业级应用框架的需求<BR>在许多企业级应用中，例如数据库连接、邮件服务、事务处理等都是一些<STRONG><FONT color=#a52a2a>通用企业需求模块</FONT></STRONG>，这些模块如果每次再开发中都由开发人员来完成的话，将会造成开发周期长和代码可靠性差等问题。于是许多大公司开发了自己的通用模块服务。这些服务性的软件系列同陈为中间件。<BR>2、&nbsp;&nbsp;&nbsp;&nbsp;<STRONG><FONT color=#a52a2a>为了通用必须要提出规范，不然无法达到通用<BR></FONT></STRONG>在上面的需求基础之上，许多公司都开发了自己的中间件，但其与用户的沟通都各有不同，从而导致用户无法将各个公司不同的中间件组装在一块为自己服务。从而产生瓶颈。于是提出标准的概念。其实J2EE就是基于JAVA技术的一系列标准。<BR>注：中间件的解释&nbsp;中间件处在操作系统和更高一级应用程序之间。他充当的功能是：将应用程序运行环境与操作系统隔离，从而实现应用程序开发者不必为更多系统问题忧虑，而直接关注该应用程序在解决问题上的能力&nbsp;。我们后面说到的容器的概念就是中间件的一种。<BR><B>二、相关名词解释</B><BR><STRONG><FONT color=#a52a2a>容器：充当中间件的角色<BR></FONT></STRONG>WEB容器：给处于其中的应用程序组件（JSP，SERVLET）提供一个环境，使JSP,SERVLET直接跟容器中的环境变量接口交互，不必关注其它系统问题。主要有WEB服务器来实现。例如：TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB&nbsp;APPLICATION&nbsp;标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。<BR>EJB容器：Enterprise&nbsp;java&nbsp;bean&nbsp;容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器，马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。<BR>WEB容器和EJB容器在原理上是大体相同的，更多的区别是被隔离的外界环境。WEB容器更多的是跟基于HTTP的请求打交道。而EJB容器不是。它是更多的跟数据库、其它服务打交道。但他们都是把与外界的交互实现从而减轻应用程序的负担。例如SERVLET不用关心HTTP的细节，直接引用环境变量session,request,response就行、EJB不用关心数据库连接速度、各种事务控制，直接由容器来完成。<BR>RMI/IIOP:远程方法调用/internet对象请求中介协议，他们主要用于通过远程调用服务。例如，远程有一台计算机上运行一个程序，它提供股票分析服务，我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。<BR>JNDI:JAVA命名目录服务。主要提供的功能是：提供一个目录系统，让其它各地的应用程序在其上面留下自己的索引，从而满足快速查找和定位分布式应用程序的功能。<BR>JMS:JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。<BR>JAVAMAIL:JAVA邮件服务。提供邮件的存储、传输功能。他是JAVA编程中实现邮件功能的核心。相当MS中的EXCHANGE开发包。<BR>JTA：JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。<BR>JAF:JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。<BR>EAI:企业应用集成。是一种概念，从而牵涉到好多技术。J2EE技术是一种很好的集成实现。<BR><B>三、J2EE的优越性</B><BR>1、&nbsp;&nbsp;&nbsp;&nbsp;基于JAVA&nbsp;技术，平台无关性表现突出<BR>2、&nbsp;&nbsp;&nbsp;&nbsp;开放的标准，许多大型公司已经实现了对该规范支持的应用服务器。如BEA&nbsp;,IBM,ORACLE等。<BR>3、&nbsp;&nbsp;&nbsp;&nbsp;提供相当专业的通用软件服务。<BR>4、&nbsp;&nbsp;&nbsp;&nbsp;提供了一个优秀的企业级应用程序框架，对快速高质量开发打下基础<BR><BR><B>四、现状</B><BR>J2EE是由SUN&nbsp;公司开发的一套企业级应用规范。现在最高版本是1.4。支持J2EE的应用服务器有IBM&nbsp;WEBSPHERE&nbsp;APPLICATION&nbsp;SERVER,BEA&nbsp;WEBLOGIC&nbsp;SERVER,JBOSS,ORACLE&nbsp;APPLICATION&nbsp;SERVER,SUN&nbsp;ONE&nbsp;APPLICATION&nbsp;SERVER&nbsp;等。.<BR><BR></FONT></FONT>
<DIV style="FONT-SIZE: 14px; LINE-HEIGHT: 25px"><A id=ArticleContent1_ArticleContent1_AuthorBlogLink href="http://blog.csdn.net/dazern/" target=_blank></A>&nbsp;</DIV><img src ="http://www.blogjava.net/xiaoxiaoyupku/aggbug/6035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaoxiaoyupku/" target="_blank">潇潇雨</a> 2005-06-13 13:32 <a href="http://www.blogjava.net/xiaoxiaoyupku/articles/6035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>