﻿<?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-路漫漫其修远兮，吾将上下而求索-随笔分类-SSH+JQuery+DWR</title><link>http://www.blogjava.net/fhtdy2004/category/39268.html</link><description>经验浅薄，耐心积累；记性不好，记诸文字</description><language>zh-cn</language><lastBuildDate>Mon, 15 Feb 2010 09:58:34 GMT</lastBuildDate><pubDate>Mon, 15 Feb 2010 09:58:34 GMT</pubDate><ttl>60</ttl><item><title>【转】Hibernate/Spring/Struts架构使用OpenSessionInView的问题</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/08/09/290400.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sat, 08 Aug 2009 16:14:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/08/09/290400.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/290400.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/08/09/290400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/290400.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/290400.html</trackback:ping><description><![CDATA[<br />
http://www.javaeye.com/topic/15057<br />
<br />
值得研究一下<br />
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/290400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-08-09 00:14 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/08/09/290400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】Spring 和 struts1.2 整合的三种方式</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/08/08/290395.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sat, 08 Aug 2009 15:35:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/08/08/290395.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/290395.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/08/08/290395.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/290395.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/290395.html</trackback:ping><description><![CDATA[<div class="blog_content">
<p>1，使用Spring 的 ActionSupport <br />
2, 使用Spring 的 DelegatingRequestProcessor 类。<br />
3，全权委托。</p>
<p>无论用那种方法来整合第一步就是要为struts来装载spring的应用环境。 就是在 struts 中加入一个插件。<br />
struts-config.xml中</p>
<p>&nbsp;&lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;<br />
&nbsp;&nbsp;&lt;set-property property="contextConfigLocation" value<span style="color: #ff0000">="/WEB-INF/applicationContext.xml</span>"/&gt;<br />
&nbsp;&lt;/plug-in&gt;</p>
<p><br />
spring 的配置文件被作为参数配置进来。这样可以省略对web.xml 文件中的配置。<span style="color: #ff0000">确保你的applicationContext.xml 在WEB-INF目录下面</span></p>
<p><strong>1，使用Spring的ActionSupport .</strong><br />
Spring 的ActionSupport 继承至 org.apache.struts.action.Action <br />
ActionSupport的子类可以或得 WebApplicationContext类型的全局变量。通过getWebApplicationContext()可以获得这个变量。</p>
<p>这是一个 servlet 的代码：<br />
public class LoginAction extends org.springframework.web.struts.<span style="color: #ff0000">ActionSupport</span> {<br />
&nbsp;<br />
&nbsp;public ActionForward execute(ActionMapping mapping, ActionForm form,<br />
&nbsp;&nbsp;&nbsp;HttpServletRequest request, HttpServletResponse response) {<br />
&nbsp;&nbsp;LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获得&nbsp; WebApplicationContext&nbsp; 对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;<span style="color: #ff0000">WebApplicationContext ctx = this.getWebApplicationContext();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;LoginDao dao = (LoginDao) ctx.getBean("loginDao");<br />
</span>&nbsp;&nbsp;User u = new User();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;u.setName(loginForm.getName());<br />
&nbsp;&nbsp;u.setPwd(loginForm.getPwd());<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;if(dao.checkLogin(u)){<br />
&nbsp;&nbsp;&nbsp;return mapping.findForward("success");<br />
&nbsp;&nbsp;}else{<br />
&nbsp;&nbsp;&nbsp;return&nbsp; mapping.findForward("error");<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;}<br />
}</p>
<p>applicationContext.xml 中的配置<br />
&lt;beans&gt;<br />
&nbsp;&lt;bean id="loginDao" class="com.cao.dao.LoginDao"/&gt;<br />
&lt;/beans&gt;</p>
<p>这中配置方式同直接在web.xml文件配置差别不大。注意：Action继承自 org.springframework.web.struts.ActionSupport 使得struts和spring耦合在一起。<br />
但实现了表示层和业务逻辑层的解耦(LoginDao dao = (LoginDao) ctx.getBean("loginDao"))。</p>
<p><br />
<strong>2,使用Spring 的 DelegatingRequestProcessor 类</strong><br />
DelegatingRequestProcessor&nbsp; 继承自 org.apache.struts.action.RequestProcessor 并覆盖了里面的方法。<br />
sturts-config.xml&nbsp; 中&nbsp; <span style="color: #ff0000">&lt;controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/&gt;</span> 通过 &lt;controller &gt;来替代<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts.action.RequestProcessor 的请求处理。</p>
<p>public class LoginAction extends <span style="color: #ff0000">Action</span> {<br />
&nbsp;//利用spring来注入这个对象。<br />
&nbsp;<span style="color: #ff0000">private LoginDao dao ;<br />
&nbsp;<br />
&nbsp;public void setDao(LoginDao dao) {<br />
&nbsp;&nbsp;System.out.println("执行注入");<br />
&nbsp;&nbsp;this.dao = dao;<br />
&nbsp;}</span></p>
<p>&nbsp;public LoginDao getDao() {<br />
&nbsp;&nbsp;return dao;<br />
&nbsp;}</p>
<p>&nbsp;public ActionForward execute(ActionMapping mapping, ActionForm form,<br />
&nbsp;&nbsp;&nbsp;HttpServletRequest request, HttpServletResponse response) {<br />
&nbsp;&nbsp;LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub<br />
&nbsp;&nbsp;<span style="color: #ff0000">//这样一改这行代码似乎没有必要了。<br />
&nbsp;&nbsp;//WebApplicationContext ctx = this.getWebApplicationContext();<br />
&nbsp;&nbsp;//LoginDao dao = (LoginDao) ctx.getBean("loginDao");<br />
</span>&nbsp;<br />
&nbsp;&nbsp;User u = new User();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;u.setName(loginForm.getName());<br />
&nbsp;&nbsp;u.setPwd(loginForm.getPwd());<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//直接用dao来调用spring会将这个对象实例化。<br />
&nbsp;&nbsp;if(dao.checkLogin(u)){<br />
&nbsp;&nbsp;&nbsp;return mapping.findForward("success");<br />
&nbsp;&nbsp;}else{<br />
&nbsp;&nbsp;&nbsp;return&nbsp; mapping.findForward("error");<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;}<br />
}<br />
这里的。<br />
LoginAction extends Action 说明 struts 每有和spring 耦合。<br />
看一下<br />
applicationContext.xml 中的配置。<br />
&lt;beans&gt;<br />
&nbsp;&lt;bean id="loginDao" class="com.cao.dao.LoginDao"/&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean <span style="color: #ff0000">name="/login" </span>class="com.cao.struts.action.LoginAction"&gt;<br />
&nbsp;&nbsp;&lt;property name="dao"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref local="loginDao"/&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&lt;/beans&gt;</p>
<p><span style="color: #ff0000">这里 name="/login" 与struts 中的path匹配 <br />
&nbsp;&nbsp;&nbsp; class="com.cao.struts.action.LoginAction" 与struts 中的type匹配</span> </p>
<p>还要为 LoginAction 提供必要的setXXX方法。 获得ApplicationCotext和依赖注入的工作都在DelegatingRequestProcessor中完成。</p>
<p><br />
<strong>3，全权委托：<br />
</strong>Action 的创建和对象的依赖注入全部由IOC容器来完成。 使用Spring的DelegatingAcionProxy来帮助实现代理的工作 <br />
org.springframework.web.struts.DelegatingActiongProxy继承于org.apache.struts.action.Action .</p>
<p><br />
全权委托的配置方式同 方式 2 类似 (applcationContext.xml文件的配置和 Action类的实现方式相同)。<br />
&lt;struts-config&gt;<br />
&nbsp; &lt;data-sources /&gt;<br />
&nbsp; &lt;form-beans &gt;<br />
&nbsp;&nbsp;&nbsp; &lt;form-bean name="loginForm" type="com.cao.struts.form.LoginForm" /&gt;</p>
<p>&nbsp; &lt;/form-beans&gt;</p>
<p>&nbsp; &lt;global-exceptions /&gt;<br />
&nbsp; &lt;global-forwards /&gt;<br />
&nbsp;&lt;action-mappings &gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- type指向的是spring 的代理类 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;action<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attribute="loginForm"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input="login.jsp"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="loginForm"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path="/login"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope="request"</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">&nbsp; type="org.springframework.web.struts.DelegatingActionProxy"</span> &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/ok.jsp" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="error" path="/error.jsp" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;<br />
&nbsp;&lt;/action-mappings&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp; &lt;message-resources parameter="com.cao.struts.ApplicationResources" /&gt;</p>
<p>&nbsp;&lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;<br />
&nbsp;&nbsp;&lt;set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/&gt;<br />
&nbsp;&lt;/plug-in&gt;</p>
<p>&lt;/struts-config&gt;<br />
<span style="color: #ff0000">不同之处</span><br />
<span style="color: #ff0000">1， &lt;action&gt;中 type指向的是spring 的代理类</span></p>
<p><span style="color: #ff0000">2， 去掉struts-config.xml中 &lt;controller &gt;</span></p>
<p>&nbsp;</p>
<p>三种整和方式中我们优先选用 全权委托的方式。<br />
理由：<br />
1，第一种使得过多的耦合了Spring和Action .<br />
2,RequestProcessor类已经被代理 如果要再实现自己的实现方式（如：编码处理）怕有点麻烦。</p>
<p>总结一下：<br />
整合工作中的步骤：<br />
1，修改struts-config.xml&nbsp;&nbsp; <br />
2, 配置applicationContext.xml<br />
3, 为Action添加get/set方法 来获得依赖注入的功能。</p>
<p>本文转自：<a href="http://blog.csdn.net/caoyinghui1986/archive/2008/06/02/2501914.aspx">http://blog.csdn.net/caoyinghui1986/archive/2008/06/02/2501914.aspx</a></p>
</div>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/290395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-08-08 23:35 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/08/08/290395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解惑 spring 嵌套事务</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/08/02/289424.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sat, 01 Aug 2009 16:05:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/08/02/289424.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/289424.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/08/02/289424.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/289424.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/289424.html</trackback:ping><description><![CDATA[<br />
解惑 spring 嵌套事务 http://www.javaeye.com/topic/35907?page=1<br />
<br />
Spring声明式事务管理源码解读之事务开始 http://www.javaeye.com/topic/87426<br />
<br />
Spring声明式事务管理源码解读之事务提交&nbsp; http://www.javaeye.com/topic/88189
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/289424.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-08-02 00:05 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/08/02/289424.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】关于oracle数据库隔离级别isolation level 的一些问题！</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/08/01/292542.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sat, 01 Aug 2009 10:16:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/08/01/292542.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/292542.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/08/01/292542.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/292542.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/292542.html</trackback:ping><description><![CDATA[<div class="cnt" id="blog_text"><span style="color: red"><strong>oracle中锁的类型：<br />
然后再读时不需要加锁，这一点Oracle的共享锁的实现与上一篇中的共享锁原理有点不同，</strong></span><br />
<br />
今天在查看oracle官方文档lock的那一部分的时候发现一个新的概念，isolation level (数据隔离级别)，虽然以前学过，但是忘的差不多了。<br />
<strong>隔离级别（isoation eve）</strong>
<p>隔离级别定义了事务与事务之间的隔离程度。</p>
<p>隔离级别与并发性是互为矛盾的：隔离程度越高，数据库的并发性越差；隔离程度越低，数据库的并发性越好。</p>
<p>ANSI/ISO SQ92标准定义了一些数据库操作的隔离级别：</p>
<ul>
    <li>未提交读（read uncommitted）
    <li>提交读（read committed）&nbsp;&nbsp;
    <li>重复读（repeatabe read）&nbsp;&nbsp;
    <li>序列化（seriaizabe） </li>
</ul>
<p>通过一些现象，可以反映出隔离级别的效果。这些现象有：</p>
<ul>
    <li>更新丢失（ost update）：当系统允许两个事务同时更新同一数据是，发生更新丢失。&nbsp;&nbsp;
    <li>脏读（dirty read）：当一个事务读取另一个事务尚未提交的修改时，产生脏读。
    <li>非 重复读（nonrepeatabe read）：同一查询在同一事务中多次进行，由于其他提交事务所做的修改或删除，每次返回不同的结果集，此时发生非重复读。(A transaction rereads data it has previousy read and finds that another committed transaction has modified or deeted the data. )
    <li>幻 像（phantom read）：同一查询在同一事务中多次进行，由于其他提交事务所做的插入操作，每次返回不同的结果集，此时发生幻像读。(A transaction reexecutes a query returning a set of rows that satisfies a search condition and finds that another committed transaction has inserted additiona rows that satisfy the condition. ) </li>
</ul>
<p>下面是隔离级别及其对应的可能出现或不可能出现的现象</p>
<table cellspacing="0" cellpadding="2" width="579" border="0" unselectable="on">
    <tbody>
        <tr>
            <td valign="top" width="150"></td>
            <td valign="top" width="104">Dirty Read</td>
            <td valign="top" width="138">NonRepeatabe Read </td>
            <td valign="top" width="182">Phantom Read </td>
        </tr>
        <tr>
            <td valign="top" width="150">Read uncommitted</td>
            <td valign="top" width="104">Possible</td>
            <td valign="top" width="138">Possible</td>
            <td valign="top" width="179">Possible</td>
        </tr>
        <tr>
            <td valign="top" width="150">Read committed</td>
            <td valign="top" width="104">not possible</td>
            <td valign="top" width="138">Possible</td>
            <td valign="top" width="178">Possible</td>
        </tr>
        <tr>
            <td valign="top" width="150">Repeatabe read</td>
            <td valign="top" width="104">not possible</td>
            <td valign="top" width="138">not possible</td>
            <td valign="top" width="176">Possible</td>
        </tr>
        <tr>
            <td valign="top" width="149">Seriaizabe</td>
            <td valign="top" width="104">not possible</td>
            <td valign="top" width="138">not possible</td>
            <td valign="top" width="176">not possible</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<p><strong>ORACE</strong><strong>的隔离级别</strong></p>
<p>ORACE提供了SQ92标准中的read committed和seriaizabe，同时提供了非SQ92标准的read-ony。</p>
<p><strong>read committed：</strong></p>
<ul>
    <li><font color="#ff0000">这是ORACE缺省的事务隔离级别。</font>
    <li>事务中的每一条语句都遵从语句级的读一致性。
    <li>保证不会脏读；但可能出现非重复读和幻像。 </li>
</ul>
<p><strong>seriaizabe：（</strong>串行执行事务，并发性最小）</p>
<ul>
    <li><font color="#ff0000">简单地说，seriaizabe就是使事务看起来象是一个接着一个地顺序地执行。</font>
    <li>仅仅能看见在本事务开始前由其它事务提交的更改和在本事务中所做的更改。
    <li>保证不会出现非重复读和幻像。
    <li>Seriaizabe隔离级别提供了read-ony事务所提供的读一致性（事务级的读一致性），同时又允许DM操作。 </li>
</ul>
<p>如果有在seriaizabe事务开始时未提交的事务在seriaizabe事务结束之前修改了seriaizabe事务将要修改的行并进行了提交，则seriaizabe事务不会读到这些变更，因此发生无法序列化访问的错误。（换一种解释方法：<strong>只要在seriaizabe事务开始到结束之间有其他事务对seriaizabe事务要修改的东西进行了修改并提交了修改，则发生无法序列化访问的错误</strong>。）</p>
<p>If a serializable transaction contains data manipulation language (DML) that attempts to update any resource that may have been updated in a transaction uncommitted at the start of the serializable transaction, （并且修改在后来被提交而没有回滚），then the DML statement fails. 返回的错误是ORA-08177: Cannot serialize access for this transaction。</p>
<p>ORACE在数据块中记录最近对数据行执行修改操作的N个事务的信息，目的是确定本事务开始时，是否存在未提交的事务修改了本事务将要修改的行。具体见英文：</p>
<p>Oracle permits a serializable transaction to modify a data row only if it can determine that prior changes to the row were made by transactions that had committed when the serializable transaction began.</p>
<p>To make this determination efficiently, Oracle uses control information stored in the data block that indicates which rows in the block contain committed and uncommitted changes. In a sense, the block contains a recent history of transactions that affected each row in the block. The amount of history that is retained is controlled by the INITRANS parameter of CREATE TABLE and ALTER TABLE. Under some circumstances, Oracle may have insufficient history information to determine whether a row has been updated by a "too recent" transaction. This can occur when many transactions concurrently modify the same data block, or do so in a very short period. You can avoid this situation by setting higher values of INITRANS for tables that will experience many transactions updating the same blocks. Doing so will enable Oracle to allocate sufficient storage in each block to record the history of recent transactions that accessed the block.</p>
<p>The INITRANS Parameter：Oracle stores control information in each data block to manage access by concurrent transactions. Therefore, if you set the transaction isolation level to serializable, you must use the ALTER TABLE command to set INITRANS to at least 3. This parameter will cause Oracle to allocate sufficient storage in each block to record the history of recent transactions that accessed the block. Higher values should be used for tables that will undergo many transactions updating the same blocks.</p>
<p><strong>read-ony：</strong></p>
<ul>
    <li>遵从事务级的读一致性，仅仅能看见在本事务开始前由其它事务提交的更改。
    <li>不允许在本事务中进行DM操作。
    <li>read ony是seriaizabe的子集。它们都避免了非重复读和幻像。区别是在read ony中是只读；而在seriaizabe中可以进行DM操作。
    <li>Export with CONSISTENT = Y sets the transaction to read-ony. </li>
</ul>
<p>&nbsp;</p>
<p><strong>read committed和seriaizabe的区别和联系：</strong></p>
<p>事务1先于事务2开始，并保持未提交状态。事务2想要修改正被事务1修改的行。事务2等待。如果事务1回滚，则事务2（不论是read committed还是seriaizabe方式）进行它想要做的修改。如果事务1提交，则当事务2是read committed方式时，进行它想要做的修改；当事务2是seriaizabe方式时，失败并报错&#8220;Cannot seriaize access&#8221;，因为事务2看不见事务1提交的修改，且事务2想在事务1修改的基础上再做修改。</p>
<p>即seriaizabe不允许存在事务嵌套</p>
<p>具体见英文：</p>
<p>Both read committed and serializable transactions use row-level locking, and both will wait if they try to change a row updated by an uncommitted concurrent transaction. The second transaction that tries to update a given row waits for the other transaction to commit or roll back and release its lock. If that other transaction rolls back, the waiting transaction (regardless of its isolation mode) can proceed to change the previously locked row, as if the other transaction had not existed. However, if the other (blocking) transaction commits and releases its locks, a read committed transaction proceeds with its intended update. A serializable transaction, however, fails with the error "Cannot serialize access", <strong>because the other transaction has committed a change that was made since the serializable transaction began</strong>.</p>
<p>read committed和seriaizabe可以在ORACE并行服务器中使用。</p>
<p>关于SET TRANSACTION READ WRITE：read write和read committed 应该是一样的。在读方面，它们都避免了脏读，但都无法实现重复读。虽然没有文档说明read write在写方面与read committed一致，但显然它在写的时候会加排他锁以避免更新丢失。在加锁的过程中，如果遇到待锁定资源无法锁定，应该是等待而不是放弃。这与 read committed一致。</p>
<p>语句级的读一致性</p>
<ul>
    <li>ORACE保证语句级的读一致性，即一个语句所处理的数据集是在单一时间点上的数据集，这个时间点是这个语句开始的时间。
    <li>一个语句看不见在它开始执行后提交的修改。
    <li>对于DM语句，它看不见由自己所做的修改，即DM语句看见的是它本身开始执行以前存在的数据。 </li>
</ul>
<p>事务级的读一致性</p>
<ul>
    <li>事务级的读一致性保证了可重复读，并保证不会出现幻像。 </li>
</ul>
<p><strong>设置隔离级别</strong></p>
<p>设置一个事务的隔离级别</p>
<ul>
    <li>SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
    <li>SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    <li>SET TRANSACTION READ ONLY; </li>
</ul>
<p>设置增个会话的隔离级别</p>
<ul>
    <li>ATER SESSION SET ISOLATION_LEVE SERIALIZABLE;
    <li>ATER SESSION SET ISOLATION_LEVE READ COMMITTED; </li>
</ul>
<p>&nbsp;</p>
<h2>Choice of Isolation Level</h2>
<p>Application designers and developers should choose an isolation level based on application performance and consistency needs as well as application coding requirements.</p>
<p>For environments with many concurrent users rapidly submitting transactions, designers must assess transaction performance requirements in terms of the expected transaction arrival rate and response time demands. Frequently, for high-performance environments, the choice of isolation levels involves a trade-off between consistency and concurrency.</p>
<h3>Read Committed Isolation</h3>
<p><strong>For many applications, read committed is the most appropriate isolation level.</strong> Read committed isolation can provide considerably more concurrency with a somewhat increased risk of inconsistent results due to phantoms and non-repeatable reads for some transactions.</p>
<p><strong>Many high-performance environments with high transaction arrival rates require more throughput and faster response times than can be achieved with serializable isolation.</strong> Other environments that supports users with a very low transaction arrival rate also face very low risk of incorrect results due to phantoms and nonrepeatable reads. Read committed isolation is suitable for both of these environments.</p>
<p>两种情况：（1）在事务量大、高性能的计算环境，需要更高的吞吐量和响应时间；（2）事务数少，并且发生幻影和不可重复读的几率的比较低</p>
<p>Oracle read committed isolation provides transaction set consistency for every query. That is, every query sees data in a consistent state. Therefore, read committed isolation will suffice for many applications that might require a higher degree of isolation if run on other database management systems that do not use multiversion concurrency control.</p>
<p>Read committed isolation mode does not require application logic to trap the "Cannot serialize access" error and loop back to restart a transaction. In most applications, few transactions have a functional need to issue the same query twice, so for many applications protection against phantoms and non-repeatable reads is not important. Therefore many developers choose read committed to avoid the need to write such error checking and retry code in each transaction.</p>
<h3>Serializable Isolation</h3>
<p>Oracle's serializable isolation is suitable for environments where there is a relatively low chance that two concurrent transactions will modify the same rows and the long-running transactions are primarily read-only. It is most suitable for environments with large databases and short transactions that update only a few rows.</p>
<p>（1）适合于很少存在两个事务同时修改同一条记录的情况</p>
<p>（2）长事务以只读为主</p>
<p>（3）大型数据库并且每个短事务只修改很少的记录</p>
<p>Serializable isolation mode provides somewhat more consistency by protecting against phantoms and nonrepeatable reads and can be important where a read/write transaction executes a query more than once.</p>
<p>Unlike other implementations of serializable isolation, which lock blocks for read as well as write, Oracle provides nonblocking queries and the fine granularity of row-level locking, both of which reduce write/write contention. For applications that experience mostly read/write contention, Oracle serializable isolation can provide significantly more throughput than other systems. Therefore, some applications might be suitable for serializable isolation on Oracle but not on other systems.</p>
<p>All queries in an Oracle serializable transaction see the database as of a single point in time, so this isolation level is suitable where multiple consistent queries must be issued in a read/write transaction. A report-writing application that generates summary data and stores it in the database might use serializable mode because it provides the consistency that a <code>READ</code> <code>ONLY</code> transaction provides, but also allows <code>INSERT</code>, <code>UPDATE</code>, and <code>DELETE</code>.</p>
</div>
<br />
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/292542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-08-01 18:16 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/08/01/292542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】详解spring事务属性</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/08/01/289387.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sat, 01 Aug 2009 06:17:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/08/01/289387.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/289387.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/08/01/289387.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/289387.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/289387.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://www.javaeye.com/topic/78674回帖中也有些需要注意的地方。。可以仔细看看先了解一下数据库并发操作带来的数据不一致性包括三类：丢失修改，不可重复读（第二个事务修改，或插入，或删除，应该说幻读是指插入或删除的情况），脏读。&nbsp;                                    T1        ...&nbsp;&nbsp;<a href='http://www.blogjava.net/fhtdy2004/archive/2009/08/01/289387.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/289387.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-08-01 14:17 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/08/01/289387.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】解析oracle的ROWNUM </title><link>http://www.blogjava.net/fhtdy2004/archive/2009/07/30/289189.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 30 Jul 2009 15:43:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/07/30/289189.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/289189.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/30/289189.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/289189.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/289189.html</trackback:ping><description><![CDATA[<p style="color: #0000ff">对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号，返回的第一行分配的是1，第二行是2，依此类推，这个伪字段可以用于限制查询返回的总行数，而且rownum不能以任何表的名称作为前缀。<br />
举例说明：<br />
例如表：student(学生)表，表结构为：<br />
ID　　　&nbsp;&nbsp;&nbsp; char(6)　　　　　 --学号<br />
name　　　　VARCHAR2(10)　　　--姓名 <br />
create table student (ID char(6), name VARCHAR2(100));<br />
insert into sale values('200001',&#8216;张一&#8217;);<br />
insert into sale values('200002',&#8216;王二&#8217;);<br />
insert into sale values('200003',&#8216;李三&#8217;);<br />
insert into sale values('200004',&#8216;赵四&#8217;);<br />
commit;<br />
<br />
(1) rownum 对于等于某值的查询条件<br />
如果希望找到学生表中第一条学生的信息，可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息，使用rownum=2结果查不到数据。因为rownum都是从1开始，但是1以上的自然数在rownum做等于判断是时认为都是false条件，所以无法查到rownum = n（n&gt;1的自然数）。<br />
SQL&gt; select rownum,id,name from student where rownum=1;（可以用在限制返回记录条数的地方，保证不出错，如：隐式游标）<br />
SQL&gt; select rownum,id,name from student where rownum=1;<br />
&nbsp;&nbsp;&nbsp; ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
---------- ------ ---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 200001 张一<br />
SQL&gt; select rownum,id,name from student where rownum =2; <br />
&nbsp;&nbsp;&nbsp; ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
---------- ------ ---------------------------------------------------</p>
<p style="color: #0000ff">（2）rownum对于大于某值的查询条件<br />
&nbsp;&nbsp; 如果想找到从第二行记录以后的记录，当使用rownum&gt;2是查不出记录的，原因是由于rownum是一个总是从1开始的伪列，Oracle 认为rownum&gt; n(n&gt;1的自然数)这种条件依旧不成立，所以查不到记录<br />
SQL&gt; select rownum,id,name from student where rownum &gt;2;<br />
ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
---------- ------ ---------------------------------------------------<br />
那如何才能找到第二行以后的记录呀。可以使用以下的子查询方法来解决。注意子查询中的rownum必须要有别名，否则还是不会查出记录来，这是因为rownum不是某个表的列，如果不起别名的话，无法知道rownum是子查询的列还是主查询的列。<br />
SQL&gt;select * from(select rownum no ,id,name from student) where no&gt;2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
---------- ------ ---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 200003 李三<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 200004 赵四<br />
SQL&gt; select * from(select rownum,id,name from student)where rownum&gt;2;<br />
&nbsp;&nbsp;&nbsp; ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
---------- ------ ---------------------------------------------------</p>
<p style="color: #0000ff">（3）rownum对于小于某值的查询条件<br />
如果想找到第三条记录以前的记录，当使用rownum&lt;3是能得到两条记录的。显然rownum对于rownum&lt;n（(n&gt;1的自然数）的条件认为是成立的，所以可以找到记录。<br />
SQL&gt; select rownum,id,name from student where rownum &lt;3;<br />
&nbsp;&nbsp;&nbsp; ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
---------- ------ ---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 200001 张一<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 200002 王二<br />
综上几种情况，可能有时候需要查询rownum在某区间的数据，那怎么办呀从上可以看出rownum对小于某值的查询条件是人为true的，rownum对于大于某值的查询条件直接认为是false的，但是可以间接的让它转为认为是true的。那就必须使用子查询。例如要查询rownum在第二行到第三行之间的数据，包括第二行和第三行数据，那么我们只能写以下语句，先让它返回小于等于三的记录行，然后在主查询中判断新的rownum的别名列大于等于二的记录行。但是这样的操作会在大数据集中影响速度。<br />
SQL&gt; select * from (select rownum no,id,name from student where rownum&lt;=3 ) where no &gt;=2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
---------- ------ ---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 200002 王二<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 200003 李三</p>
<p style="color: #0000ff">（4）rownum和排序<br />
Oracle中的rownum的是在取数据的时候产生的序号，所以想对指定排序的数据去指定的rowmun行数据就必须注意了。<br />
SQL&gt; select rownum ,id,name from student order by name;<br />
&nbsp;&nbsp;&nbsp; ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
---------- ------ ---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 200003 李三<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 200002 王二<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 200001 张一<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 200004 赵四<br />
可以看出，rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号，rowid也是顺序分配的。为了解决这个问题，必须使用子查询<br />
SQL&gt; select rownum ,id,name from (select * from student order by name);<br />
&nbsp;&nbsp;&nbsp; ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
---------- ------ ---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 200003 李三<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 200002 王二<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 200001 张一<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 200004 赵四<br />
这样就成了按name排序，并且用rownum标出正确序号（有小到大）<br />
笔者在工作中有一上百万条记录的表，在jsp页面中需对该表进行分页显示， 便考虑用rownum来作，下面是具体方法(每页<br />
显示20条)： <br />
&#8220;select * from tabname where rownum&lt;20 order by name" 但却发现oracle却不能按自己的意愿来执行，而是先随便<br />
取20条记录，然后再 order by，后经咨询oracle,说rownum确实就这样，想用的话，只能用子查询 来实现先排序，后<br />
rownum，方法如下： <br />
"select * from (select * from tabname order by name) where rownum&lt;20",但这样一来，效率会较低很多。 <br />
后经笔者试验，只需在order by 的字段上加主键或索引即可让oracle先按 该字段排序，然后再rownum；方法不变： <br />
&nbsp;&nbsp; &#8220;select * from tabname where rownum&lt;20 order by name"</p>
<p style="color: #0000ff">取得某列中第N大的行</p>
<p style="color: #0000ff">select column_name from <br />
(select table_name.*,dense_rank() over (order by column desc) rank from table_name) <br />
where rank = &amp;N； <br />
　假如要返回前5条记录：</p>
<p style="color: #0000ff">　　select * from tablename where rownum&lt;6;(或是rownum &lt;= 5 或是rownum != 6) <br />
假如要返回第5-9条记录：</p>
<p style="color: #0000ff">select * from tablename <br />
where &#8230; <br />
and rownum&lt;10 <br />
minus <br />
select * from tablename <br />
where &#8230; <br />
and rownum&lt;5 <br />
order by name <br />
选出结果后用name排序显示结果。(先选再排序)</p>
<p style="color: #0000ff">注意：只能用以上符号(&lt;、&lt;=、!=)。</p>
<p style="color: #0000ff">select * from tablename where rownum != 10;返回的是前９条记录。 <br />
不能用：&gt;,&gt;=,=,Between...and。由于rownum是一个总是从1开始的伪列，Oracle 认为这种条件 不成立，查不到记录.</p>
<p style="color: #0000ff">另外，这个方法更快：</p>
<p style="color: #0000ff">select * from ( <br />
select rownum r,a from yourtable <br />
where rownum &lt;= 20 <br />
order by name ) <br />
where r &gt; 10 <br />
这样取出第11-20条记录!(先选再排序再选)</p>
<p style="color: #0000ff">要先排序再选则须用select嵌套：内层排序外层选。 <br />
rownum是随着结果集生成的，一旦生成，就不会变化了；同时,生成的结果是依次递加的，没有1就永远不会有2! <br />
rownum 是在 查询集合产生的过程中产生的伪列，并且如果where条件中存在 rownum 条件的话，则:</p>
<p style="color: #0000ff">1： 假如 判定条件是常量，则： <br />
只能 rownum = 1, &lt;= 大于1 的自然数， = 大于1 的数是没有结果的， 大于一个数也是没有结果的 <br />
即 当出现一个 rownum 不满足条件的时候则 查询结束 　　this is stop key!</p>
<p style="color: #0000ff">2: 当判定值不是常量的时候 <br />
若条件是 = var , 则只有当 var 为1 的时候才满足条件，这个时候不存在 stop key ,必须进行 full scan ,对每个满足其他where条件的数据进行判定 <br />
选出一行后才能去选rownum=2的行&#8230;&#8230; </p>
 <img src ="http://www.blogjava.net/fhtdy2004/aggbug/289189.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-30 23:43 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/30/289189.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】drop、truncate和delete的区别</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/07/28/288796.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Tue, 28 Jul 2009 11:43:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/07/28/288796.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/288796.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/28/288796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/288796.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/288796.html</trackback:ping><description><![CDATA[<p>查到很多，能理解的就这几条了：</p>
<p>&nbsp;&nbsp; （1）回滚/日志。DELETE语句执行删除的过程是每次从表中删除一行，并且同时将该行的的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE 则一次性地从表中删除所有的数据页并不把单独的删除操作记录记入日志保存，删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。</p>
<p>&nbsp;&nbsp; （2）表和索引所占空间。当表被TRUNCATE 后，这个表和索引所占用的空间会恢复到初始大小，而DELETE操作不会减少表或索引所占用的空间。</p>
<p>&nbsp;&nbsp; （3）应用范围。TRUNCATE 只能对TABLE；DELETE可以是table,view,synonym</p>
<p>&nbsp;&nbsp; （4）TRUNCATE 和DELETE只删除数据，而DROP则删除整个表（结构和数据）。 </p>
<p>&nbsp;&nbsp; （5）TRUNCATE 是DDL；DELETE是DML。</p>
<p>&nbsp;<br />
truncate、delete（不带where子句）与drop的异同点：<br />
相同之处：<br />
&nbsp;&nbsp;&nbsp; 三者均会删除表内的data。<br />
不同点：<br />
&nbsp;&nbsp; &lt;1&gt;、truncate与不带where的delete ：只删除数据，而不删除表的结构（定义）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drop语句将删除表的结构被依赖的约束（constrain),触发器（trigger), 索引（index);依赖于该表的存储过程/函数将被保留，但其状态会变为：invalid。<br />
&nbsp;&nbsp; &lt;2&gt;、delete语句为DML（data maintain Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的 tigger,执行的时候将被触发。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; truncate、drop是DLL（data define language),操作立即生效，原数据不放到 rollback segment中，不能回滚；操作不触发 trigger。<br />
&nbsp;&nbsp; &lt;3&gt;、delete语句不影响表所占用的 extent（段）,高水线（high watermark)保持原位置不动。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drop语句将表所占用的空间全释放掉。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; truncate语句缺省情况下将空间释放到 minextents 个 extent,除非使用 renuse storage;truncate 会将高水线(high watermark)复位（回到最初位置）。<br />
&nbsp;&nbsp; &lt;4&gt;、速度：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般而言，drop &gt; truncate &gt; delete。<br />
&nbsp;&nbsp; &lt;5&gt;、安全性：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在没有备份情况下，谨慎使用 drop 与 truncate。要删除部分数据行采用 delete且注意结合where来约束影响范围。回滚段要足够大。要删除表用drop;若想保留表而将表中数据删除，如果于事务无关，用truncate即可实现。如果和事务有关，或老师想触发trigger,还是用delete。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果是整理表内部的碎片，可以用truncate并结合reuse storage,再重新导入/插入数据。<br />
附Microsoft SQL<br />
Truncate是SQL中的一个删除数据表内容的语句，用法是：<br />
TRUNCATE TABLE [Table Name]。<br />
下面是对Truncate语句在MSSQLServer2000中用法和原理的说明：<br />
Truncate table 表名 速度快,而且效率高,因为: <br />
truncate table 在功能上与不带 WHERE 子句的 DELETE 语句相同：二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快，且使用的系统和事务日志资源少。 <br />
DELETE 语句每次删除一行，并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据，并且只在事务日志中记录页的释放。 <br />
TRUNCATE TABLE 删除表中的所有行，但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值，请改用 DELETE。如果要删除表定义及其数据，请使用 DROP TABLE 语句。 <br />
对于由 FOREIGN KEY 约束引用的表，不能使用 TRUNCATE TABLE，而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中，所以它不能激活触发器。 <br />
TRUNCATE TABLE 不能用于参与了索引视图的表</p>
 <img src ="http://www.blogjava.net/fhtdy2004/aggbug/288796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-28 19:43 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/28/288796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】MySql常用命令</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/07/25/288277.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Fri, 24 Jul 2009 16:24:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/07/25/288277.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/288277.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/25/288277.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/288277.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/288277.html</trackback:ping><description><![CDATA[<p>mysql alter命定<br />
关键字: mysql <br />
mysql alter 语句用法,添加、修改、删除字段等 </p>
<p><br />
//主键549830479 </p>
<p>&nbsp;&nbsp; alter table tabelname add new_field_id int(5) unsigned default 0 not null auto_increment ,add primary key (new_field_id); <br />
//增加一个新列549830479 </p>
<p>&nbsp;&nbsp; alter table t2 add d timestamp; <br />
alter table infos add ex tinyint not null default '0'; <br />
//删除列549830479 </p>
<p>&nbsp;&nbsp; alter table t2 drop column c; <br />
//重命名列549830479 </p>
<p>&nbsp;&nbsp; alter table t1 change a b integer; </p>
<p>//改变列的类型549830479 </p>
<p>&nbsp;&nbsp; alter table t1 change b b bigint not null; <br />
alter table infos change list list tinyint not null default '0'; </p>
<p>//重命名表549830479 </p>
<p>&nbsp;&nbsp; alter table t1 rename t2; <br />
加索引549830479 </p>
<p>&nbsp;&nbsp; mysql&gt; alter table tablename change depno depno int(5) not null; <br />
mysql&gt; alter table tablename add index 索引名 (字段名1[，字段名2 &#8230;]); <br />
mysql&gt; alter table tablename add index emp_name (name); <br />
加主关键字的索引549830479 </p>
<p>mysql&gt; alter table tablename add primary key(id); <br />
加唯一限制条件的索引549830479 </p>
<p>&nbsp; mysql&gt; alter table tablename add unique emp_name2(cardnumber); <br />
删除某个索引549830479 </p>
<p>&nbsp;&nbsp; mysql&gt;alter table tablename drop index emp_name; <br />
修改表：549830479 </p>
<p>增加字段：549830479 </p>
<p>&nbsp;&nbsp; mysql&gt; ALTER TABLE table_name ADD field_name field_type; <br />
修改原字段名称及类型：549830479 </p>
<p>&nbsp;&nbsp; mysql&gt; ALTER TABLE table_name CHANGE old_field_name new_field_name field_type; <br />
删除字段：549830479 </p>
<p>&nbsp;&nbsp; mysql&gt; ALTER TABLE table_name DROP field_name; </p>
<p>&nbsp;</p>
<p>mysql 常用增删改查命定<br />
关键字: mysql增删改查 <br />
插入一条记录: <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; insert into table_name (column_name1,column_name2,.) values (value1,value2,..); <br />
更新一条记录： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; update tbl_name <br />
set col_name1=expr1 [, col_name2=expr2 ...][WHERE where_definition] <br />
[ORDER BY ...][LIMIT row_count]; <br />
删除一条记录： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt;delete from table_name where id=XX; <br />
删除整个表的数据： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; drop from table_name; <br />
查询一条记录： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt;select * from table_name where id=XX; </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>mysql中删除部分重复记录的方法<br />
关键字: mysql中删除部分重复记录 <br />
假设person表中有三个字段 分别是id(自增) name age 部分记录中的name ,age出现重复 <br />
比如 <br />
id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; age <br />
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zhangsan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 <br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zhangsan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 <br />
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lisi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25 <br />
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lisi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25 <br />
1 ,2 部分重复，3,4也是部分重复 ，现在四条记录我只保留不重复的两条。删除方法如下： </p>
<p>1.按name,age分组查询出所有不重复的id并放入到tmp表中 <br />
&nbsp; create table tmp select min(id) as id from person group by name,age; </p>
<p>2.根据上面查询出的id号从person表中查询出所有的数据并放到表tmp2中 <br />
&nbsp; create table tmp2 select person.* from person,tmp where person.id = tmp.id; </p>
<p>3.删除person表 <br />
&nbsp; drop table person; </p>
<p>4.把tmp2重命名为person <br />
&nbsp; rename table tmp2 to person; </p>
<p>&nbsp;</p>
<p><br />
&nbsp;</p>
 <img src ="http://www.blogjava.net/fhtdy2004/aggbug/288277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-25 00:24 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/25/288277.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]MySQL索引</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/07/25/288274.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Fri, 24 Jul 2009 16:11:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/07/25/288274.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/288274.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/25/288274.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/288274.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/288274.html</trackback:ping><description><![CDATA[在数据库表中，使用索引可以大大提高查询速度。 <br />
<br />
假如我们创建了一个testIndex表: <br />
create TABLE testIndex(i_testID INT NOT NULL,vc_Name VARCHAR(16) NOT NULL); <br />
<br />
我们随机向里面插入了1000条记录，其中有一条 <br />
&nbsp;&nbsp;&nbsp; i_testID&nbsp;&nbsp;&nbsp; vc_Name <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 555&nbsp;&nbsp;&nbsp; erquan <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
在查找vc_Name="erquan"的记录 <br />
select * FROM testIndex where vc_Name='erquan'; <br />
时，如果在vc_Name上已经建立了索引，MySql无须任何扫描，即准确可找到该记录！相反，MySql会扫描所有记录，即要查询1000次啊~~可以索引将查询速度提高100倍。 <br />
<br />
一、索引分单列索引和组合索引 <br />
&nbsp;&nbsp; 单列索引：即一个索引只包含单个列，一个表可以有多个单列索引，但这不是组合索引。 <br />
&nbsp;&nbsp; 组合索引：即一个索包含多个列。 <br />
<br />
二、介绍一下索引的类型 <br />
<br />
&nbsp;&nbsp;&nbsp; 1.普通索引。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是最基本的索引，它没有任何限制。它有以下几种创建方式： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （1）创建索引：create INDEX indexName ON tableName(tableColumns(length));如果是CHAR,VARCHAR类型，length可以小于字段实际长度;如果是 BLOB 和 TEXT 类型，必须指定length，下同。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （2）修改表结构：alter tableName ADD INDEX [indexName] ON (tableColumns(length)) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （3）创建表的时候直接指定：create TABLE tableName ( [...], INDEX [indexName] (tableColumns(length)) ; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 2.唯一索引。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它与前面的"普通索引"类似，不同的就是：索引列的值必须唯一，但允许有空值。如果是组合索引，则列值的组合必须唯一。它有以下几种创建方式： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （1）创建索引：create UNIQUE INDEX indexName ON tableName(tableColumns(length)) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （2）修改表结构：alter tableName ADD UNIQUE [indexName] ON (tableColumns(length)) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （3）创建表的时候直接指定：create TABLE tableName ( [...], UNIQUE [indexName] (tableColumns(length)); <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 3.主键索引 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它是一种特殊的唯一索引，不允许有空值。一般是在建表的时候同时创建主键索引：create TABLE testIndex(i_testID INT NOT NULL AUTO_INCREMENT,vc_Name VARCHAR(16) NOT NULL,PRIMARY KEY(i_testID)); 当然也可以用alter命令。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 记住：一个表只能有一个主键。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.全文索引 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MySQL从3.23.23版开始支持全文索引和全文检索。这里不作讨论，呵呵~~ <br />
<br />
&nbsp;&nbsp;&nbsp; 删除索引的语法：drop INDEX index_name ON tableName <br />
<br />
三、单列索引和组合索引 <br />
<br />
&nbsp;&nbsp;&nbsp; 为了形象地对比两者，再建一个表： <br />
&nbsp;&nbsp;&nbsp; create TABLE myIndex ( i_testID INT NOT NULL AUTO_INCREMENT, vc_Name VARCHAR(50) NOT NULL, vc_City VARCHAR(50) NOT NULL, i_Age INT NOT NULL, i_SchoolID INT NOT NULL, PRIMARY KEY (i_testID) ); <br />
<br />
&nbsp;&nbsp;&nbsp; 在这10000条记录里面7上8下地分布了5条vc_Name="erquan"的记录，只不过city,age,school的组合各不相同。 <br />
&nbsp; 来看这条T-SQL： <br />
&nbsp;&nbsp;&nbsp; select i_testID FROM myIndex where vc_Name='erquan' AND vc_City='郑州' AND i_Age=25; <br />
<br />
&nbsp;&nbsp;&nbsp; 首先考虑建单列索引： <br />
&nbsp;&nbsp;&nbsp;&nbsp; 在vc_Name列上建立了索引。执行T-SQL时，MYSQL很快将目标锁定在了vc_Name=erquan的5条记录上，取出来放到一中间结果集。在这个结果集里，先排除掉vc_City不等于"郑州"的记录，再排除i_Age不等于25的记录，最后筛选出唯一的符合条件的记录。 <br />
<br />
&nbsp;&nbsp;&nbsp; 虽然在vc_Name上建立了索引，查询时MYSQL不用扫描整张表，效率有所提高，但离我们的要求还有一定的距离。同样的，在vc_City和i_Age分别建立的单列索引的效率相似。 <br />
<br />
&nbsp;&nbsp;&nbsp; 为了进一步榨取MySQL的效率，就要考虑建立组合索引。就是将vc_Name,vc_City,i_Age建到一个索引里： <br />
&nbsp;&nbsp;&nbsp; alter TABLE myIndex ADD INDEX name_city_age (vc_Name(10),vc_City,i_Age);--注意了，建表时，vc_Name长度为50，这里为什么用10呢？因为一般情况下名字的长度不会超过10，这样会加速索引查询速度，还会减少索引文件的大小，提高insert的更新速度。 <br />
<br />
&nbsp;&nbsp;&nbsp; 执行T-SQL时，MySQL无须扫描任何记录就到找到唯一的记录！！ <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 肯定有人要问了，如果分别在vc_Name,vc_City,i_Age上建立单列索引，让该表有3个单列索引，查询时和上述的组合索引效率一样吧？嘿嘿，大不一样，远远低于我们的组合索引~~虽然此时有了三个索引，但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引。 <br />
<br />
&nbsp;&nbsp;&nbsp; 建立这样的组合索引，其实是相当于分别建立了 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vc_Name,vc_City,i_Age <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vc_Name,vc_City <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vc_Name <br />
&nbsp;&nbsp;&nbsp; 这样的三个组合索引！为什么没有vc_City,i_Age等这样的组合索引呢？这是因为mysql组合索引"最左前缀"的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引，下面的几个T-SQL会用到： <br />
&nbsp;&nbsp;&nbsp; select * FROM myIndex WHREE vc_Name="erquan" AND vc_City="郑州" <br />
&nbsp;&nbsp;&nbsp; select * FROM myIndex WHREE vc_Name="erquan" <br />
而下面几个则不会用到： <br />
&nbsp;&nbsp;&nbsp; select * FROM myIndex WHREE i_Age=20 AND vc_City="郑州" <br />
&nbsp;&nbsp;&nbsp; select * FROM myIndex WHREE vc_City="郑州" <br />
<br />
四、使用索引 <br />
&nbsp;&nbsp;&nbsp;&nbsp; 到此你应该会建立、使用索引了吧？但什么情况下需要建立索引呢？一般来说，在where和join中出现的列需要建立索引，但也不完全如此，因为 MySQL只对 &lt;，&lt;=，=，&gt;，&gt;=，BETWEEN，IN，以及某些时候的like(后面有说明)才会使用索引。 <br />
&nbsp;&nbsp;&nbsp; select t.vc_Name FROM testIndex t LEFT join myIndex m ON t.vc_Name=m.vc_Name where m.i_Age=20 AND m.vc_City='郑州'&nbsp; 时，有对myIndex表的vc_City和i_Age建立索引的需要，由于testIndex表的vc_Name开出现在了join子句中，也有对它建立索引的必要。 <br />
<br />
&nbsp;&nbsp;&nbsp; 刚才提到了，只有某些时候的like才需建立索引？是的。因为在以通配符 % 和 _ 开头作查询时，MySQL不会使用索引，如 <br />
&nbsp;&nbsp;&nbsp; select * FROM myIndex where vc_Name like'erquan%' <br />
会使用索引，而 <br />
&nbsp;&nbsp;&nbsp; select * FROM myIndex wheret vc_Name like'%erquan' <br />
&nbsp;&nbsp;&nbsp; 就不会使用索引了。 <br />
<br />
<br />
五、索引的不足之处 <br />
<br />
&nbsp;&nbsp;&nbsp; 上面说了那么多索引的好话，它真的有像传说中那么优秀么？当然会有缺点了。 <br />
<br />
&nbsp;&nbsp;&nbsp; 1.虽然索引大大提高了查询速度，同时却会降低更新表的速度，如对表进行insert、update和delete。因为更新表时，MySQL不仅要保存数据，还要保存一下索引文件 <br />
<br />
&nbsp;&nbsp;&nbsp; 2.建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重，但如果你在一个大表上创建了多种组合索引，索引文件的会膨胀很快。 <br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 篇尾： <br />
&nbsp;&nbsp;&nbsp; 讲了这么多，无非是想利用索引提高数据库的执行效率。不过索引只是提高效率的一个因素。如果你的MySQL有大数据的表，就需要花时间研究建立最优秀的索引或优化查询语句。
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/288274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-25 00:11 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/25/288274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]left outer join,inner join,right outer join的区别</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/07/24/288250.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Fri, 24 Jul 2009 10:26:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/07/24/288250.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/288250.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/24/288250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/288250.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/288250.html</trackback:ping><description><![CDATA[使用关系代数合并数据<br />
1 关系代数<br />
合并数据集合的理论基础是关系代数，它是由E.F.Codd于1970年提出的。<br />
在关系代数的形式化语言中：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用表、或者数据集合表示关系或者实体。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用行表示元组。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用列表示属性。<br />
关系代数包含以下8个关系运算符<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选取――返回满足指定条件的行。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 投影――从数据集合中返回指定的列。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 笛卡尔积――是关系的乘法，它将分别来自两个数据集合中的行以所有可能的方式进行组合。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 并――关系的加法和减法，它可以在行的方向上合并两个表中的数据，就像把一个表垒在另一个表之上一样。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 交――返回两个数据集合所共有的行。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 差――返回只属于一个数据集合的行。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 连接――在水平方向上合并两个表，其方法是：将两个表中在共同数据项上相互匹配的那些行合并起来。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 除――返回两个数据集之间的精确匹配。<br />
此外，作为一种实现现代关系代数运算的方法，SQL还提供了：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 子查询――类似于连接，但更灵活；在外部查询中，方式可以使用表达式、列表或者数据集合的地方都可以使用子查询的结果。<br />
本章将主要讲述多种类型的连接、简单的和相关的子查询、几种类型的并、关系除以及其他的内容。<br />
2 使用连接<br />
2.1 连接类型<br />
在关系代数中，连接运算是由一个笛卡尔积运算和一个选取运算构成的。首先用笛卡尔积完成对两个数据集合的乘运算，然后对生成的结果集合进行选取运算，确保 只把分别来自两个数据集合并且具有重叠部分的行合并在一起。连接的全部意义在于在水平方向上合并两个数据集合（通常是表），并产生一个新的结果集合，其方 法是将一个数据源中的行于另一个数据源中和它匹配的行组合成一个新元组。<br />
SQL提供了多种类型的连接方式，它们之间的区别在于：从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同。<br />
连接类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义<br />
内连接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只连接匹配的行<br />
左外连接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包含左边表的全部行（不管右边的表中是否存在与它们匹配的行），以及右边表中全部匹配的行<br />
右外连接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包含右边表的全部行（不管左边的表中是否存在与它们匹配的行），以及左边表中全部匹配的行<br />
全外连接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包含左、右两个表的全部行，不管另外一边的表中是否存在与它们匹配的行。<br />
(H)(theta)连接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用等值以外的条件来匹配左、右两个表中的行<br />
交叉连接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成笛卡尔积－它不使用任何匹配或者选取条件，而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配<br />
在INFORMIX中连接表的查询<br />
如果FROM子句指定了多于一个表引用，则查询会连接来自多个表的行。连接条件指定各列之间（每个表至少一列）进行连接的关系。因为正在比较连接条件中的列，所以它们必须具有一致的数据类型。<br />
SELECT语句的FROM子句可以指定以下几种类型的连接<br />
FROM子句关键字&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 相应的结果集<br />
CROSS <strong style="color: black; background-color: rgb(153,255,153)">JOIN</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 笛卡尔乘积（所有可能的行对）<br />
INNER <strong style="color: black; background-color: rgb(153,255,153)">JOIN</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 仅对满足连接条件的CROSS中的列<br />
<strong style="color: black; background-color: rgb(255,255,102)">LEFT</strong> <strong style="color: black; background-color: rgb(160,255,255)">OUTER</strong> <strong style="color: black; background-color: rgb(153,255,153)">JOIN</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个表满足条件的行，和另一个表的所有行<br />
RIGHT <strong style="color: black; background-color: rgb(160,255,255)">OUTER</strong> <strong style="color: black; background-color: rgb(153,255,153)">JOIN</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与<strong style="color: black; background-color: rgb(255,255,102)">LEFT</strong>相同，但两个表的角色互换<br />
FULL <strong style="color: black; background-color: rgb(160,255,255)">OUTER</strong> <strong style="color: black; background-color: rgb(153,255,153)">JOIN</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong style="color: black; background-color: rgb(255,255,102)">LEFT</strong> <strong style="color: black; background-color: rgb(160,255,255)">OUTER</strong> 和 RIGHT <strong style="color: black; background-color: rgb(160,255,255)">OUTER</strong>中所有行的超集<br />
<br />
2.2 内连接（Inner <strong style="color: black; background-color: rgb(153,255,153)">Join</strong>）<br />
内连接是最常见的一种连接，它页被称为普通连接，而E.FCodd最早称之为自然连接。<br />
下面是ANSI SQL－92标准<br />
select * <br />
from&nbsp;&nbsp; t_institution i <br />
inner <strong style="color: black; background-color: rgb(153,255,153)">join</strong> t_teller t <br />
on i.inst_no = t.inst_no<br />
where i.inst_no = "5801"<br />
其中inner可以省略。<br />
等价于早期的连接语法<br />
select * <br />
from t_institution i, t_teller t <br />
where i.inst_no = t.inst_no<br />
and i.inst_no = "5801"<br />
<br />
2.3 外连接<br />
2.3.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 左外连接(<strong style="color: black; background-color: rgb(255,255,102)">Left</strong> <strong style="color: black; background-color: rgb(160,255,255)">Outer</strong> Jion)<br />
select * <br />
from&nbsp;&nbsp; t_institution i <br />
<strong style="color: black; background-color: rgb(255,255,102)">left</strong> <strong style="color: black; background-color: rgb(160,255,255)">outer</strong> <strong style="color: black; background-color: rgb(153,255,153)">join</strong> t_teller t <br />
on i.inst_no = t.inst_no<br />
其中<strong style="color: black; background-color: rgb(160,255,255)">outer</strong>可以省略。<br />
2.3.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 右外连接(Rigt <strong style="color: black; background-color: rgb(160,255,255)">Outer</strong> Jion)<br />
select * <br />
from&nbsp;&nbsp; t_institution i <br />
right <strong style="color: black; background-color: rgb(160,255,255)">outer</strong> <strong style="color: black; background-color: rgb(153,255,153)">join</strong> t_teller t <br />
on i.inst_no = t.inst_no<br />
2.3.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 全外连接(Full <strong style="color: black; background-color: rgb(160,255,255)">Outer</strong>)<br />
全外连接返回参与连接的两个数据集合中的全部数据，无论它们是否具有与之相匹配的行。在功能上，它等价于对这两个数据集合分别进行左外连接和右外连接，然后再使用消去重复行的并操作将上述两个结果集合并为一个结果集。<br />
在现实生活中，参照完整性约束可以减少对于全外连接的使用，一般情况下左外连接就足够了。在数据库中没有利用清晰、规范的约束来防范错误数据情况下，全外连接就变得非常有用了，你可以使用它来清理数据库中的数据。<br />
select * <br />
from&nbsp;&nbsp; t_institution i <br />
full <strong style="color: black; background-color: rgb(160,255,255)">outer</strong> <strong style="color: black; background-color: rgb(153,255,153)">join</strong> t_teller t <br />
on i.inst_no = t.inst_no<br />
2.3.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 外连接与条件配合使用<br />
当在内连接查询中加入条件是，无论是将它加入到<strong style="color: black; background-color: rgb(153,255,153)">join</strong>子句，还是加入到where子句，其效果是完全一样的，但对于外连接情况就不同了。当把条件加入到<strong style="color: black; background-color: rgb(153,255,153)">join</strong>子 句时，SQL Server、Informix会返回外连接表的全部行，然后使用指定的条件返回第二个表的行。如果将条件放到where子句 中，SQL Server将会首先进行连接操作，然后使用where子句对连接后的行进行筛选。下面的两个查询展示了条件放置位子对执行结果的影响：<br />
条件在<strong style="color: black; background-color: rgb(153,255,153)">join</strong>子句<br />
select * <br />
from&nbsp;&nbsp; t_institution i <br />
<strong style="color: black; background-color: rgb(255,255,102)">left</strong> <strong style="color: black; background-color: rgb(160,255,255)">outer</strong> <strong style="color: black; background-color: rgb(153,255,153)">join</strong> t_teller t <br />
on i.inst_no = t.inst_no<br />
and i.inst_no = &#8220;5801&#8221;<br />
结果是：<br />
inst_no&nbsp;&nbsp;&nbsp;&nbsp; inst_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inst_no&nbsp;&nbsp;&nbsp;&nbsp; teller_no&nbsp;&nbsp; teller_name<br />
5801&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 天河区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5801&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tom<br />
5801&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 天河区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5801&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; david<br />
5802&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 越秀区<br />
5803&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 白云区<br />
条件在where子句<br />
select * <br />
from&nbsp;&nbsp; t_institution i <br />
<strong style="color: black; background-color: rgb(255,255,102)">left</strong> <strong style="color: black; background-color: rgb(160,255,255)">outer</strong> <strong style="color: black; background-color: rgb(153,255,153)">join</strong> t_teller t <br />
on i.inst_no = t.inst_no<br />
where i.inst_no = &#8220;5801&#8221;<br />
结果是：<br />
inst_no&nbsp;&nbsp;&nbsp;&nbsp; inst_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inst_no&nbsp;&nbsp;&nbsp;&nbsp; teller_no&nbsp;&nbsp; teller_name<br />
5801&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 天河区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5801&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tom<br />
5801&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 天河区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5801&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; david<br />
<br />
2.4 自身连接<br />
自身连接是指同一个表自己与自己进行连接。这种一元连接通常用于从自反关系（也称作递归关系）中抽取数据。例如人力资源数据库中雇员与老板的关系。<br />
下面例子是在机构表中查找本机构和上级机构的信息。<br />
select s.inst_no superior_inst, s.inst_name sup_inst_name, i.inst_no, i.inst_name<br />
from t_institution i<br />
<strong style="color: black; background-color: rgb(153,255,153)">join</strong> t_institution s<br />
on i.superior_inst = s.inst_no<br />
<br />
结果是：<br />
superior_inst sup_inst_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inst_no&nbsp;&nbsp;&nbsp;&nbsp; inst_name<br />
800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 广州市&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5801&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 天河区<br />
800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 广州市&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5802&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 越秀区<br />
800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 广州市&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5803&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 白云区<br />
<br />
2.5 交叉(无限制) 连接<br />
交叉连接用于对两个源表进行纯关系代数的乘运算。它不使用连接条件来限制结果集合，而是将分别来自两个数据源中的行以所有可能的方式进行组合。数据集合中 一的每个行都要与数据集合二中的每一个行分别组成一个新的行。例如，如果第一个数据源中有5个行，而第二个数据源中有4个行，那么在它们之间进行交叉连接 就会产生20个行。人们将这种类型的结果集称为笛卡尔乘积。<br />
大多数交叉连接都是由于错误操作而造成的；但是它们却非常适合向数据库中填充例子数据，或者预先创建一些空行以便为程序执行期间所要填充的数据保留空间。<br />
select *<br />
from&nbsp;&nbsp; t_institution i <br />
cross <strong style="color: black; background-color: rgb(153,255,153)">join</strong> t_teller t<br />
在交叉连接中没有on条件子句
 <img src ="http://www.blogjava.net/fhtdy2004/aggbug/288250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-24 18:26 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/24/288250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySql存储过程和触发器的编写</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/06/30/284830.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Tue, 30 Jun 2009 13:06:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/06/30/284830.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/284830.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/06/30/284830.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/284830.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/284830.html</trackback:ping><description><![CDATA[以及如何用Hibernate来使用
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/284830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-30 21:06 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/06/30/284830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 注解配置例子及redirect,redirectAction,chain的区别</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268720.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sun, 03 May 2009 12:09:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268720.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/268720.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268720.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/268720.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/268720.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;1&nbsp;package&nbsp;edu.b.recommender.actions;&nbsp;2&nbsp;&nbsp;3&nbsp;import&nbsp;org.apache.struts2.convention.annotation.Action;&nbsp;4&nbsp;import&nbsp;org.apache.struts2.convention.a...&nbsp;&nbsp;<a href='http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268720.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/268720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-03 20:09 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:struts2采用convention-plugin实现零配置</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268718.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sun, 03 May 2009 11:59:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268718.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/268718.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268718.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/268718.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/268718.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268718.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/268718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-03 19:59 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSH整合配置</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268715.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sun, 03 May 2009 11:42:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268715.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/268715.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/268715.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/268715.html</trackback:ping><description><![CDATA[<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"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans"</span><span style="color: #ff0000">&nbsp;xmlns:xsi</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:jee</span><span style="color: #0000ff">="http://www.springframework.org/schema/jee"</span><span style="color: #ff0000">&nbsp;xmlns:tx</span><span style="color: #0000ff">="http://www.springframework.org/schema/tx"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:context</span><span style="color: #0000ff">="http://www.springframework.org/schema/context"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&nbsp;http://www.springframework.org/schema/tx&nbsp;http://www.springframework.org/schema/tx/spring-tx-2.5.xsd&nbsp;http://www.springframework.org/schema/jee&nbsp;http://www.springframework.org/schema/jee/spring-jee-2.5.xsd&nbsp;http://www.springframework.org/schema/context&nbsp;http://www.springframework.org/schema/context/spring-context-2.5.xsd"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;default-lazy-init</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">description</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Spring公共配置文件&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">description</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;定义受环境影响易变的变量&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="propertyConfigurer"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="systemPropertiesModeName"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="SYSTEM_PROPERTIES_MODE_OVERRIDE"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="ignoreResourceNotFound"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;属性文件读入&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="locations"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;标准配置&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">classpath*:/application.properties</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;本地开发环境配置&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">classpath*:/application.local.properties</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;服务器生产环境配置&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;&lt;value&gt;file:/var/myapp/application.server.properties&lt;/value&gt;&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;使用Spring&nbsp;annotation&nbsp;自动注册bean,并保证@Autowired(required=false/true)的属性被注入&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;将打开组件扫描配置项base-package表示自动扫描org.springside.example.miniwe包以及它的子包&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;spring2.5引入了组件自动扫描的机制，可以采用在classpath自动扫描方式把classpath中所有的组件都纳入到spring&nbsp;容器来进行管理。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;但是这些类需要使用使用&nbsp;@Service,@Controller,&nbsp;@Repository&nbsp;这几个注解。它的作用与在xml文件中使用bean节点配置组件式一样的。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&#183;@Service用于标注业务层组件<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&#183;@Controller用于标注控制层组件，比如struts中的action<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&#183;@Repository用于标注数据访问组件，如DAO组件<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&#183;@Component泛指组件，当组件不好归类的时候，我们可以使用它进行标注<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;context:component-scan&nbsp;base-package="org.springside.examples.miniweb"&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">context:component-scan&nbsp;</span><span style="color: #ff0000">base-package</span><span style="color: #0000ff">="edu.b.recommender"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;数据源配置,使用应用内的DBCP数据库连接池&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="dataSource"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.apache.commons.dbcp.BasicDataSource"</span><span style="color: #ff0000">&nbsp;destroy-method</span><span style="color: #0000ff">="close"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;Connection&nbsp;Info&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="driverClassName"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="${jdbc.driverClassName}"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="url"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="${jdbc.url}"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="username"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="${jdbc.username}"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="password"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="${jdbc.password}"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;Connection&nbsp;Pooling&nbsp;DBCP&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="initialSize"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="5"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="maxActive"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="100"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="maxIdle"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="30"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="maxWait"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="1000"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="poolPreparedStatements"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="defaultAutoCommit"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="false"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;数据源配置,使用应用服务器的数据库连接池&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&lt;jee:jndi-lookup&nbsp;id="dataSource"&nbsp;jndi-name="java:comp/env/jdbc/ExampleDB"&nbsp;/&gt;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;Hibernate配置&nbsp;使用注解来取代了.hbm.xml文件&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="sessionFactory"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="dataSource"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="dataSource"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="namingStrategy"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="org.hibernate.cfg.ImprovedNamingStrategy"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="hibernateProperties"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.dialect"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${hibernate.dialect}</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.show_sql"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${hibernate.show_sql}</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.format_sql"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${hibernate.format_sql}</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.use_outer_join"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${hibernate.use_outer_join}</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.jdbc.fetch_size"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${hibernate.jdbc.fetch_size}</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.jdbc.batch_size"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${hibernate.jdbc.batch_size}</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.cache.provider_class"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${hibernate.cache.provider_class}</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">是否使用查询缓存&nbsp;&nbsp;&lt;prop&nbsp;key="hibernate.cache.use_query_cache"&gt;${hibernate.cache.use_query_cache}&lt;/prop&gt;&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.cache.provider_configuration_file_resource_path"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${hibernate.ehcache_config_file}</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;使用Hibernate&nbsp;annotation自动扫描此包中的实体类po,这些po使用JPA注解来映射数据库文件&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="packagesToScan"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="edu.b.recommender.*"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;事务管理器配置,单数据源事务&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;Transaction事务处理使用Spring来托管事务的处理&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="transactionManager"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.orm.hibernate3.HibernateTransactionManager"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="sessionFactory"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="sessionFactory"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;事务管理器配置,多数据源JTA事务</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean&nbsp;id="transactionManager"&nbsp;class="org.springframework.transaction.jta.JtaTransactionManager&nbsp;or<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebLogicJtaTransactionManager"&nbsp;/&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;使用annotation定义事务&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;支持&nbsp;@Transactional&nbsp;标记&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tx:annotation-driven&nbsp;</span><span style="color: #ff0000">transaction-manager</span><span style="color: #0000ff">="transactionManager"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span></div>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/268715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-03 19:42 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring自动扫描classpath,及po is not mapped问题解决</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268714.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sun, 03 May 2009 11:39:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268714.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/268714.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/268714.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/268714.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268714.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/268714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-03 19:39 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring注解简单介绍</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268713.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sun, 03 May 2009 11:24:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268713.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/268713.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268713.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/268713.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/268713.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268713.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/268713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-03 19:24 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2入门学习</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268712.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sun, 03 May 2009 11:21:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268712.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/268712.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268712.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/268712.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/268712.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268712.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/268712.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-03 19:21 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268712.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 struts.xml配置文件详解mark</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268711.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sun, 03 May 2009 11:15:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268711.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/268711.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268711.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/268711.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/268711.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268711.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/268711.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-03 19:15 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/03/268711.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 + jQuery 的简单例子使用</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/04/29/268036.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Wed, 29 Apr 2009 01:13:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/04/29/268036.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/268036.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/04/29/268036.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/268036.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/268036.html</trackback:ping><description><![CDATA[Struts2 + jQuery 实现完成请求，不做页面跳转的ajax效果<br />
<p>需求要求实现用弹出层发送邮件。提交后层关闭，程序再服务器端响应。</p>
<p>&nbsp;</p>
<p><a title="json" href="http://search.yesky.com/search.do?wd=json&amp;amp;appType=1&amp;amp;columnId=324&amp;amp;sortType=0&amp;amp;btnsearch=%CB%D1" target="_blank"><strong><span style="text-decoration: underline"><span style="color: #204890">JSON</span></span></strong></a>插件提供了一种名为json的ResultType，一旦为某个Action指定了一个类型为json的Result，则该Result无需映射到任何视图资源。因为JSON插件会负责将Action里的状态信息序列化成JSON格式的数据，并将该数据返回给客户端页面的JavaScript&nbsp;。</p>
<p>&nbsp;</p>
<p>简单地说，JSON插件允许我们在JavaScript中异步调用Action，而且Action不再需要使用视图资源来显示该Action里的状态信息，而是由JSON插件负责将Action里的状态信息返回给调用页面——通过这种方式，就可以完成<a title="ajax" href="http://search.yesky.com/search.do?wd=ajax&amp;amp;appType=1&amp;amp;columnId=324&amp;amp;sortType=0&amp;amp;btnsearch=%CB%D1" target="_blank"><strong><span style="text-decoration: underline"><span style="color: #204890">Ajax</span></span></strong></a>交互。<br />
<br />
1、将struts2的json插件加入web工程的lib，jsonplugin的下载地址：<a href="http://code.google.com/p/jsonplugin/downloads/list" target="_blank">http://code.google.com/p/jsonplugin/downloads/list</a> <br />
<br />
2、struts.xml添加专为ajax使用的package&nbsp;<br />
<br />
&nbsp;<span style="color: #0000ff">&lt;</span><span style="color: #800000">package </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="ajax"</span><span style="color: #ff0000"> extends</span><span style="color: #0000ff">="json-default"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="ajaxRequest"</span><span style="color: #ff0000">&nbsp; class</span><span style="color: #0000ff">="org.david.struts2.HelloWorld"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="json"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
3、在页面中引入&nbsp;<span style="color: #0000ff">jquery的js文件库</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; <span style="color: #0000ff">&lt;</span><span style="color: #800000">SCRIPT </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="text/javascript"</span><span style="color: #ff0000"> src</span><span style="color: #0000ff">="js/jquery-1.2.6.min.js"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img style="display: none" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">SCRIPT </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="text/javascript"</span><span style="color: #0000ff">&gt;</span><span 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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span><span style="color: #000000; background-color: #f5f5f5"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">function</span><span style="color: #000000; background-color: #f5f5f5"> clickButton()<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img style="display: none" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span 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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span><span style="color: #000000; background-color: #f5f5f5">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">var</span><span style="color: #000000; background-color: #f5f5f5"> url </span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5"> 'ajaxRequest.action';<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img style="display: none" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">var</span><span style="color: #000000; background-color: #f5f5f5"> params </span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5"> </span><span 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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span><span style="color: #000000; background-color: #f5f5f5">{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name:$('#name').attr('value'),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contactEmail:$('#contactEmail').attr('value'),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subject:$('#subject').attr('value'),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; content:$('#content').attr('value')<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span></span> </p>
<p><span><span><span><span style="color: #000000; background-color: #f5f5f5">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}</span></span><span style="color: #000000; background-color: #f5f5f5">; //通过id获得输入值<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jQuery.post(url, params, callbackFun, 'json');</span></span></span></p>
<p><span><span><span style="color: #000000; background-color: #f5f5f5">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p>
<p><span><span><span style="color: #000000; background-color: #f5f5f5">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} //url：响应aciton；params：传入参数；callbackFun：响应完成后的回调函数；<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span></p>
<p><span><span><span style="color: #000000; background-color: #f5f5f5">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #000000; background-color: #f5f5f5">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">function</span><span style="color: #000000; background-color: #f5f5f5"> callbackFun(data)<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img style="display: none" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span 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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span><span style="color: #000000; background-color: #f5f5f5">{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert("SUCCESS");<br />
&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000; background-color: #f5f5f5"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">SCRIPT</span><span style="color: #0000ff">&gt;<br />
</span><span style="color: #000000"><br />
4、action逻辑与普通的ation写法无大区别。</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp; JSON将Action里的状态信息序列化成JSON格式的数据</span></p>
 <img src ="http://www.blogjava.net/fhtdy2004/aggbug/268036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-04-29 09:13 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/04/29/268036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>