﻿<?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 for memory</title><link>http://www.blogjava.net/Lanny/</link><description>memory is forever</description><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2026 12:34:42 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2026 12:34:42 GMT</pubDate><ttl>60</ttl><item><title>Sybase IQ的备份与恢复</title><link>http://www.blogjava.net/Lanny/archive/2010/05/19/321386.html</link><dc:creator>Lanny</dc:creator><author>Lanny</author><pubDate>Wed, 19 May 2010 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/Lanny/archive/2010/05/19/321386.html</guid><wfw:comment>http://www.blogjava.net/Lanny/comments/321386.html</wfw:comment><comments>http://www.blogjava.net/Lanny/archive/2010/05/19/321386.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Lanny/comments/commentRss/321386.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Lanny/services/trackbacks/321386.html</trackback:ping><description><![CDATA[<p><span style="color: #333333; font-family: Arial;" lang="EN-US">1</span><span style="color: #333333;">、</span><span style="color: #333333; font-family: Arial;" lang="EN-US">Sybase IQ server</span><span style="color: #333333;">有三种备份类型：</span></p>
<p><span style="color: #333333;">（</span><span style="color: #333333; font-family: Arial;" lang="EN-US">1</span><span style="color: #333333;">）、完全备份（</span><span style="color: #333333; font-family: Arial;" lang="EN-US">full</span><span style="color: #333333;">）</span></p>
<p><span style="color: #333333;">（</span><span style="color: #333333; font-family: Arial;" lang="EN-US">2</span><span style="color: #333333;">）、增量备份（</span><span style="color: #333333; font-family: Arial;" lang="EN-US">incremental</span><span style="color: #333333;">）</span></p>
<p><span style="color: #333333;">（</span><span style="color: #333333; font-family: Arial;" lang="EN-US">3</span><span style="color: #333333;">）、完全备份的基础上增量备份（</span><span style="color: #333333; font-family: Arial;" lang="EN-US">incremental
since full</span><span style="color: #333333;">）</span></p>
<p><span style="color: #333333;">注：增量备份和完全备份的基础上增量备份都会对</span><span style="color: #333333; font-family: Arial;" lang="EN-US">Catalog
Store </span><span style="color: #333333;">进行完全备份，</span><span style="color: #333333;">默认情况下为完全
备份。</span></p>
<p><span style="color: #333333; font-family: Arial;" lang="EN-US">2</span><span style="color: #333333;">、</span><span style="color: #333333; font-family: Arial;" lang="EN-US">Sybase IQ server</span><span style="color: #333333;">的顺序：</span></p>
<p><span style="color: #333333;">（</span><span style="color: #333333; font-family: Arial;" lang="EN-US">1</span><span style="color: #333333;">）、</span><span style="color: #333333; font-family: Arial;" lang="EN-US">Catalog Store</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: 宋体;">（</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">2</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">）、</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">Transaction log File</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: 宋体;">（</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">3</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">）、</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">IQ Store</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">3</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">、当</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">IQ server</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">正在备份时：</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: 宋体;">（</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">1</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">）、默认情况下操作员必须在现场，挂持接备份介质。</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: 宋体;">（</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">2</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">）、操作员可
以不在场，但必须正确地估算出备份的数据量大小，并且在安装备份设备时，要选&#8220;高级&#8221;安装方可。</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: 宋体;">（</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">3</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">）、数据库备
份不会将未提交的内容进行备份。</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">4</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">、备份命令：</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">BACKUP DATABASE [CRC ON|OFF]</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">[Attended ON|OFF]</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">[BLOCK FACTOR integer]</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">[{FULL|INCREMENTAL|INCREMENTAL
SINCE FULL}]</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">TO
&#8216;archive_device&#8217; [SIZE # of KB integer]</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: 宋体;">例子：</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">BACKUP DATABASE TO &#8216;dev/rmt/0n&#8217;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: 宋体;">注：</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">BACKUP</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">不支持裸设备</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">5</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">、系统级别的备份：</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: 宋体;">如果</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">IQ server</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">运行时进行
系统级别的备份，则会导致服务崩溃或丢失数据。所以，必须确定</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">IQ server</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">是停止状态
时，方可进行系统级别备份。</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">6</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">、备份的恢复：</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: 宋体;">（</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">1</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">）、必须连接到</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">utility_db</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">数据库后才可以进行恢复操作，并且在恢复数据时不能有用户连接到数据库，启动utility_db的方法：start_asiq -n myserver -gu utility_db。<br />
</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: 宋体;">（</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">2</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">）、如果有完全恢复，</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">Catalog Store </span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">和</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">Transaction Log</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">（即</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">.db </span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">和</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">.log</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">文件）必须从目标文件夹下删除。</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: 宋体;">（</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">3</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">）、如果为增量恢复，</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">Catalog Store </span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">和</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">Transaction Log</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">（即</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">.db </span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">和</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">.log</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">文件）必须存在于目标文件夹中。</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: 宋体;">（</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">3</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">）、恢复可以将原来</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">dbspace</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">的物理位置
更换，暨更改目录和名称。</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">7</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">、恢复的命
令：</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">RESTORE
DATABASE &#8216;c:\\newdir\\mydb.db&#8217;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">FROM &#8216;c:\\asiq\\backup1&#8217;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">FROM &#8216;c:\\asiq\\backup2&#8217;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: 宋体;">在进行恢复
时，必须注意恢复的顺序和备份时的顺序完全一致。</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">8</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">、数据库备份后，配置文件和日志文件是没有被备份的，所以如果恢复时要单独对这两种文件进行恢复。配置文
件可以直接拷贝即可，但日志文件是不能用原来的</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">.log</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">文件的。</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">&nbsp;&nbsp; </span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">如果恢复到原来的目录中，则不用新建</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">.log</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">文件。如果没有恢复到原目录，则必须用</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">dblog</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">工具手动生
成</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">.log</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">文件。</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">9</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">、</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">dblog</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">工具的命令语法：</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">Dblog [option] database_file</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">Option</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">：</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">-t log-name</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">，指定事务</span><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">log</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">文件名。</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">-m mirror-name</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">，设置事务日
志镜象名。</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">-r</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">，停止事务
日志的镜象。</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">-o</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">，输出日志
信息到文件。</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 12pt; color: #333333; font-family: Arial;" lang="EN-US">-q</span><span style="font-size: 12pt; color: #333333; font-family: 宋体;">，安静模
式，不打印信息。</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="color: #333333; font-family: 宋体;">例：</span><span style="color: #333333;" lang="EN-US">dblog&nbsp; -r</span><span style="color: #333333; font-family: 宋体;"> -t</span><span style="color: #333333;" lang="EN-US"> f:\asiqmrr\asiqmrr.log &nbsp; f:\asiqmrr\asiqmrr.db</span></p>
<p style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<span style="color: #333333;" lang="EN-US">sybaseiq的备份与恢复：<br />
备份：<br />
backup database to
'e:\lslwork\temp\sybiqGP' ;<br />
恢复：<br />
restore database 'C:\Program
Files\Sybase\ASIQ-12_6\gupiao\GP.db'<br />
from 'e:\lslwork\temp\sybiqGP'</span>
<img src ="http://www.blogjava.net/Lanny/aggbug/321386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Lanny/" target="_blank">Lanny</a> 2010-05-19 16:04 <a href="http://www.blogjava.net/Lanny/archive/2010/05/19/321386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache dblUtils 工具包的使用</title><link>http://www.blogjava.net/Lanny/archive/2009/08/20/291946.html</link><dc:creator>Lanny</dc:creator><author>Lanny</author><pubDate>Thu, 20 Aug 2009 06:26:00 GMT</pubDate><guid>http://www.blogjava.net/Lanny/archive/2009/08/20/291946.html</guid><wfw:comment>http://www.blogjava.net/Lanny/comments/291946.html</wfw:comment><comments>http://www.blogjava.net/Lanny/archive/2009/08/20/291946.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Lanny/comments/commentRss/291946.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Lanny/services/trackbacks/291946.html</trackback:ping><description><![CDATA[<span  style="font-family: Arial, sans-serifarial, Verdana, Helvetica; font-size: 12px; line-height: 18px; ">
<div class="blog_title" style="margin-bottom: 15px; "><strong style="font-weight: bold; ">关键字: commons-dbutils 工具包的使用</strong></div>
<div class="blog_content">commons-dbutils 是 Apache 组织提供的一个开源 JDBC 工具类库，能让我们更简单的使用 JDBC 。&nbsp;<br />
今天，在传智播客的课堂上，我们学习了 DBUtils 类库，知道了如何能够更方便地使用 JDBC 。以下是我的学习总结。&nbsp;<br />
<br />
<br />
--------------------------------------------------------------------------------&nbsp;<br />
1. API 介绍：&nbsp;<br />
&lt;1&gt; org.apache.commons.dbutils.DbUtils：提供如关闭连接、装载 JDBC 驱动程序等常规工作的工具类；&nbsp;<br />
&lt;2&gt; org.apache.commons.dbutils.QueryRunner：该类简单化了 SQL 查询，它与 ResultSetHandler 组合在一起使用可以完成大部分的数据库操作，能够大大减少编码量。&nbsp;<br />
&lt;3&gt; org.apache.commons.dbutils.ResultSetHandler：该接口用于处理 java.sql.ResultSet，将数据按要求转换为另一种形式。&nbsp;<br />
--------------------------------------------------------------------------------&nbsp;<br />
<br />
2. 工具类的方法及示例代码：&nbsp;<br />
&lt;1&gt; DBUtil 类的主要方法如下：&nbsp;<br />
a. public static void close(&#8230;) throws java.sql.SQLException：　DbUtils类提供了三个重载的关闭&nbsp;<br />
<br />
方法。这些方法检查所提供的参数是不是 NULL ，如果不是的话，它们就关闭 Connection、Statement 和 ResultSet。&nbsp;<br />
b. public static void closeQuietly(&#8230;): 这一类方法不仅能在 Connection、Statement 和ResultSet 为 NULL 情况下避免关闭，还能隐藏一些在程序中抛出的 SQLEeception。&nbsp;<br />
c. public static void commitAndCloseQuietly(Connection conn)： 用来提交连接，然后关闭连接，并&nbsp;<br />
<br />
且在关闭连接时不抛出 SQL 异常。&nbsp;<br />
d. public static boolean loadDriver(java.lang.String driverClassName)：这一方装载并注册 JDBC 驱动程序，如果成功就返回 true 。使用该方法，你不需要捕捉这个异常 ClassNotFoundException。&nbsp;<br />
<br />
<br />
--------------------------------------------------------------------------------&nbsp;<br />
&lt;2&gt; QueryRunner 类的构造方法及主要方法：&nbsp;<br />
a. 默认的构造方法:&nbsp;<br />
public QueryRunner(){}&nbsp;<br />
b. 需要一个 javax.sql.DataSource 来作参数的构造方法:&nbsp;<br />
public QueryRunner(DataSource ds) {&nbsp;<br />
this.ds = ds;&nbsp;<br />
}&nbsp;<br />
QueryRunner类的主要方法：&nbsp;<br />
c. public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh)&nbsp;<br />
throws SQLException：执行一个查询操作，在这个查询中，对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。更重要的是参数 ResultSetHandler 会把从 ResultSet 中获得的数据转换成程序需要的数据格式。&nbsp;<br />
d. public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException：几乎与第一种方法一样；唯一的不同在于它不将数据库连接提供给方法，并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得 Connection。&nbsp;<br />
e. public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException ：执行一个不需要置换参数的查询操作。&nbsp;<br />
f. public int update(Connection conn, String sql, Object[] params) throws SQLException：用来执行一个更新（插入、更新或删除）操作。&nbsp;<br />
g. public int update(Connection conn, String sql) throws SQLException：用来执行一个不需要置换&nbsp;<br />
<br />
参数的更新操作。&nbsp;<br />
<br />
<br />
--------------------------------------------------------------------------------&nbsp;<br />
&lt;3&gt; ResultSetHandler接口&nbsp;<br />
ResultSetHandler 接口提供了一个单独的方法：&nbsp;<br />
Object handle (java.sql.ResultSet .rs)。&nbsp;<br />
--------------------------------------------------------------------------------&nbsp;<br />
&lt;4&gt; ResultSetHandler 接口的实现类&nbsp;<br />
a. ArrayHandler：把结果集中的第一行数据转成对象数组。&nbsp;<br />
b. ArrayListHandler：把结果集中的每一行数据都转成一个对象数组，再存放到 List 中。&nbsp;<br />
c. BeanHandler：将结果集中的第一行数据封装到一个对应的 JavaBean 实例中。&nbsp;<br />
d. BeanListHandler：将结果集中的每一行数据都封装到一个对应的 JavaBean 实例中，存放到 List里。&nbsp;<br />
e. ColumnListHandler：将结果集中某一列的数据存放到 List 中。&nbsp;<br />
f. KeyedHandler：将结果集中的每一行数据都封装到一个 Map 里，然后再根据指定的key把每个 Map 再存放到一个 Map 里。&nbsp;<br />
g. MapHandler：将结果集中的第一行数据封装到一个 Map 里，key 是列名，value 就是对应的值。&nbsp;<br />
h. MapListHandler：将结果集中的每一行数据都封装到一个 Map 里，然后再存放到 List。&nbsp;<br />
i. ScalarHandler：将结果集中某一条记录的其中某一列的数据存成 Object。&nbsp;<br />
--------------------------------------------------------------------------------&nbsp;<br />
&lt;5&gt; 下面是简单对这几个工具类的测试代码：&nbsp;<br />
QueryRunner runner = null;&nbsp;<br />
runner = new QueryRunner();// 获得QueryRunner类的实例对象&nbsp;<br />
Connection conn = null;&nbsp;<br />
Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动&nbsp;<br />
conn = DriverManager.getConnection("jdbc:mysql://localhost:3309/bookstore",&nbsp;<br />
"root", "1230");// 与数据库建立连接&nbsp;<br />
String sql = "SELECT id, name, title, price, yr, description, saleAmount FROM books&nbsp;<br />
<br />
WHERE id = ?";// 准备 sql 语句&nbsp;<br />
List&lt;Book&gt; list = (List) runner.query(conn, sql, new Object[]{"201"}, new&nbsp;<br />
<br />
BeanListHandler(Book.class));// 运用 QueryRunner 的方法执行 sql 语句，并获取结果集，从这里可&nbsp;<br />
<br />
//以看出运用 commons-dbutils 类库的方便之处，避免了创建 ResultSet 对象来设置参数的麻烦。&nbsp;<br />
System.out.println(books.size()); //输出 books 的元素个数&nbsp;<br />
<br />
<br />
--------------------------------------------------------------------------------&nbsp;<br />
&lt;6&gt; 其它类和接口：&nbsp;<br />
a. org.apache.commons.dbutils.QueryLoader类：属性文件加载器，主要用于加载属性文件中的 SQL 到内存中。&nbsp;<br />
b. org.apache.commons.dbutils.wrappers.SqlNullCheckedResultSet类：该类是用来对sql语句执行完成&nbsp;<br />
<br />
之后的的数值进行null的替换。&nbsp;<br />
c. org.apache.commons.dbutils.wrappers.StringTrimmedResultSet类：去除ResultSet中字段的左右空格。&nbsp;<br />
d. org.apache.commons.dbutils.RowProcessor接口：提供了把结果集的行数据转换成其它格式的功能。它的实现类是org.apache.commons.dbutils.BasicRowProcessor类。&nbsp;</div>
</span>
<img src ="http://www.blogjava.net/Lanny/aggbug/291946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Lanny/" target="_blank">Lanny</a> 2009-08-20 14:26 <a href="http://www.blogjava.net/Lanny/archive/2009/08/20/291946.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XFire配置步骤</title><link>http://www.blogjava.net/Lanny/archive/2008/12/10/245469.html</link><dc:creator>Lanny</dc:creator><author>Lanny</author><pubDate>Wed, 10 Dec 2008 04:57:00 GMT</pubDate><guid>http://www.blogjava.net/Lanny/archive/2008/12/10/245469.html</guid><wfw:comment>http://www.blogjava.net/Lanny/comments/245469.html</wfw:comment><comments>http://www.blogjava.net/Lanny/archive/2008/12/10/245469.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Lanny/comments/commentRss/245469.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Lanny/services/trackbacks/245469.html</trackback:ping><description><![CDATA[ <img src ="http://www.blogjava.net/Lanny/aggbug/245469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Lanny/" target="_blank">Lanny</a> 2008-12-10 12:57 <a href="http://www.blogjava.net/Lanny/archive/2008/12/10/245469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 禁止邮件服务的方法</title><link>http://www.blogjava.net/Lanny/archive/2008/11/25/242485.html</link><dc:creator>Lanny</dc:creator><author>Lanny</author><pubDate>Tue, 25 Nov 2008 03:36:00 GMT</pubDate><guid>http://www.blogjava.net/Lanny/archive/2008/11/25/242485.html</guid><wfw:comment>http://www.blogjava.net/Lanny/comments/242485.html</wfw:comment><comments>http://www.blogjava.net/Lanny/archive/2008/11/25/242485.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Lanny/comments/commentRss/242485.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Lanny/services/trackbacks/242485.html</trackback:ping><description><![CDATA[<p><span style="font-family: Comic Sans MS">&nbsp; </span></p>
<p style="line-height: 175%"><span style="font-family: Comic Sans MS">Red Hat Linux默然会启动邮件通知服务，将系统的各种错误和告警日志信息发邮件通知Root用户，随着时间的积累，邮件数量不断膨胀，导致/根目录的磁盘空间已满，影响系统的正常运行，一般程序部署完毕后都禁止该邮件通知服务，具体的方法如下：</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; line-height: 175%; tab-stops: list 18.0pt"><span style="font-family: Comic Sans MS">1）在控制台输入命令：Service sendmail stop，该命令是停止当前的邮件通知服务，但系统重启后该服务仍然默然启动；</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; line-height: 175%; tab-stops: list 18.0pt"><span style="font-family: Comic Sans MS">2）在控制台输入命令：chkconfig --del sendmai，该命令是删除开机启动服务检查项，即开机不运行邮件通知服务；</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; line-height: 175%; tab-stops: list 18.0pt"><span style="font-family: Comic Sans MS">3）mv /etc/rc.d/init.d/sendmail /etc/rc.d/init.d/sendmail.bak，把sendmail文件重命名；</span></p>
<p><span style="font-family: Comic Sans MS">&nbsp;</span></p>
<img src ="http://www.blogjava.net/Lanny/aggbug/242485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Lanny/" target="_blank">Lanny</a> 2008-11-25 11:36 <a href="http://www.blogjava.net/Lanny/archive/2008/11/25/242485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序设计模式之-----单实例模式</title><link>http://www.blogjava.net/Lanny/archive/2008/11/25/242482.html</link><dc:creator>Lanny</dc:creator><author>Lanny</author><pubDate>Tue, 25 Nov 2008 03:19:00 GMT</pubDate><guid>http://www.blogjava.net/Lanny/archive/2008/11/25/242482.html</guid><wfw:comment>http://www.blogjava.net/Lanny/comments/242482.html</wfw:comment><comments>http://www.blogjava.net/Lanny/archive/2008/11/25/242482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Lanny/comments/commentRss/242482.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Lanny/services/trackbacks/242482.html</trackback:ping><description><![CDATA[  <img src ="http://www.blogjava.net/Lanny/aggbug/242482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Lanny/" target="_blank">Lanny</a> 2008-11-25 11:19 <a href="http://www.blogjava.net/Lanny/archive/2008/11/25/242482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序设计模式之----Observer模式</title><link>http://www.blogjava.net/Lanny/archive/2008/11/25/242478.html</link><dc:creator>Lanny</dc:creator><author>Lanny</author><pubDate>Tue, 25 Nov 2008 03:02:00 GMT</pubDate><guid>http://www.blogjava.net/Lanny/archive/2008/11/25/242478.html</guid><wfw:comment>http://www.blogjava.net/Lanny/comments/242478.html</wfw:comment><comments>http://www.blogjava.net/Lanny/archive/2008/11/25/242478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Lanny/comments/commentRss/242478.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Lanny/services/trackbacks/242478.html</trackback:ping><description><![CDATA[<p><span style="font-family: Comic Sans MS"><span style="font-family: 黑体"><span style="font-family: 隶书"><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS">Observer模式也称为观察者模式，<br />
</span></span></span></span></span><span style="font-family: 微软雅黑"><br />
<span style="font-family: Comic Sans MS"><span style="font-family: 黑体"><span style="font-family: 隶书"><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS">观察者模式是java已经实现的模式,我们只要利用java.util.Obserable类和java.util.Observer接口就可以实现观察者模式</span></span></span></span></span></span></p>
<p><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS"><span style="font-family: 黑体"><span style="font-family: 隶书"><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS">实现过程:</span></span></span></span></span></span></p>
<p><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS"><span style="font-family: 黑体"><span style="font-family: 隶书"><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS">被观察者必须继承Observable,一旦事件被触发,调用notifyObservers通知观察者</span></span></span></span></span></span></p>
<p><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS"><span style="font-family: 黑体"><span style="font-family: 隶书"><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS">观察者必须实现Observer接口,实现update方法,完成事件处理</span></span></span></span></span></span></p>
<p><span style="font-family: Comic Sans MS"></span></p>
<p><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS"><span style="font-family: 黑体"><span style="font-family: 隶书"><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS">举个经典的例子....猫叫,老鼠跑.人惊醒....</span></span></span></span></span></span></p>
<p><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS"><span style="font-family: 黑体"><span style="font-family: 隶书"><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS">代码:</span></span></span></span></span></span><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS"><span style="font-family: 黑体"><span style="font-family: 隶书"><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS"></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;javamodel.observer;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Observable;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Observer;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img id="Codehighlighter1_86_146_Open_Image" onclick="this.style.display='none'; Codehighlighter1_86_146_Open_Text.style.display='none'; Codehighlighter1_86_146_Closed_Image.style.display='inline'; Codehighlighter1_86_146_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_86_146_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_86_146_Closed_Text.style.display='none'; Codehighlighter1_86_146_Open_Image.style.display='inline'; Codehighlighter1_86_146_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_86_146_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_86_146_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;猫叫，老鼠跑，主人被惊醒,用代码实现这个连锁反应&nbsp;。<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;Administrator<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*<br />
</span><span style="color: #008080">10</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" /></span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img id="Codehighlighter1_175_386_Open_Image" onclick="this.style.display='none'; Codehighlighter1_175_386_Open_Text.style.display='none'; Codehighlighter1_175_386_Closed_Image.style.display='inline'; Codehighlighter1_175_386_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_175_386_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_175_386_Closed_Text.style.display='none'; Codehighlighter1_175_386_Open_Image.style.display='inline'; Codehighlighter1_175_386_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TestObserver&nbsp;</span><span id="Codehighlighter1_175_386_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_175_386_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img id="Codehighlighter1_216_383_Open_Image" onclick="this.style.display='none'; Codehighlighter1_216_383_Open_Text.style.display='none'; Codehighlighter1_216_383_Closed_Image.style.display='inline'; Codehighlighter1_216_383_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_216_383_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_216_383_Closed_Text.style.display='none'; Codehighlighter1_216_383_Open_Image.style.display='inline'; Codehighlighter1_216_383_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)</span><span id="Codehighlighter1_216_383_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_216_383_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;Cat&nbsp;c</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Cat();<br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;Observer&nbsp;o1</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Mouse();<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;Observer&nbsp;o2</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Man();<br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;c.addObserver(o1);<br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;Mouse&nbsp;oo1</span><span style="color: #000000">=</span><span style="color: #000000">(Mouse)o1;</span><span style="color: #008000">//</span><span style="color: #008000">向下转型</span><span style="color: #008000"><br />
</span><span style="color: #008080">20</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;oo1.addObserver(o2);<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;c.CatSay();<br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img id="Codehighlighter1_417_538_Open_Image" onclick="this.style.display='none'; Codehighlighter1_417_538_Open_Text.style.display='none'; Codehighlighter1_417_538_Closed_Image.style.display='inline'; Codehighlighter1_417_538_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_417_538_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_417_538_Closed_Text.style.display='none'; Codehighlighter1_417_538_Open_Image.style.display='inline'; Codehighlighter1_417_538_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Cat&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Observable</span><span id="Codehighlighter1_417_538_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_417_538_Open_Text"><span style="color: #000000">{</span><span style="color: #008000">//</span><span style="color: #008000">猫被老鼠观察，猫是被观察者</span><span style="color: #008000"><br />
</span><span style="color: #008080">27</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img id="Codehighlighter1_455_536_Open_Image" onclick="this.style.display='none'; Codehighlighter1_455_536_Open_Text.style.display='none'; Codehighlighter1_455_536_Closed_Image.style.display='inline'; Codehighlighter1_455_536_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_455_536_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_455_536_Closed_Text.style.display='none'; Codehighlighter1_455_536_Open_Image.style.display='inline'; Codehighlighter1_455_536_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CatSay()</span><span id="Codehighlighter1_455_536_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_455_536_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">29</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">猫叫了</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">30</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.setChanged();<br />
</span><span style="color: #008080">31</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.notifyObservers();<br />
</span><span style="color: #008080">32</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">34</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">35</span><span style="color: #000000"><img id="Codehighlighter1_591_795_Open_Image" onclick="this.style.display='none'; Codehighlighter1_591_795_Open_Text.style.display='none'; Codehighlighter1_591_795_Closed_Image.style.display='inline'; Codehighlighter1_591_795_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_591_795_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_591_795_Closed_Text.style.display='none'; Codehighlighter1_591_795_Open_Image.style.display='inline'; Codehighlighter1_591_795_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Mouse&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Observable&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Observer</span><span id="Codehighlighter1_591_795_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_591_795_Open_Text"><span style="color: #000000">{</span><span style="color: #008000">//</span><span style="color: #008000">老鼠观察猫，猫是观察者,对于人,老鼠是被观察者</span><span style="color: #008000"><br />
</span><span style="color: #008080">36</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
</span><span style="color: #008080">37</span><span style="color: #000000"><img id="Codehighlighter1_668_792_Open_Image" onclick="this.style.display='none'; Codehighlighter1_668_792_Open_Text.style.display='none'; Codehighlighter1_668_792_Closed_Image.style.display='inline'; Codehighlighter1_668_792_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_668_792_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_668_792_Closed_Text.style.display='none'; Codehighlighter1_668_792_Open_Image.style.display='inline'; Codehighlighter1_668_792_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;update(Observable&nbsp;arg0,&nbsp;Object&nbsp;arg1)&nbsp;</span><span id="Codehighlighter1_668_792_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_668_792_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">38</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000"><br />
</span><span style="color: #008080">39</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">猫叫了，老鼠跑了</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">40</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.setChanged();<br />
</span><span style="color: #008080">41</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.notifyObservers();<br />
</span><span style="color: #008080">42</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">43</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">44</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">45</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">46</span><span style="color: #000000"><img id="Codehighlighter1_827_970_Open_Image" onclick="this.style.display='none'; Codehighlighter1_827_970_Open_Text.style.display='none'; Codehighlighter1_827_970_Closed_Image.style.display='inline'; Codehighlighter1_827_970_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_827_970_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_827_970_Closed_Text.style.display='none'; Codehighlighter1_827_970_Open_Image.style.display='inline'; Codehighlighter1_827_970_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Man&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Observer</span><span id="Codehighlighter1_827_970_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_827_970_Open_Text"><span style="color: #000000">{</span><span style="color: #008000">//</span><span style="color: #008000">人观察老鼠,人是观察者</span><span style="color: #008000"><br />
</span><span style="color: #008080">47</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
</span><span style="color: #008080">48</span><span style="color: #000000"><img id="Codehighlighter1_892_968_Open_Image" onclick="this.style.display='none'; Codehighlighter1_892_968_Open_Text.style.display='none'; Codehighlighter1_892_968_Closed_Image.style.display='inline'; Codehighlighter1_892_968_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_892_968_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_892_968_Closed_Text.style.display='none'; Codehighlighter1_892_968_Open_Image.style.display='inline'; Codehighlighter1_892_968_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;update(Observable&nbsp;arg0,&nbsp;Object&nbsp;arg1)&nbsp;</span><span id="Codehighlighter1_892_968_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_892_968_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">49</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000"><br />
</span><span style="color: #008080">50</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">老鼠跑了,人惊醒了</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">51</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">52</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">53</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">54</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p><br />
总结， <span style="font-family: 宋体">观察者模式的应用场景：</span></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt">1、&nbsp;<span style="font-family: 宋体">对一个对象状态的更新，需要其他对象同步更新，而且其他对象的数量动态可变。</span></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt">2、&nbsp;<span style="font-family: 宋体">对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。</span></p>
<p style="margin: 0cm 0cm 0pt 21pt"><span style="font-family: 宋体">观察者模式的优点：</span></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt">1、&nbsp;Subject<span style="font-family: 宋体">和</span>Observer<span style="font-family: 宋体">之间是松偶合的，分别可以各自独立改变。</span></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt">2、&nbsp;Subject<span style="font-family: 宋体">在发送广播通知的时候，无须指定具体的</span>Observer<span style="font-family: 宋体">，</span>Observer<span style="font-family: 宋体">可以自己决定是否要订阅</span>Subject<span style="font-family: 宋体">的通知。</span></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt">3、&nbsp;<span style="color: black; font-family: 宋体">遵守大部分</span><span style="color: black">GRASP</span><span style="color: black; font-family: 宋体">原则和常用设计原则，高内聚、低偶合。</span></p>
<p style="margin: 0cm 0cm 0pt 21pt"><span style="font-family: 宋体">观察者模式的缺陷：</span></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt">1、&nbsp;<span style="font-family: 宋体">松偶合导致代码关系不明显，有时可能难以理解。</span>(<span style="background: red 0% 50%; font-family: 宋体; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">废话</span>)</p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt">2、&nbsp;<span style="font-family: 宋体">如果一个</span>Subject<span style="font-family: 宋体">被大量</span>Observer<span style="font-family: 宋体">订阅的话，在广播通知的时候可能会有效率问题。（毕竟只是简单的遍历）</span></p>
<p><br />
</span></span></span></span></span></span></p>
<img src ="http://www.blogjava.net/Lanny/aggbug/242478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Lanny/" target="_blank">Lanny</a> 2008-11-25 11:02 <a href="http://www.blogjava.net/Lanny/archive/2008/11/25/242478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>