﻿<?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-黄小二的讀書筆記-文章分类-J2EE</title><link>http://www.blogjava.net/kiant/category/32999.html</link><description>有才而性缓定属大才，有智而气和斯为大智。人偏狭我受之以宽容，人险仄我持之以坦荡。缓事宜急干，敏则有功；急事宜缓办，忙则多措。
--李叔同</description><language>zh-cn</language><lastBuildDate>Wed, 07 Apr 2010 08:51:17 GMT</lastBuildDate><pubDate>Wed, 07 Apr 2010 08:51:17 GMT</pubDate><ttl>60</ttl><item><title>使用 dom4j 解析 XML</title><link>http://www.blogjava.net/kiant/articles/317474.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Mon, 05 Apr 2010 02:23:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/317474.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/317474.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/317474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/317474.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/317474.html</trackback:ping><description><![CDATA[<br />
dom4j 是一种解析 XML 文档的开放源代码 XML 框架。<br />
<br />
推荐文章<br />
使用 dom4j 解析 XML&nbsp;&nbsp;&nbsp;&nbsp;http://www.ibm.com/developerworks/cn/xml/x-dom4j.html<br />
<br />
dom4j&nbsp;[百度百科]&nbsp;&nbsp;&nbsp;&nbsp;http://baike.baidu.com/view/1460716.htm<br />
<br />
官网&nbsp;&nbsp;&nbsp;&nbsp;http://www.dom4j.org/
<img src ="http://www.blogjava.net/kiant/aggbug/317474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2010-04-05 10:23 <a href="http://www.blogjava.net/kiant/articles/317474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>iis tomcat 服务集成</title><link>http://www.blogjava.net/kiant/articles/291472.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Mon, 17 Aug 2009 05:59:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/291472.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/291472.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/291472.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/291472.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/291472.html</trackback:ping><description><![CDATA[<br />
感谢 <a href="http://www.blogjava.net/b47248054/archive/2008/11/27/242963.html" target="_blank">整合iis和tomcat </a>一文作者，依照他的说明我调试成功了<br />
同时也感谢其他作者，你们的文章给了我不少启发<br />
<br />
<a href="/Files/kiant/iis_tomcat.rar">/Files/kiant/iis_tomcat.rar</a>
<img src ="http://www.blogjava.net/kiant/aggbug/291472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2009-08-17 13:59 <a href="http://www.blogjava.net/kiant/articles/291472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2表单标签</title><link>http://www.blogjava.net/kiant/articles/277742.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sun, 24 May 2009 15:02:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/277742.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/277742.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/277742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/277742.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/277742.html</trackback:ping><description><![CDATA[<br />
<a href="http://wiki.javascud.org/display/ww2cndoc/Form+Tags" target="_blank">Form Tags - WebWork2文档中文化计划 </a><br />
<br />
<a href="http://www.blogjava.net/hhhaaawwwkkk/archive/2008/10/27/236925.html" target="_blank">Struts2.0标签库（三）表单标签</a><br />
<br />
及 Struts 2深入详解 by.孙鑫<br />
<br />
<br />
<strong>
<hr />
描述<br />
</strong><br />
对于表单标签,分为两种标签:form标签本身,和所有来包装单个的表单元素的其他标签.form标签本身的行为不同于它内部的元素,这是很重要的.在我们为所有表单标签,包括form标签在内,提供一个参考手册之前,我们必须先描述一些通用的属性. <br />
<br />
<br />
<h1><span style="color: #000000">通用属性<br />
<br />
</span></h1>
<table class="confluenceTable">
    <tbody>
        <tr>
            <td><strong>属性</strong> </td>
            <td><strong>Theme</strong> </td>
            <td><strong>数据类型</strong> </td>
            <td><strong>描述</strong></td>
        </tr>
        <tr>
            <td class="confluenceTd">cssClass </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">定义 html class 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">cssStyle </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">定义html style 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">title </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">定义html title 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">disabled </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">定义html disabled 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">label </td>
            <td class="confluenceTd">xhtml </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">定义表单元素的label </td>
        </tr>
        <tr>
            <td class="confluenceTd">labelPosition </td>
            <td class="confluenceTd">xhtml </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">定义表单元素的label位置(top/left),缺省为left </td>
        </tr>
        <tr>
            <td class="confluenceTd">requiredposition </td>
            <td class="confluenceTd">xhtml </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">定义required 标识相对label元素的位置 (left/right),缺省是 right </td>
        </tr>
        <tr>
            <td class="confluenceTd">name </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">表单元素的name映射 </td>
        </tr>
        <tr>
            <td class="confluenceTd">required </td>
            <td class="confluenceTd">xhtml </td>
            <td class="confluenceTd">Boolean </td>
            <td class="confluenceTd">在label中添加 * (true增加,否则不增加) </td>
        </tr>
        <tr>
            <td class="confluenceTd">tabIndex </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">定义html tabindex 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">value </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">Object </td>
            <td class="confluenceTd">定义表单元素的value </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<h1><span style="color: #000000">Javascript相关属性<br />
<br />
</span></h1>
<table class="confluenceTable">
    <tbody>
        <tr>
            <td class="confluenceTh">属性 </td>
            <td class="confluenceTh">Theme </td>
            <td class="confluenceTh">数据类型 </td>
            <td class="confluenceTh">描述 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onclick </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onclick 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">ondbclick </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript ondbclick 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onmousedown </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onmousedown 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onmouseup </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onmouseup 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onmouseover </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onmouseover 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onmouseout </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onmouseout 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onfocus </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onfocus 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onblur </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onblur 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onkeypress </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onkeypress 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onkeyup </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onkeyup 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onkeydown </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onkeydown 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onselect </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onselect 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onchange </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onchange 属性 </td>
        </tr>
    </tbody>
</table>
<br />
<img src ="http://www.blogjava.net/kiant/aggbug/277742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2009-05-24 23:02 <a href="http://www.blogjava.net/kiant/articles/277742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 读书笔记（一） 前言、安装、配置</title><link>http://www.blogjava.net/kiant/articles/270126.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Mon, 11 May 2009 15:11:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/270126.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/270126.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/270126.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/270126.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/270126.html</trackback:ping><description><![CDATA[<br />
内容多来自书本、网络和教程，在此特别感谢：<br />
Struts2权威指南--基于WebWork核心的MVC开发&nbsp; 作者：李刚<br />
浪曦_Struts2应用开发系列&nbsp;讲师：风中叶<br />
<a href="http://www.blogjava.net/max/category/16130.html" target="_blank">Max On Java 的 Struts 2.0 系列</a><br />
<br />
<strong>一、前言</strong><br />
Struts2 是 WebWork 的升级。它同样适用拦截器作为处理（Advice），以用户的业务逻辑控制器为目标，创建一个控制器代理。<br />
<br />
Tomcat 文件服务器配置项目：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&lt;</span><span style="color: #000000">Context&nbsp;path</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/deviantART</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;docBase</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">D:\workstation\deviantART\WebRoot</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;reloadable</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">true</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;<br />
&lt;/Host&gt;</span></div>
<em style="font-size: 10pt">conf/server.xml<br />
</em>path：URL虚拟路径<br />
docBase：对应的物理地址<br />
reloadable：是否自动更新，发布后建议为 false <br />
<br />
<fieldset><legend>Tips:</legend>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 MyEclipse 等开发工具中，会将 src 源代码目录里的任何改动都自动编译到 \WebRoot\WEB-INF 目录下，简化了操作。</fieldset> <br />
<br />
<hr />
<strong>二、安装<br />
</strong><br />
Struts2 的几个核心 jar 文件：<br />
commons-logging-1.0.4.jar、<br />
freemarker-2.3.8.jar、<br />
ognl-2.6.11.jar、<br />
struts2-core-2.0.11.jar、<br />
xwork-2.0.4.jar <br />
<br />
<br />
<hr />
<strong>三、配置：<br />
<br />
</strong>编辑Web应用的web.xml配置文件，配置Struts 2的核心Filter。
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="GBK"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">web-app&nbsp;</span><span style="color: #ff0000">version</span><span style="color: #0000ff">="2.4"</span><span style="color: #ff0000">&nbsp;xmlns</span><span style="color: #0000ff">="http://java.sun.com/xml/ns/j2ee"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"<br />
</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000ff">="http://java.sun.com/xml/ns/j2ee&nbsp;http://java.sun.&nbsp;com/xml/ns/j2ee/web-app_2_4.xsd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<br />
</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;定义Struts&nbsp;2的FilterDispatcher的Filter&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;定义核心Filter的名字&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">struts2</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;定义核心Filter的实现类&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">org.apache.Struts2.dispatcher.FilterDispatcher</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;FilterDispatcher用来初始化Struts&nbsp;2并且处理所有的Web请求&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Struts2</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #0000ff">&nbsp;&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">web-app</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
<em>web.xml</em> <br />
<br />
配置Action
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="GBK"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;指定Struts&nbsp;2配置文件的DTD信息&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;struts&nbsp;PUBLIC"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #800000">package&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="strutsqs"</span><span style="color: #ff0000">&nbsp;extends</span><span style="color: #0000ff">="struts-default"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Login"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="lee.LoginAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="error"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/error.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="success"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/welcome.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
<em>struts.xml</em><br />
<br />
Struts 2还有一个配置 Struts 2全局属性的 Properties 文件：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">#指定Struts&nbsp;2处于开发状态<br />
struts.devMode&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000"><br />
#指定当Struts&nbsp;2配置文件改变后，Web框架是否重新加载Struts&nbsp;2配置文件<br />
struts.configuration.xml.reload</span><span style="color: #000000">=</span><span style="color: #0000ff">true</span><span style="color: #000000">&nbsp;</span></div>
<em>struts.properties</em><br />
<br />
<br />
ps. 更详细的请阅览<br />
<a href="http://www.blogjava.net/max/archive/2006/10/10/74353.html" target="_blank">&nbsp;Max On Java 的 Struts 2.0 系列：为Struts 2.0做好准备</a>&nbsp;<br />
&nbsp; 
<img src ="http://www.blogjava.net/kiant/aggbug/270126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2009-05-11 23:11 <a href="http://www.blogjava.net/kiant/articles/270126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>'Hibernate 完全手册' 读书笔记（五） 事务和并发、缓存、高级特性、附录</title><link>http://www.blogjava.net/kiant/articles/265417.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Tue, 14 Apr 2009 01:56:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/265417.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/265417.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/265417.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/265417.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/265417.html</trackback:ping><description><![CDATA[<p><br />
<strong>1、事务</strong></p>
<p>1-1、类别</p>
<p>● 本地事务<br />
&nbsp; 如果事务只和一个资源管理器有关，则为本地事物。在本地事务中，事务管理器只是将事务的管理委托给底层的资源管理器。</p>
<p><br />
● 分布式事务<br />
&nbsp; 分布式事务和多个可能不同的资源管理器以一种协调的方式进行交互。</p>
<p><br />
1-2、Java 中事务处理</p>
<p>&nbsp; JDBC 事务：由底层数据库事务管理器控制，操作比较简单，但是不适合控制多个应用程序组件的事务，并且没有传播的上下问。</p>
<p>&nbsp; JTA 和 JTS：Java 事务 API 和 Java 事务服务，可以跨越多个组件和数据库使用事务。在应用程序使用 JTA 控制事务操作时，需要从 JNDI 上下文中获取 UserTranscation 和数据源。<br />
UserTranscation ut = (UserTranscation) ctx.lookup("UserTranscation");</p>
<p><br />
1-3、Hibernate 事务<br />
&nbsp; <br />
● 基于 JDBC </p>
<p>&nbsp; Transcation 事务对象必须从 Session 中获取，即事务必须和一个 Session 相关联。</p>
<p>采用 Hibernate 内置的 current session 和上下文管理。<br />
&lt;property name="current_session_context_class"&gt;thread&lt;/property&gt;<br />
...<br />
sessionFactory.getCurrentSession().beginTranscation();</p>
<p><br />
● 基于 JTA</p>
<p>&nbsp; 提供了跨 Session 的事务管理能力。<br />
使用 SessionFactory.getCurrentSession() 方法简化事务上下文的传播，即在事务绑定 Session。</p>
<p><br />
&nbsp; 虽然一个 Session 范围内可以存在多个事务操作，但是 Hibernate 并不支持嵌套的事务模型。<br />
tx1<br />
tx2<br />
...<br />
tx2.commit();</p>
<p>//数据库操作，操作无效<br />
tx1.commit();</p>
<p>&nbsp;</p>
<p>
<hr />
<strong>2、并发控制</strong>
<p>&nbsp;</p>
<p>&nbsp; 如果事务都是串行执行，则许多资源将处于空闲状态。为了充分利用资源，发挥数据库共享资源的优势，必须允许多个事务并发地执行。</p>
<p>&nbsp; 在单处理机系统中，事务并发执行实际上是这些并行事务轮流交叉执行，即交叉并发方式，并不是真正的并行执行。在多处理机系统中，每个处理机运行一个事务，实现事务真正意义上的并存运行，即同时并发方式。</p>
<p>&nbsp; 当多个用户并发地存取数据库时，就会产生多个事务同时存取同一数据的情况。所以，必须实现一个控制系统，使一个事务所做的修改不会对其他事务所做的修改产生负面影响，这就是并发控制。</p>
<p>&nbsp; <br />
2-1、封锁</p>
<p>&nbsp; 对并发操作进行的正确调度，防止并发操作破坏了事务的隔离性。采用封锁技术，事务 T 可以向系统发出请求，对某个对象例如表、记录加锁，在事务 T 释放锁之前，其他事务不能更新这些数据对象。<br />
&nbsp;<br />
&nbsp; 基本的封锁有： <br />
排他锁（Exclusive Locks，X 锁）：写锁或者独占锁。<br />
共享锁（Share Locks，S 锁）：读锁。允许和其他事务一起读取数据对象D，但不能对D 做任何修改。</p>
<p><br />
2-2、事务隔离</p>
<p>&nbsp; 使用封锁技术，事务对申请的资源加锁，但是会影响数据库性能。根据数据对象封锁的程度，可以分成多种不同的事务隔离级别。</p>
<p>&nbsp; 数据并发执行时，产生不一致的现象：</p>
<p>丢失更新（Lost Update）<br />
&nbsp; 两个事务读入同一数据并修改，然后提交修改，T2 提交的结果破坏了 T1 提交的结果，导致 T1 的修改丢失。</p>
<p>② 不可重复读<br />
&nbsp; 事务T1 读取数据后，事务T2 执行了同一数据的跟新操作，使得事务 T1 无法再现前一次读取的结果。<br />
&nbsp;&nbsp;&nbsp; 事务1 读取某一数据后，事务2 对该数据作了修改，事务1 再次读取时，得到数据和前一次不一致。<br />
&nbsp;&nbsp;&nbsp; ① 事务1 读取某一些记录后，事务2 删除了同一数据源的部分数据，事务1 再次读取时，发现某些记录丢失。<br />
&nbsp;&nbsp;&nbsp; ① 事务1 读取某一些记录后，事务2 插入了同一数据源的新数据，事务1 再次读取时，发现某些记录增加。</p>
<p>③ 读&#8220;脏&#8221;数据<br />
&nbsp; 事务T1 修改某一数据，并将其写回物理数据库。事务T2 读取同一数据后，事务T1 由于某种原因被撤销，数据库将已经修改的数据恢复原值，导致事务T2 保持的数据和数据库中的数据产生了不一致。</p>
<p><br />
&nbsp; ANSI SQL-99 标准定义了下列隔离级别：</p>
<p>● 未提交读（Read Uncommitted）：隔离事务的最低级别，只能保证不会读取到物理上损坏的数据。H:1；允许产生：①②③</p>
<p>● 已提交读（Read Committed）：常见数据库引擎的默认级别，保证一个事务不会读取到另一个事务已修改但未提交的数据。H:2；允许产生：①②</p>
<p>● 可重复读（Repeatable Read）：保证一个事务不能更新已经由另一个事务读取但是未提交的数据。相当于应用中的已提交读和乐观并发控制。H:4；允许产生：①</p>
<p>● 可串行化（Serializable）：隔离事务的最高级别，事务之间完全隔离。系统开销最大。H:8；允许产生：</p>
<p><br />
&nbsp; 在数据库中，可以手工设置事务的隔离级别。<br />
&nbsp; Hibernate 在配置文件中声明事务的隔离级别，Hibenate 获取数据库连接后，将根据隔离级别自动设置数据库连接为指定的事务隔离级别。<br />
&lt;property name="connection.isolation"&gt;8&lt;/property&gt;</p>
<p><br />
2-3、并发控制类型</p>
<p>&nbsp; 根据使用的锁定策略和隔离等级，可以把事务的并发控制分为两种：</p>
<p>① 悲观并发控制<br />
&nbsp; <br />
&nbsp; 用户使用时锁定数据。主要应用于数据争用激烈的环境中，以及发生并发冲突时用锁保护数据的成本低于回滚事务成本的环境中。</p>
<p>&nbsp; Hibernate 的悲观锁定不在内存中锁定数据，由底层数据库负责完成。</p>
<p><br />
② 乐观并发控制<br />
&nbsp; <br />
&nbsp; 用户读取数据时不锁定数据。当一个用户更新数据时，系统将进行检查该用户读取数据后其他用户是否更改了该数据，是则产生一个错误，一般情况下，收到错误信息的用户将回滚事务并重新开始。主要用户数据争用不大，且偶尔回滚事务的成本低于读取数据时锁定数据的成本的环境中。</p>
<p>&nbsp; Hibernate 中使用元素 version 和 timestamp 实现乐观并发控制模式的版本控制，并提供多种编程方式。版本是数据库表中的一个字段，可以是一个递增的整数，也可以是一个时间戳，它们对应 Java 持久化类的一个属性。事务提交成功后，Hibernate 自动修改版本号。如果另外一个事务同时访问同一数据，若发现提交前的版本号和事前载入的版本号有出入，则认为发生了冲突，事务停止执行，撤销操作，并抛出异常。应用程序必须捕捉该异常并做出一定的处理。</p>
<p>⒈应用程序级别的版本控制<br />
⒉长生命周期会话的自动化版本控制<br />
⒊托管对象的自动化版本控制<br />
⒋定制自动化版本控制</p>
<p>&nbsp;</p>
<p>
<hr />
<strong>3、Hibernate 缓存</strong>
<p>&nbsp;</p>
<p>&nbsp; Hibernate 提供两级缓存架构，第一级缓存是 Session 内的缓存，第二级缓存是一个可插拔的缓存，能够借助第三方的组件实现。如果应用程序中经常使用同样的条件查询数据，还可以使用查询缓存来提高查询效率。</p>
<p>&nbsp; 针对缓存的范围，可以将 Hibernate 持久层缓存分为三个层次：</p>
<p>① 事务级缓存<br />
&nbsp; <br />
&nbsp; 缓存只能被当前事务访问。缓存的生命周期以来与事务的生命周期。事务缓存由 Session 实现。一个 Session 的缓存的内容只有在本 Session 实例范围内可用。</p>
<p>② 应用级缓存</p>
<p>&nbsp; 缓存在某个应用范围内被所有事务共享。缓存的生命周期依赖于应用程序的生命周期。应用级缓存由 SessionFactory 实现，Session 实例由其创建，并共享其缓存。</p>
<p>③ 分布式缓存</p>
<p>&nbsp; 集群环境中，缓存被一个 JVM 或多个 JVM 的进程共享。分布式缓存由多个应用级的缓存实例组成，缓存中的数据被复制到集群环境中的每个 JVM 节点，JVM 间通过远程通信来保证缓存中数据的一致性。</p>
<p><br />
3-1、缓存查询结果</p>
<p>&nbsp; 经常使用同样的条件查询数据，则可使用查询缓存。查询缓存需要和二级缓存联合使用，在二级缓存中，可以专门为查询缓存开辟一个命名缓存区域。查询缓存启动后将创建两个缓存区域，org.hibernate.cache.StandardQueryCache 实现保存查询结果集；org.hibernate.cache.UpdateTimestampsCache 实现保存最近更新的查询表的时间戳。</p>
<p>&lt;property name="cache.use_query_cache"&gt;true&lt;/propery&gt;</p>
<p>//使用查询缓存<br />
query.setCacheable(true);</p>
<p>//给查询缓存指定特定的命名缓存区域<br />
query.setCacheRegion("queryCache");</p>
<p>//如果其他进程更新了结果集，强行刷新缓冲区域<br />
query.setCacheMode(CacheMode.REFRESH);</p>
<p>//刷新某个或全部的缓存<br />
SessionFactory.evictQueries() 方法</p>
<p>&nbsp;</p>
<p>
<hr />
<strong>4、高级特性</strong>
<p>&nbsp;</p>
<p>4-1、数据库连接池 ConnectionProvider</p>
<p>&nbsp; J2SE 环境中使用建议。</p>
<p><br />
4-2、使用数据源 <br />
&nbsp; Hibernate 中，DatasourceConnectionProvider 实现了 ConnectionProvider 接口并封装了数据源的获取方法，充当了 Hibernate 和数据源间的适配器。</p>
<p>&nbsp; J2EE 环境中使用建议。</p>
<p><br />
4-3、过滤数据<br />
&nbsp; <br />
&nbsp; 把公共的数据过滤条件提取出来。从 Hibernate 3.0 开始，可以利用 Hibernate Filter 对某个类或集合附加预先定义的过滤条件，在查询时过滤指定条件的数据。该过滤器是全局有效的，使用时候，还可以指定特定参数。</p>
<p><br />
4-4、批量处理<br />
&nbsp; <br />
&nbsp; 批量处理引发异常的根源在于缓存中保存了过多的持久化实例而耗尽内存。</p>
<p>① 应用程序级别的批处理</p>
<p>&nbsp; 指定 Hibernate 处理 SQL 语句时，必须积累到指定数量后再向数据库提交操作。<br />
&nbsp; &lt;property name="jdbc.batch_size"&gt;20&lt;/property&gt;</p>
<p><br />
② 无状态 Session（StatelessSession）</p>
<p>&nbsp; StatelessSession 接口没有持久化上下文，也不负责持久化实例的生命周期，没有一级缓存，操作也不会影响到二级和查询缓存。</p>
<p><br />
③ 使用 DML 风格的 HQL 语句绕过内存直接进行数据处理</p>
<p>&nbsp; "delete Product p where p.id &gt; :id"</p>
<p><br />
4-4、延迟加载</p>
<p>&nbsp; 设置延迟加载的属性和集合只能在该实例依附的 Session 范围内被访问，会话关闭后，实例从持久态转为托管态，再次访问该实例的一些属性时候，有可能会抛出 LazyInitializationException 异常。</p>
<p>① 属性延迟加载（大对象）<br />
② 持久化类延迟加载<br />
③ 集合延迟加载</p>
<p><br />
4-5、数据抓取策略（Fetching strategies）</p>
<p>&nbsp; 可以在 Hibernate 中设定相应的数据抓取策略，减少系统产生的数据库查询操作，优化系统性能。</p>
<p>&nbsp; 在 Hibernate 中，延迟（lazy）定义了一种契约，用来表示托管状态实例中那些数据是有效的，而抓取（fetch）是用来调整 Hibernate 性能的。</p>
<p><br />
4-5、监控性能<br />
&nbsp; org.hibernate.stat 包提供的工具类。</p>
<p><br />
<hr />
<strong>5、附录</strong>
<p>&nbsp;5-1、XML 元数据<br />
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://doc.javanb.com/hibernate-reference-3-2-0-zh/ch18s02.html" target="_blank">18.2. XML映射元数据 - Hibernate reference 3.2.0 ga 正式版中文参考手册<br />
</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://doc.javanb.com/hibernate-reference-3-2-0-zh/ch18s03.html" target="_blank">18.3. 操作XML数据 （通过dom4j会话读入和更新应用程序中的XML文档）</a><br />
<br />
5-2、开源工具箱</p>
<p>CownewStudio 是一个基于 Eclipse 的 Hibernate 正向建模辅助工具。通过它用户能以图形化的方式建立对象模型，然后根据模型生成持久化类、映射文件和数据库表。</p>
<p>JDBMonitor。模拟一个 JDBC 驱动来代替真正的 JDBC 驱动，截取应用程序对数据库的操作，并以合适的方式记录下来，提供性能分析的来源和依据。</p>
<p>&nbsp;</p>
<br />
 <img src ="http://www.blogjava.net/kiant/aggbug/265417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2009-04-14 09:56 <a href="http://www.blogjava.net/kiant/articles/265417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>'Hibernate 完全手册' 读书笔记（四） 查询语言</title><link>http://www.blogjava.net/kiant/articles/265072.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sat, 11 Apr 2009 18:11:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/265072.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/265072.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/265072.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/265072.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/265072.html</trackback:ping><description><![CDATA[<p><br />
<strong>1、查询返回</strong></p>
<p>● 查询语句可以返回多个对象或属性，存放在 Object[] 队列中。</p>
<p>● 将查询结果的所有属性都存放在一个 List 对象中：<br />
&nbsp; select new list(xxx.xxxx,xx.xx) .....<br />
这里的 new list 是实例化 java.util.ArraryList 对象。</p>
<p>● 将查询结果封装成一个安全的 Java 对象<br />
&nbsp; select new EncCustomer(xx.xxx, xx.xx)....</p>
<p>● 将查询结果封装成 Map 对象（利用别名）<br />
&nbsp; select new map(xx.xxx as aaaa, xx.xxxx as bb) .....<br />
.....<br />
&nbsp; Map obj = (Map)list.get(i);<br />
&nbsp; obj.get("aaaa");&nbsp; <br />
&nbsp; obj.get("bb");</p>
<p><br />
● distinct 删除重复数据</p>
<p><br />
<strong>
<hr />
2、参数绑定机制</strong></p>
<p>● <br />
&nbsp; q.setParameter("name", name);<br />
&nbsp; Hibernate 能根据参数值的 Java 类型推断出对应的映射类型，对于日期类型，如 java.util.Date 类型，会对应多种映射类型，这时候需要显示指定。<br />
&nbsp; q.setParameter("date", Hibernate.DATE);</p>
<p>● <br />
&nbsp; q.setProperties(obj);<br />
&nbsp; 根据 obj 的属性名对应 HQL 语义中定义的命名参数进行查询。</p>
<p><br />
<strong>
<hr />
3、HQL 子查询<br />
</strong>&nbsp;&nbsp; 用于子查询的集合函数 size()、minIndex()、maxIndex()、minElement()、maxElement() 和 elements()。</p>
<p><br />
<strong>
<hr />
4、集合过滤</strong><br />
&nbsp; 对于某持久化对象的 items 属性内元素性能优化（过滤集合内数据、排序等）。</p>
<p>&nbsp; Session.createFilter(object, string);<br />
&nbsp; 返回是 Query 类型<br />
&nbsp; 参数 object 是持久化对象的集合。<br />
&nbsp; 参数 string 是 HQL 的过滤条件</p>
<p>//过滤 prod 的集合 items<br />
List items = session.createFilter(prod.getItems(),<br />
&nbsp;"this.unitCost&lt;100 order by this.ListPrice desc").List();<br />
//绑定过滤的结果 itmes 到属性<br />
prod.setItems(items);</p>
<p><br />
<strong>
<hr />
5、条件查询 QBC</strong></p>
<p>5-1、Restrictions 过滤结果集</p>
<p><br />
5-2、结果集排序<br />
&nbsp;.addOrder(Order.asc("name"))<br />
&nbsp;.addOrder(Order.desc("category"))<br />
&nbsp;.list();</p>
<p><br />
5-3、createCriteria() 关联查询<br />
&nbsp; List list = sess.createCriteria(Product.class)<br />
&nbsp;.add(Restrictions.like("name", "%o%"))<br />
&nbsp;.createCriteria("items")&nbsp;&nbsp;<br />
&nbsp;.add(Restrictions.ge("listPrice", new Float(100.0))<br />
&nbsp;.list();<br />
//返回一个新的 Criteria 实例，该实例引用 items 集合中的元素，并且为该集合元素增加了元素属性 listPrice 大于等于 100.0 的过滤条件。</p>
<p>或者使用别名<br />
&nbsp;.createAlias("items", "ite")<br />
&nbsp;.add(Restrictions.ge("ite.listPrice", new Float(100.0))</p>
<p><br />
5-4、设置加载策略<br />
&nbsp;.setFetchMode("items", FetchMode.EAGER) <br />
&nbsp;.list();</p>
<p>&nbsp; DEFAULT：默认<br />
&nbsp; EAGER/JOIN：强制立即加载<br />
&nbsp; LAZY/SELECT：强制延迟加载</p>
<p><br />
5-5、聚合和分组&nbsp; org.hibernate.criterion.Projections </p>
<p>&nbsp;.setProjection(Projections.rowCount())<br />
&nbsp;.uniqueResult()；</p>
<p>&nbsp;.add(Projections.groupProperty("imagePath"))<br />
&nbsp;.list();</p>
<p><br />
5-6、离线与子查询</p>
<p>&nbsp; 离线查询方式在 Session 范围之外定义一个离线查询，然后使用任意的 Session 执行查询。该方法主要通过 org.hibernate.criterion.DetachedCriteria 类实现。</p>
<p><br />
<strong>
<hr />
6、Native SQL 查询</strong></p>
<p>&nbsp;&nbsp; 应用程序中使用与数据库相关的 SQL 查询语句</p>
<p>6-1、Native SQL 应用程序接口</p>
<p>&nbsp; 主要使用 SQLQuery.addEntity() 实现返回结果为实体的查询，SQLQuery.addScalar() 则返回标量值。<br />
&nbsp; SQLQuery.addJoin(String alias, String path) 用于将映射对象所关联的实体或集合对应起来。</p>
<p>&nbsp; <br />
6-2、命名查询<br />
&nbsp; sess.getNamedQuery(string);</p>
<p>&nbsp; 在 xml 文件中使用 &lt;! [CDATA []] &gt; 元表示其中的内容是区分其他元素定义的纯文本。例如： &lt; 符号。</p>
<p><br />
6-3、使用存储过程<br />
&nbsp; Hibernate 3.0 以上的版本已经支持和利用存储过程来进行查询，存储过程返回的参数是标量与实体，这里可以利用返回类型的定义将存储过程返回的参数映射到对象的属性中。</p>
<p>&lt;sql-query name="productQuery" callable="true"&gt;<br />
&nbsp; &lt;return alias="prod" class="petstore.domain.Product"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;return-property name="productId" column="PRODUCTID" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;return-property name="description" column="DESCRIPTION" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;return-property name="name" column="NAME" /&gt;<br />
&nbsp; &lt;/return&gt;<br />
&nbsp; {? = call getProduct(?)}<br />
&lt;/sql-query&gt;</p>
<p>List list = query.list();</p>
<p>&nbsp;</p>
 <img src ="http://www.blogjava.net/kiant/aggbug/265072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2009-04-12 02:11 <a href="http://www.blogjava.net/kiant/articles/265072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>'Hibernate 完全手册' 读书笔记（三） 映射、操作对象</title><link>http://www.blogjava.net/kiant/articles/265049.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sat, 11 Apr 2009 12:46:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/265049.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/265049.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/265049.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/265049.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/265049.html</trackback:ping><description><![CDATA[<p><br />
<strong>1、对象关系映射</strong></p>
<p>1-1、单向多对一关联</p>
<p>&nbsp;产品和分类的关系：多个不同产品属于同一种分类。<br />
private Category category；<br />
&lt;many-to-one name="category" column="categoryId" not-null="true" /&gt;</p>
<p><br />
1-2、一对多映射<br />
private Set products = new HashSet();<br />
&lt;set name="products"&nbsp;&nbsp;&lt;!--Category 中集合属性名称为 products--&gt;<br />
&nbsp; table="product"&nbsp;&nbsp;&lt;!--集合属性对应表的名称为 product--&gt;<br />
&nbsp; schema="test"&nbsp;&nbsp;&nbsp;&lt;!--表的 schema 名称为 test--&gt;<br />
&nbsp; lazy="true"&nbsp;&nbsp;&nbsp;&lt;!--此集合采用延时加载策略--&gt;<br />
&nbsp; inverse="true"&nbsp;&nbsp;&lt;!--由关联属性的另一方作为关联的主控方--&gt;<br />
&nbsp; cascade="delete"&nbsp;&nbsp;&lt;!--采用级联删除，当 Category 被删除时关联的此集合内容也将被删除--&gt;<br />
&nbsp; sort="natural"&nbsp;&nbsp;&lt;!--自然排序集合内容--&gt;<br />
&nbsp; order-by="productId asc"&nbsp;&lt;!--按 productId 字段升序排列集合内容--&gt;<br />
&nbsp; &gt;<br />
&nbsp; &lt;key column="category_fk" /&gt;<br />
&nbsp; <br />
&nbsp; &lt;one-to-many class="petstore.domain.Product" /&gt;<br />
&lt;/set&gt;<br />
</p>
<p><br />
1-3、继承映射<br />
</p>
<p><br />
<hr />
<strong>2、Hibernate 操作对象</strong><br />
<br />
2-1、对象的三种状态</p>
<p>● 瞬时态（Transient）--VO（Value Ojbect）<br />
&nbsp; 对象实例产生到被 JVM 垃圾回收为止并不受 Hibernate 框架管理。</p>
<p>● 持久态（Persistent）--PO（Persistent Ojbect）<br />
&nbsp; 对象实例被 Hibernate 框架管理，该对象可能是刚被保存的，或刚从数据库中被加载的。Hibernate 会检测处于持久态的对象任何改动，在当前操作单元执行完毕将对象与数据库同步，即将对象的属性保存到数据库映射对应的字段中。简单点说就是该实体对象与 session 发生关系，而且处于 session 的有效期内。<br />
&nbsp; <br />
● 托管态（Detached）--VO（Value Ojbect）<br />
&nbsp; 与持久对象关联的 Session 被关闭后，对象就变为托管的，可继续被修改。托管对象如果重新关联到某个新的 Session 上，会再次变为持久的，同时改动也将会被持久化到数据库。这个期间的转变过程可以看作是应用程序事务，即中间会给用户思考时间的长时间运行的操作单元。<br />
&nbsp; 处于托管态对象具有与数据库表记录间的联系（持久化标识，identifier）。</p>
<p><br />
<br />
2-2、对象操作的应用程序接口</p>
<p>● 修改对象</p>
<p>&nbsp; 对于已经持久化的对象，不需要调用某个特定的方法就可以实现修改持久化，因为 Hibernate 会自动调用 flush() 方法保证与数据库的同步。</p>
<p>&nbsp; 对于处于托管状态的实例，Hibernate 通过提供 Session.update() 或 Session.merge() 方法，重新关联托管实例。但是需要注意的是：如果具有持久化标识（identifier）的对象之前已经被另一个会话连接（secondSession）装载了，应用程序关联操作会发生异常。</p>
<p>&nbsp; 使用 merge() 方法时，用户不必考虑 session 的状态，可随时将修改保存到数据库中。例如：Session 中存在相同标识的持久化实例时，Hibernate 便会根据用户给出的对象状态覆盖原有的持久化实例的状态。</p>
<p>&nbsp; 另外，Hibernate 还提供了 saveOrUpdate()方法，它即可分配新持久化标识（identifier），保存瞬时（transient）对象，又可更新/重新关联托管的（identifier）实例。</p>
<p><br />
● 删除对象<br />
&nbsp; 通过 HQL 语句，调用重载的 delete()，可以一次删除多个对象。<br />
&nbsp; session.delete("from Customer as c where c.customerId &lt;3");</p>
<p><br />
● 查询对象<br />
&nbsp; 已知对象表示符值查询<br />
&nbsp; 对象标识符未知查询 HQL<br />
&nbsp; 根据某些特定条件查询 QBC，Query By Criteria<br />
&nbsp; 按详例查询 QBE，Query By Example<br />
&nbsp; 调用数据库查询 native SQL</p>
<p>&nbsp; 查询条件参数 ？ 查询条件参数索引，由 0 开始。<br />
&nbsp; 查询条件实名 ：name<br />
&nbsp; 外置命名查询</p>
<p>&nbsp;&nbsp;&nbsp; 在映射文件定义查询语句，将程序与查询语句分离：<br />
&nbsp;&nbsp;&nbsp; &lt;query name="CategoryById"<br />
&nbsp;&lt;! [CDATA[<br />
&nbsp;&nbsp;from Category c where c.categoryId&gt;? ]]&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/query&gt;</p>
<p>&nbsp;&nbsp;&nbsp; 程序调用：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query q = sess.getNamedQuery("CategoryById");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q.setLong(0, name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List cats = q.List();<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; 用 Query 提供的 iterate() 方法遍历查询结果，如果查询的结果在 session 或二级缓存（second-level cache）中，那么使用 iterate() 方法可以得到更好的性能。</p>
<p>&nbsp; 如果 JDBC 驱动支持可滚动的 ResuleSet，Query 接口可以使用 ScrollableResults，允许你在查询结果中灵活移动（需要保持数据库连接和游标 cursor 处于抑制打开状态）。</p>
<p>ScrollableResults cates = q.scroll();<br />
cates.first()<br />
cates.scroll(5);</p>
<p><br />
● cascade 和 inverse 级联操作</p>
<p>inverse<br />
&nbsp; 只对 set，one-to-many（或 many-to-many）有效，对于 many-to-one，one-to-one 无效<br />
&nbsp; 对集合起整体作用</p>
<p>cascade<br />
&nbsp; 对关系标记都有效<br />
&nbsp; 对集合的一个元素起作用，如果集合为空，那么 cascade 不会引发关联操作<br />
&nbsp; <br />
&nbsp; 作用时机：在 flush 时（commit 会自动执行 flush），hibernate 会自行判断每个 set 是否有变化，对有变化的 set 执行相应的 SQL，if (inverse) return。即：cascade 在前，inverse 在后。</p>
<p>异常：<br />
org.hibernate.exception.ConstraintViolationException: could not insert</p>
<p>原因是 category_fk 字段约束不能为空，而在新建的 Product 对象时插入了空值，而且关联关系由 Caterogy 对象维持，而被关联的 Product 对象不知道自己与哪个 Category 对象关联。说到底就是 pro 对象的 categoryId 值为空。</p>
<p>&nbsp;</p>
  <img src ="http://www.blogjava.net/kiant/aggbug/265049.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2009-04-11 20:46 <a href="http://www.blogjava.net/kiant/articles/265049.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>'Hibernate 完全手册' 读书笔记（二） 初识、体系、对象标识符、配置、映射类型</title><link>http://www.blogjava.net/kiant/articles/264993.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sat, 11 Apr 2009 02:45:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/264993.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/264993.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/264993.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/264993.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/264993.html</trackback:ping><description><![CDATA[<p><strong>1、使用 Hibernate 操作数据库</strong></p>
<p>1-1、使用 ThreadLocal 控制 Session</p>
<p>&nbsp;&nbsp;&nbsp; 应用程序根据配置文件构建应用程序运行的环境，建立全局范围内的 SessionFactory 对象。其内部包含了 Hibernate 运行的全部细节，是产生 Session 的工厂，它是线程安全的，只能在系统启动时实例化一次，系统运行期间不可修改。</p>
<p>&nbsp;&nbsp;&nbsp; Session 对象是 Hibernate 操作数据的核心，数据库的操作、对象生命周期的管理、应用事务的划分，都需要在 Session 对象中完成。Session&nbsp; 对象不是线程安全的，如果试图让多个线程同时使用一个 Session 对象，将会产生数据混乱，造成数据库的数据不一致。而且频繁开关 Session 是巨大的系统消耗。</p>
<p>&nbsp;&nbsp;&nbsp; 为了安全地使用 Session 对象，需要应用 Java 语言中的线程绑定机制--ThreadLocal，它代表一个线程的私有存取空间，能够隔离多线程环境中的并发机制，减少 Session 对象的创建和销毁次数，降低系统资源浪费。<br />
<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 id="Code_Closed_Image_104728" onclick="this.style.display='none'; Code_Closed_Text_104728.style.display='none'; Code_Open_Image_104728.style.display='inline'; Code_Open_Text_104728.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_104728" style="display: none" onclick="this.style.display='none'; Code_Open_Text_104728.style.display='none'; Code_Closed_Image_104728.style.display='inline'; Code_Closed_Text_104728.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_104728" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">HibernateSessionFactory</span><span id="Code_Open_Text_104728" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_37_757_Open_Image" onclick="this.style.display='none'; Codehighlighter1_37_757_Open_Text.style.display='none'; Codehighlighter1_37_757_Closed_Image.style.display='inline'; Codehighlighter1_37_757_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_37_757_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_37_757_Closed_Text.style.display='none'; Codehighlighter1_37_757_Open_Image.style.display='inline'; Codehighlighter1_37_757_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HibernateSessionFactory&nbsp;</span><span id="Codehighlighter1_37_757_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_37_757_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;ThreadLocal</span><span style="color: #000000">&lt;</span><span style="color: #000000">Session</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;threadLocal&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ThreadLocal</span><span style="color: #000000">&lt;</span><span style="color: #000000">Session</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img id="Codehighlighter1_198_513_Open_Image" onclick="this.style.display='none'; Codehighlighter1_198_513_Open_Text.style.display='none'; Codehighlighter1_198_513_Closed_Image.style.display='inline'; Codehighlighter1_198_513_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_198_513_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_198_513_Closed_Text.style.display='none'; Codehighlighter1_198_513_Open_Image.style.display='inline'; Codehighlighter1_198_513_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Session&nbsp;getSession()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;HibernateException&nbsp;</span><span id="Codehighlighter1_198_513_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_198_513_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Session)&nbsp;threadLocal.get();<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img id="Codehighlighter1_300_482_Open_Image" onclick="this.style.display='none'; Codehighlighter1_300_482_Open_Text.style.display='none'; Codehighlighter1_300_482_Closed_Image.style.display='inline'; Codehighlighter1_300_482_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_300_482_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_300_482_Closed_Text.style.display='none'; Codehighlighter1_300_482_Open_Image.style.display='inline'; Codehighlighter1_300_482_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(session&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">session.isOpen())&nbsp;</span><span id="Codehighlighter1_300_482_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_300_482_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img id="Codehighlighter1_333_367_Open_Image" onclick="this.style.display='none'; Codehighlighter1_333_367_Open_Text.style.display='none'; Codehighlighter1_333_367_Closed_Image.style.display='inline'; Codehighlighter1_333_367_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_333_367_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_333_367_Closed_Text.style.display='none'; Codehighlighter1_333_367_Open_Image.style.display='inline'; Codehighlighter1_333_367_Open_Text.style.display='inline';" 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="color: #0000ff">if</span><span style="color: #000000">&nbsp;(sessionFactory&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_333_367_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_333_367_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><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;rebuildSessionFactory();<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><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"><br />
</span><span style="color: #008080">13</span><span style="color: #000000"><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;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(sessionFactory&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;sessionFactory.openSession()<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><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;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><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;threadLocal.set(session);<br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;session;<br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" />.<br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img id="Codehighlighter1_586_749_Open_Image" onclick="this.style.display='none'; Codehighlighter1_586_749_Open_Text.style.display='none'; Codehighlighter1_586_749_Closed_Image.style.display='inline'; Codehighlighter1_586_749_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_586_749_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_586_749_Closed_Text.style.display='none'; Codehighlighter1_586_749_Open_Image.style.display='inline'; Codehighlighter1_586_749_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;closeSession()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;HibernateException&nbsp;</span><span id="Codehighlighter1_586_749_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_586_749_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Session)&nbsp;threadLocal.get();<br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadLocal.set(</span><span style="color: #0000ff">null</span><span style="color: #000000">);<br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">27</span><span style="color: #000000"><img id="Codehighlighter1_704_743_Open_Image" onclick="this.style.display='none'; Codehighlighter1_704_743_Open_Text.style.display='none'; Codehighlighter1_704_743_Closed_Image.style.display='inline'; Codehighlighter1_704_743_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_704_743_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_704_743_Closed_Text.style.display='none'; Codehighlighter1_704_743_Open_Image.style.display='inline'; Codehighlighter1_704_743_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(session&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_704_743_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_704_743_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">28</span><span style="color: #000000"><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;session.close();<br />
</span><span style="color: #008080">29</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">30</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">31</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">32</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">34</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></span></div>
<br />
<br />
1-2、建立数据库结构 </p>
<p>&nbsp;&nbsp;&nbsp; 使用 Hibernate 时，设计生成数据库表结构的方式分成两种。</p>
<p>1、手工用 SQL 语句设计数据表结构</p>
<p>2、使用 Hibernate 根据映射文件自动构建数据库模式<br />
&nbsp;&nbsp;&nbsp; hibernate.cfg.xml:<br />
&nbsp;&lt;property name="hbm2dll.auto"&gt;creat&lt;/property&gt;<br />
&nbsp;&lt;property name="show_sql"&gt;true&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; log4j.properties<br />
&nbsp;log4j.logger.org.hibernate.tool.hbm2dll=debug</p>
<p>Hibernate 自行管理的数据库表结构：<br />
● none：不产生任何动作。<br />
● create：在应用启动时，自动生成数据库表结构并导入到数据库中。<br />
● create-drop：同 create，但在应用关闭时，删除已生成的数据库表结构；此方式常在测试时使用。<br />
● update：在应用启动时，检查持久化类和映射文件的改变，更新数据库表结构，比如：持久化类添加一个属性后，Hibernate 能自动添加对应字段到对应的数据库表中。<br />
</p>
<br />
<br />
3、使用 Session 操作数据库<br />
&nbsp; Hibernate 能自动管理系统中的持久化类和数据库模式，通过 Session 对象实现对象模型和关系模型的相互操作。<br />
Session 提供数据访问的接口：<br />
● get()：从数据库获取数据对象，不存在时则返回 null。<br />
● load()：从数据库获取数据对象，不存在时则抛出异常。<br />
● createQuery()：根据条件查询数据对象。<br />
● save()、update()、delete() 等方法。
<p>&nbsp;</p>
<p><br />
<hr />
<br />
<strong>2、Hibernate 基本组件接口</strong> <br />
<br />
<p>● Configuration（org.hibernate.cfg.Configuration）<br />
&nbsp; Hibernate 应用的入口，它使用配置文件初始化运行环境，是 SessionFactory 的工厂。通常情况下，一个应用程序中只允许创建一个单例的 Configuration 实例。</p>
<p>● SessionFactory（org.hibernate.SessionFactory）<br />
&nbsp; 是一个线程安全的高速缓存，其中包含了单一数据库和已编译映射文件的元数据，在运行环境不可改变。它是 Session 的工厂，并能从 ConnectionProvider 中获取 JDBC 连接。它可能持有一个可选的能在进程级别或者集群级别事务间重用的数据缓存（二级缓存）。SessionFactory 从 Configuration 中获取，在一个应用范围中，不允许改变。</p>
<p>● Session（org.hibernate.Session）<br />
&nbsp; 单线程的短生命周期的对象，是应用程序和持久化存储的一次对话。封装了一个 JDBC 连接，也是 Transaction 的工厂。它保持一个持久化对象的强制缓存（一级缓存），用来遍历对象图或者根据标识符查询对象。Session 提供了一系列方法，可以方便地实现对象持久化操作。</p>
<p>● Transcation（org.hibernate.Transcation）<br />
&nbsp; 可选，单线程、短生命周期的对象，应用程序用它来表示一批任务的原子操作。是底层 JDBC，JTA 或者 CORBA 事务的抽象。一个 Session 在某些情况下可能跨越多个 Transcation 事务。</p>
<p>● ConnectionProvider（org.hibernate.connection.ConnectionProvider）<br />
&nbsp; 可选，JDBC 连接的工厂和连接池，是底层 Datasource 或 DriverManager 的抽象应用，对应用程序不可见。可扩展实现。</p>
<p>● TranscationFactory（org.hibernate.TranscationFactory）<br />
&nbsp; 可选，事务实例工厂。对应用程序不可见。可扩展实现。</p>
<p><br />
&nbsp; 在最小集合应用框架中，应用程序直接使用 JDBC/JTA，并自行完成事务处理。<br />
&nbsp;conn = DriverManager.getConnection(xxx);<br />
&nbsp;conn.setAutoCommit(false);<br />
&nbsp;...<br />
&nbsp;conn.commit();</p>
<p><br />
<hr />
<br />
<strong>3、Hibernate 生命周期</strong><br />
<br />
① Configuration 对象根据配置文件的设置，读取属性配置信息。<br />
② Configuration 对象根据配置信息，按照映射文件、类缓存、集合缓存、监听器、事件的顺序依次读取并解析。<br />
③ 通过调用 Configuration 对象构建 SessionFactory。<br />
④ 调用 SessionFactory 实例获得 Session 对象。<br />
⑤ 启动事务。<br />
⑥ 提交事务。<br />
⑦ 关闭应用（Session 和 SessionFactory）。 <br />
<br />
<hr />
<br />
<strong>4、Hibernate 中对象的状态</strong> <br />
<br />
&nbsp; 为了区分持久化类的实例对象，根据对象和会话的关联状态，可以分为三种情况：
<p>&nbsp;</p>
<p>● 暂态状态。对象刚建立，还没有使用 Hibernate 进行保存。该对象在数据库中没有记录，也不在 session 缓存中。如果该对象是自动生成主键，则该对象的对象标识符为空。</p>
<p>● 持久化对象。对象已经通过 Hibernate 进行了持久化，数据库中已经存在对应的记录。如果该对象是自动生成主键，则该对象的对象标识符已被赋值。</p>
<p>● 托管对象。该对象是经过 Hibernate 保存过或者从数据库中取出的，但是与之关联的 session 已经被关闭。虽然它拥有对象标识符，且数据库中存在对应的记录，但是已经不再被 Hibernate 管理。<br />
</p>
<p><br />
ps.&nbsp;<a href="http://www.blogjava.net/vip01/archive/2007/01/08/92430.html" target="_blank">[转] PO BO VO DTO POJO DAO概念及其作用（附转换图）</a> <br />
</p>
<p><br />
<hr />
<br />
<strong>5、对象标识符</strong><br />
&nbsp; <br />
&nbsp; 关系数据库表的主键在 Java 应用环境中的体现。 <br />
<br />
<p>5-1、关系型数据库的主键生成机制<br />
&nbsp; 序列生成主键，整数<br />
&nbsp; 自动增长组件，整数<br />
&nbsp; 全局统一标识符 GUID（Globally Unique Identifier），字符串主键</p>
<p>&nbsp; <br />
5-2、Java 环境中的对象识别机制<br />
&nbsp; 引用比较，比地址 &#8220;==&#8221;<br />
&nbsp; 内容比较，比数据 equals() 方法</p>
<p><br />
5-3、Hibernate 对象识别符的作用<br />
&nbsp; 在生成 Java 对象时，给标识属性分配一个唯一的值，用于区分同一个类的多个不同的实例。体现在 Hibernate 中就是对象标识符。</p>
<p><br />
5-4、Hibernate 内置标识符生成器的使用方法<br />
&nbsp; org.hibernate.id.IdentifierGenerator 接口。</p>
<p>ps.&nbsp; <a href="http://aumy2008.blogbus.com/logs/13417260.html" target="_blank">映射对象标识符</a><br />
</p>
<p>5-5、使用复合主键时组合标识符的使用方法（常用于遗留的系统中）<br />
&nbsp; 嵌入式组合标识符/映射式组合标识符，映射多个主键字段和持久化类的多个属性。</p>
<p><br />
<hr />
<br />
<strong>6、配置 Hibernate</strong> <br />
<br />
6-1、配置方式<br />
&nbsp; 可编程还是文件配置方式 <br />
<br />
<p>Hibernate JDBC 配置属性<br />
&nbsp; hibernate.jdbc.fatch_size：指定 JDBC 抓取数据的数量大小，非零值<br />
&nbsp; hibernate.jdbc.batach_size：允许 Hibernate 使用 JDBC2 的批量更新，非零值，建议 5 到 30<br />
&nbsp; hibernate.jdbc.provider_class：自定义的 ConnectionProvider 类名，用于向 Hibernate 提供 JDBC 连接<br />
&nbsp; hibernate.jdbc.autocommit：确认是否开启 JDBC 自动提交功能，默认为 false 不自动提交</p>
<p><br />
6-2、方言<br />
&nbsp; 屏蔽底层数据库系统的方言机制，方便与数据库间迁移。<br />
&nbsp; MySQL：org.hibernate.dialect.MySQLDialect<br />
&nbsp; MySQL with InnoDB：org.hibernate.dialect.MySQLInnoDBDialect<br />
&nbsp; MySQL with MyISAM：org.hibernate.dialect.MySQLMyISAMDialect</p>
<p><br />
6-3、Hibernate 日志系统<br />
&nbsp; 使用 Log4J 作为&nbsp; Hibernate 的日志系统，需要将 Log4J 的库文件 log4j.jar 放置到类路径下（其发布包以包含 Log4J 的库文件）。然后编写日志配置文件 log4j.properties 并放到 classpath 路径中。</p>
<p>&nbsp; Log4J 中，几个日志输出级别的顺序是：只输出高于或等于 设定级别 的记录。<br />
trace &lt; debug &lt; info &lt; warn &lt; error &lt; fatal</p>
<p>&nbsp; 在开发模式中，可以选择 DEBUG 级别的输出；应用部署后，可以配置为 ERROR。&nbsp; <br />
<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 id="Code_Closed_Image_104409" onclick="this.style.display='none'; Code_Closed_Text_104409.style.display='none'; Code_Open_Image_104409.style.display='inline'; Code_Open_Text_104409.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_104409" style="display: none" onclick="this.style.display='none'; Code_Open_Text_104409.style.display='none'; Code_Closed_Image_104409.style.display='inline'; Code_Closed_Text_104409.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_104409" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">log4j.properties</span><span id="Code_Open_Text_104409" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">#设置日志根级别和输出路径<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.rootLogger</span><span style="color: #000000">=</span><span style="color: #000000">INFO,CONSOLE,FILE<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#日志输出路径——控制台<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.CONSOLE</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.ConsoleAppender<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.stdout.Target</span><span style="color: #000000">=</span><span style="color: #000000">System.out<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.CONSOLE.layout</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.PatternLayout<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.CONSOLE.layout.ConversionPattern</span><span style="color: #000000">=%</span><span style="color: #000000">d</span><span style="color: #000000">|</span><span style="color: #000000">ABSOLUTE&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">5p&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">c</span><span style="color: #000000">|</span><span style="color: #000000">1</span><span style="color: #000000">|</span><span style="color: #000000">:</span><span style="color: #000000">%</span><span style="color: #000000">L&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">m</span><span style="color: #000000">%</span><span style="color: #000000">n<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#日志输出路径——文件<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.FILE</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.FileAppender<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.FILE.File</span><span style="color: #000000">=</span><span style="color: #000000">hibernate.log<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.FILE.layout</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.PatternLayout<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.FILE.layout.ConversionPattern</span><span style="color: #000000">=%</span><span style="color: #000000">d</span><span style="color: #000000">|</span><span style="color: #000000">ABSOLUTE&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">5p&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">c</span><span style="color: #000000">|</span><span style="color: #000000">1</span><span style="color: #000000">|</span><span style="color: #000000">:</span><span style="color: #000000">%</span><span style="color: #000000">L&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">m</span><span style="color: #000000">%</span><span style="color: #000000">n<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#日志输出级别<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.logger.org.hibernate</span><span style="color: #000000">=</span><span style="color: #000000">INFO<br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#日志输出类别<br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.logger.org.hibernate.hql.ast.AST</span><span style="color: #000000">=</span><span style="color: #000000">WARN<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.logger.net.sf.ehcache</span><span style="color: #000000">=</span><span style="color: #000000">INFO<br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.logger.org.hibernate.SQL</span><span style="color: #000000">=</span><span style="color: #000000">DEBUG</span></span></div>
<br />
<br />
<hr />
<br />
<strong>7、Hibernate 映射类型</strong> <br />
<br />
</p>
<p><br />
7-1、时间日期映射类型（内置映射类型）</p>
<p>&nbsp; Java 语言提供了 java.util.Date 和 java.util.Calendar 两个类实现时间的运算。此外，JDBC 还提供了 java.util.Date 的三个扩展类 java.sql.Timestamp、java.sql.Time 和 java.sql.Date 分别对应标准 SQL 数据类型中的 TIMESPAME/DATETIME（时间日期）、TIME（时间）、DATE（日期）。</p>
<p>java.util.Date/java.sql.Date&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H:date&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;&nbsp;&nbsp;&nbsp;SQL:DATE<br />
java.util.Time/java.sql.Time&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H:time&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;&nbsp;&nbsp;&nbsp;SQL:TIME<br />
java.util.Date/java.sql.Timestamp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H:timestamp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQL:TIMESTAMP/DATETIME<br />
java.util.Calendar&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H:calendar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQL:TIMESTAMP/DATETIME<br />
java.util.Calendar&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; H:calendar_date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL:DATE</p>
<p><br />
7-2、自定义映射类型</p>
<p><br />
&nbsp;</p>
 <img src ="http://www.blogjava.net/kiant/aggbug/264993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2009-04-11 10:45 <a href="http://www.blogjava.net/kiant/articles/264993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>'Hibernate 完全手册' 读书笔记（一） 对象持久化基础</title><link>http://www.blogjava.net/kiant/articles/264770.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Fri, 10 Apr 2009 01:50:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/264770.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/264770.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/264770.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/264770.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/264770.html</trackback:ping><description><![CDATA[<p><br />
&nbsp;&nbsp;&nbsp; 数据库技术已经成为企业信息平台的核心。应用程序必须将业务相关的数据通过一定方式持久化到数据库，还应能够从数据库获取已有的数据，以适当的形式提供给客户或支撑系统的运行。</p>
<p>&nbsp;&nbsp;&nbsp; 关键点：如何高效地存取数据、简化编程模型、降低应用的复杂度</p>
<p>&nbsp;&nbsp;&nbsp; 在系统中引入持久层，负责所有相关数据的持久化操作，可以为整个应用系统提供一个高层、统一、安全、并发的数据持久机制。</p>
<p><br />
1、对象持久化技术</p>
<p>1-1、Java 对象序列化<br />
&nbsp;&nbsp;&nbsp; 序列化是 Java 语言中内置的轻量级数据持久化机制，该机制可以将任何实现了 java.io.Serializable 接口的对象转化为连续的字节流数据，保存在文件中，或者通过网络进行传输。这些数据日后可被还原为原先的对象状态。<br />
&nbsp;&nbsp;&nbsp; 缺点：局限性大，查询只能返回数据流的下一个对象，不提供部分的读取和更新，不提供对象的生命周期管理，只是简单的读取和写入，不提供并发和事务特性。</p>
<p>1-2、使用 JDBC<br />
&nbsp;&nbsp;&nbsp; JDBC（Java Database Connectivity）是用来访问关系数据库系统的标准 Java API。JDBC 只是提供访问数据的接口，其底层实现有特定的数据库厂商实现。<br />
&nbsp;&nbsp;&nbsp; 缺点：直接使用 JDBC 实现持久化时，SQL 语句和应用代码混杂在一起，逻辑混乱。另外直接使用 SQL 操作数据库，不是面向对象。</p>
<p>1-3、使用 JDO<br />
&nbsp;&nbsp;&nbsp; Java 数据对象（Java Data Object）是 JCP（Java Community Process）发布的一个规范，是 Java 对象持久化的标准。JDO 仅定义了标准的编程接口，而把关系映射的定义留给软件供应商实现。</p>
<p>1-4、实体 EJB<br />
&nbsp;&nbsp;&nbsp; 实体 EJB（Enterpise Java Bean）是 Java 领域的数据持久化标准。</p>
<p>1-5、对象关系映射<br />
&nbsp;&nbsp;&nbsp; 对象关系映射（Ojbect Relation Mapping）在对象模型和关系模型之间建立沟通的桥梁。ORM 技术封装了数据持久化的操作细节，为应用程序提供了一只访问的接口，使应用程序可以专注于业务逻辑的处理。它采用 POJO（Plain Old Java Object，简单的传统对象）作为域对象的表述，不涉及域对象之外的技术细节，降低的 ORM 技术的侵入性，实现简单，便于测试，具备高扩展性。</p>
<p><br />
2、对象关系映射模型<br />
&nbsp;&nbsp;&nbsp; 一个完整的对象关系映射框架，应具备以下四个方面：</p>
<p>①、一个元数据映射规范，负责持久化类、类属性的数据库表、字段的映射，实现对象和关系的语义连接。<br />
②、一组对象操作接口，用于完成数据的增加、删除、修改和更新等操作。<br />
③、一种面向对象的查询语言，该语言能理解继承、多态和关联等面向对象特性，实现基于对象的查询并在对象之间导航。<br />
④、一系列与数据库现关的技术实现和最佳实践，保证系统的完整性并提高系统的可用性和扩展性。比如：事务、缓存和数据抓取策略等。</p>
<p>对象模型（类、属性、关联）&nbsp;&nbsp; &lt;==&gt;&nbsp;&nbsp; 关系模型（表、字段、约束）</p>
<p>&nbsp;<br />
<br />
ps. &lt;Hibernate 完全手册&gt;<br />
ISBN 978-7-111-23764-8<br />
机械工业出版社<br />
侯志松 余周 郑焕 等编著</p>
 <img src ="http://www.blogjava.net/kiant/aggbug/264770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2009-04-10 09:50 <a href="http://www.blogjava.net/kiant/articles/264770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA 中各种数据库连接方式（补齐中）</title><link>http://www.blogjava.net/kiant/articles/234126.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Mon, 13 Oct 2008 15:39:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/234126.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/234126.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/234126.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/234126.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/234126.html</trackback:ping><description><![CDATA[<br />
<br />
<strong>JDBC-ODBC 桥连</strong>（不需驱动）<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Connection conn = DriverManager.getConnection("jdbc:odbc:test", "sa", "love2you");<br />
<strong><br />
SQL SERVER 2005 直连</strong>&nbsp;&nbsp;&nbsp; [<a href="http://www.microsoft.com/downloads/details.aspx?familyid=C47053EB-3B64-4794-950D-81E1EC91C1BA&amp;displaylang=zh-cn" target="_blank">驱动下载</a>]<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Connection conn = DriverManager.getConnection(<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;&nbsp; "jdbc:sqlserver://10.0.0.99:1433;databaseName=deviantART", <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; "sa", <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; "love2you");<br />
<br />
<br />
转==============<br />
<p>常用 JDBC 驱动名字和 URL 列表 </p>
<p>ODBC&nbsp; driver<br />
sun.jdbc.odbc.JdbcOdbcDriver<br />
jdbc:odbc:name </p>
<p>用 COM.ibm.db2.jdbc.net.DB2Driver 连接到 DB2 数据库<br />
一个 DB2 URL 的示例:<br />
jdbc:db2://aServer.myCompany.com:50002/name </p>
<p>用 com.sybase.jdbc.SybDriver连接到 Sybase 数据库<br />
一个 Sybase URL 的示例:<br />
jdbc:sybase:Tds:aServer.myCompany.com:2025 </p>
<p>MySQL driver<br />
com.mysql.jdbc.Driver<br />
jdbc:mysql://hostname:3306/dbname?useUnicode=true&amp;amp;characterEncoding=GBK </p>
<p>Microsoft SQL Server Driver<br />
com.microsoft.jdbc.sqlserver.SQLServerDriver<br />
jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=WapSvc;User=sa;Password=pwd </p>
<p>Informix<br />
com.informix.jdbc.IfxDriver<br />
jdbc:informix-sqli://hostname:1526/dbname:INFORMIXSERVER=informixservername;user=username;password=password </p>
<p>Oracle<br />
oracle.jdbc.driver.OracleDriver<br />
jdbc:oracle:thin:@hostname:1521:&lt;SID&gt; </p>
<p>Postgresql<br />
org.postgresql.Driver<br />
jdbc:postgresql://localhost/soft </p>
<p>Apache Derby/Java DB<br />
org.apache.derby.jdbc.ClientDriver<br />
jdbc:derby://localhost:1527/databaseName;create=true </p>
<p>Access 是通过 ODBC 连接的. Excel 也可以. 甚至可以动态构造连接字符串: </p>
<p>这样可以直接连接到 Access 数据库文件. </p>
<p>jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:\mydata.mdb </p>
<p>类似的 Excel 文件也可以用类似方法: </p>
<p>jdbc:odbc:Driver={Microsoft Excel Driver (*.xls)};DBQ=.\mydata.xls</p>
<p>&nbsp;</p>
<br />
<br />
<br />
  <img src ="http://www.blogjava.net/kiant/aggbug/234126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-10-13 23:39 <a href="http://www.blogjava.net/kiant/articles/234126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用 Commons-Fileupload 实现文件上传</title><link>http://www.blogjava.net/kiant/articles/232301.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sat, 04 Oct 2008 04:35:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/232301.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/232301.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/232301.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/232301.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/232301.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;一、准备：1、 下载 commons-fileupload 库，下载地址：http://commons.apache.org/fileupload/2、 下载 commons-fileupload 依赖库 commons-io，下载地址：http://commons.apache.org/io/推荐文章：1、利用MultipartFile实现文件上传2、利用...&nbsp;&nbsp;<a href='http://www.blogjava.net/kiant/articles/232301.html'>阅读全文</a><img src ="http://www.blogjava.net/kiant/aggbug/232301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-10-04 12:35 <a href="http://www.blogjava.net/kiant/articles/232301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网页实际时用GBK还是UTF-8</title><link>http://www.blogjava.net/kiant/articles/228014.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Tue, 09 Sep 2008 11:02:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/228014.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/228014.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/228014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/228014.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/228014.html</trackback:ping><description><![CDATA[<br />
内容引用自：百度知道&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://zhidao.baidu.com/question/44400145.html?fr=qrl" target="_blank">http://zhidao.baidu.com/question/44400145.html?fr=qrl</a><br />
<br />
<fieldset><legend></legend>能选择的话还是应该用UTF-8
<p>事实上Windows系统自己的程序已经全面转向Unicode，而GBK只是为了应付中国标准的权宜之计。 </p>
<p>GBK的文字编码是双字节来表示的，即不论中、英文字符均使用双字节来表示，只不过为区分中文，将其最高位都定成1。 </p>
<p>至于UTF－8编码则是用以解决国际上字符的一种多字节编码，它对英文使用8位（即一个字节），中文使用24位（三个字节）来编码。对于英文字符较多的论坛则用UTF－8节省空间。 </p>
<p>GBK包含全部中文字符， <br />
UTF-8则包含全世界所有国家需要用到的字符。 </p>
<p>GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准（好像还不是国家标准） </p>
<p>UTF-8编码的文字可以在各国各种支持UTF8字符集的浏览器上显示。 <br />
比如，如果是UTF8编码，则在外国人的英文IE上也能显示中文，而无需他们下载IE的中文语言支持包。 </p>
<p>所以，对于英文比较多的论坛 ，使用GBK则每个字符占用2个字节，而使用UTF－8英文却只占一个字节。 </p>
<p>请注意：UTF-8版本虽然<strong>具有良好的国际兼容性</strong>，但中文需要比GBK/BIG5版本多占用50%的数据库存储空间，因此并非推荐使用，仅供对国际兼容性有特殊要求的用户使用。<br />
<br />
简单地说： <br />
对于中文较多的论坛，适宜用GBK编码节省数据库空间。 <br />
对于英文较多的论坛，适宜用UTF-8节省数据库空间。<br />
<br />
<br />
<strong>ps. 简单一点的说，UTF-8 支持国际化，比如能使繁体用户也能访问简体网站，这一点就够了。<br />
</strong></p>
</fieldset>
<img src ="http://www.blogjava.net/kiant/aggbug/228014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-09-09 19:02 <a href="http://www.blogjava.net/kiant/articles/228014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] J2EE培训</title><link>http://www.blogjava.net/kiant/articles/227895.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Tue, 09 Sep 2008 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/227895.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/227895.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/227895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/227895.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/227895.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 目录    系统体系结构&nbsp;    J2EE&nbsp;    Servlet&nbsp;    JSP&nbsp;    JSP VS Servlet&nbsp;    XML    &nbsp;&nbsp;    &nbsp; 系统体系结构两层体系结构缺点：l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs...&nbsp;&nbsp;<a href='http://www.blogjava.net/kiant/articles/227895.html'>阅读全文</a><img src ="http://www.blogjava.net/kiant/aggbug/227895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-09-09 11:25 <a href="http://www.blogjava.net/kiant/articles/227895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSH 组建轻量级架构 附录 -- 遇到的问题和解答</title><link>http://www.blogjava.net/kiant/articles/227450.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sat, 06 Sep 2008 15:13:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/227450.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/227450.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/227450.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/227450.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/227450.html</trackback:ping><description><![CDATA[<br />
action: null<br />
java.lang.ClassNotFoundException: org.springframework.web.struts.ContextLoaderPlugIn<br />
解决方法：加载 spring.jar 包<br />
<hr />
<br />
报 无法初始化<br />
at org.apache.struts.action.ActionServlet.initModulePlugIns(<br />
解决方法：<strong><span style="color: red"><strong>删除 asm-2.2.3.jar</strong> </span></strong>
<hr />
<br />
<p>springdao 报空指针异常<br />
java.lang.NullPointerException<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;springdao.EcAccountDAO.save(EcAccountDAO.java:48)</p>
<p>解决方法：没有加载 spring配置文件就访问了dao类<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext ctx =&nbsp; new&nbsp; ClassPathXmlApplicationContext("applicationContext.xml");&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EcAccountLevelDAO dao = (EcAccountLevelDAO)ctx.getBean("EcAccountLevelDAO");
<hr />
<br />
Servlet &nbsp; action &nbsp; is &nbsp; not &nbsp; available&nbsp;&nbsp; <br />
先检查web.xml,struts-config.xml等文件有没写错，然后检查那些struts的包有没有加全．．&nbsp;&nbsp; 或者 spring + struts 插件载入时出错
<hr />
<br />
ENCTYPE="multipart/form-data"<br />
提交得方式就把那个文件作为流来传输了，普通字符串就传不过去了！&nbsp; <br />
去掉之后默认都是传递字符串，所以只把那个文本框里面得字符串提交过去！
<hr />
<br />
&nbsp;修改表后数据库表打开不能 报错<br />
&nbsp;有可能是因为 DAO 文件没有加载 @Transcational 标记，导致事务(会话？)一直在运行，没有关闭。
<hr />
<br />
多表连查，有外键对象存在的情况下，外键对象也需要链接查询，才能引入的并入结果集<br />
EcOpus (opus, accout, catepoies)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from Opus opus, Accout accout, Catepoise catepoise<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where&nbsp; ......
<hr />
<br />
<p>IllegalStateException<br />
若已从响应(request,response)中获得 ServletOutputStream 对象或 PrintWriter 对象，则不能使用 forward方法，否则会抛出该异常。</p>
<img src ="http://www.blogjava.net/kiant/aggbug/227450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-09-06 23:13 <a href="http://www.blogjava.net/kiant/articles/227450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSH 组建轻量级架构 (二)  --  构建步骤</title><link>http://www.blogjava.net/kiant/articles/227440.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sat, 06 Sep 2008 14:06:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/227440.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/227440.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/227440.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/227440.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/227440.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Spring 整合托管 控制层、用户逻辑层及持久层&nbsp;&nbsp;&nbsp; 利用 Spring 整合托管各分层，能减少各框架间解耦所带来的开销，更好体现了 Spring的注入机制和面向切面编程带来的便利。ps.虽然也可以通过&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static ApplicationContext ctx =&nbsp; new ClassP...&nbsp;&nbsp;<a href='http://www.blogjava.net/kiant/articles/227440.html'>阅读全文</a><img src ="http://www.blogjava.net/kiant/aggbug/227440.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-09-06 22:06 <a href="http://www.blogjava.net/kiant/articles/227440.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP 中路径的获得</title><link>http://www.blogjava.net/kiant/articles/227241.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Fri, 05 Sep 2008 07:44:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/227241.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/227241.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/227241.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/227241.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/227241.html</trackback:ping><description><![CDATA[<br />
<a href=""  href_cetemp>如果地址为 http://localhost:8080/deviantART/test/MyJsp.jsp</a><br />
<br />
<br />
request.getContextPath()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/deviantART&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;获得容器上下文路径，一般为网站的相对路径(项目名)。如果为根目录，则返回值为 ""。<br />
<br />
request.getServletPath()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/test/MyJsp.jsp<br />
&nbsp;&nbsp;&nbsp;&nbsp;获得 Servlet 相对路径。<br />
<br />
request.getRequestURI()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/deviantART/test/MyJsp.jsp&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;获得请求路径。<br />
<br />
request.getRealPath("")&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D:\Program Files\apache-tomcat-6.0.16\webapps\deviantART <br />
request.getRealPath("/AAAA/BBBB")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D:\Program Files\apache-tomcat-6.0.16\webapps\deviantART\AAAA\BBBB&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;获得绝对路径(不推荐使用)。<br />
<br />
########################################################<br />
<br />
<br />
application.getContextPath()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/deviantART <br />
<br />
application.getRealPath("")&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;D:\Program Files\apache-tomcat-6.0.16\webapps\deviantART<br />
application.getRealPath("AA/BB")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D:\Program Files\apache-tomcat-6.0.16\webapps\deviantART\AA\BB <br />
<br />
application.getRealPath(request.getServletPath())<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D:\Program Files\apache-tomcat-6.0.16\webapps\deviantART\test\MyJsp.jsp <br />
<br />
<br />
##########################################################<br />
replaceAll("\\\\","xxxx");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表示一个"\"<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/kiant/aggbug/227241.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-09-05 15:44 <a href="http://www.blogjava.net/kiant/articles/227241.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSH 组建轻量级架构</title><link>http://www.blogjava.net/kiant/articles/227008.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Thu, 04 Sep 2008 08:45:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/227008.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/227008.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/227008.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/227008.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/227008.html</trackback:ping><description><![CDATA[<p>原文：&nbsp; <br />
<a href="http://blog.csdn.net/SmartTony/archive/2008/02/01/2077584.aspx" target="_blank">struts+spring+hibernate 组装web应用</a><br />
<a href="http://blog.csdn.net/SmartTony/archive/2008/02/01/2077579.aspx" target="_blank">用spring、Hibernate、Struts组建轻量级架构</a><br />
<br />
<br />
<br />
</p>
<fieldset><legend>应用程序的分层 （Application Layering）/&nbsp; SSH</legend>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大多数不复杂的web应用都能被分成至少４个各负其责的层次。这些层次是：表现层（presentation）、持久层（persistence）、业务层（business）、领域模型层（domain model）。每层在应用程序中都有明确的责任，不应该和其它层混淆功能。每一应用层应该彼此独立但要给他们之间放一个通讯接口。让我们从审视各个层开始，讨论这些层应该提供什么和不应该提供什么。<br />
<br />
<img height="193" alt="" src="http://www.blogjava.net/images/blogjava_net/kiant/wiring.gif" width="450" border="0" longdesc="用Struts, Spring, 和 Hibernate框架构建的概览" />&nbsp;</fieldset>
<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 id="Code_Closed_Image_172746" onclick="this.style.display='none'; Code_Closed_Text_172746.style.display='none'; Code_Open_Image_172746.style.display='inline'; Code_Open_Text_172746.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_172746" style="display: none" onclick="this.style.display='none'; Code_Open_Text_172746.style.display='none'; Code_Closed_Image_172746.style.display='inline'; Code_Closed_Text_172746.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_172746" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">为什么采用这样的四层架构？ </span><span id="Code_Open_Text_172746" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;通过成熟的开源产品实现各层，同自己编写代码实现，相比之下能缩短开发周期，且架构所用到的开源产品均有&nbsp;很广泛的用户群，经受过实践的考验，质量和性能更有保障。&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;层与层之间松散耦合，增加代码重用率。&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;各层分工明确，这样也利于团队的明确分工。&nbsp;</span></span></div>
<br />
<br />
<fieldset><legend>表现层 (The Presentation Layer) / Struts </legend>　　在一个典型的web应用的一端是表现层。很多Java开发者也理解Struts所提供的。然而，太常见的是，他们把像业务逻辑之类的耦合的代码放进了一个org.apache.struts.Action。所以，让我们在像Struts这样一个框架应该提供什么上取得一致意见。这儿是Struts负责的：&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 为用户管理请求和响应；&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 提供一个控制器（controller）代理调用业务逻辑和其它上层处理；&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 处理从其它层掷出给一个Struts Action的异常；&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 为显示提供一个模型；<br />
&nbsp;&nbsp;&nbsp; &nbsp;执行用户接口（UI）验证。 <br />
<p><br />
这儿是一些经常用Struts编写的但是却不应该和Struts表现层相伴的项目： </p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;直接和数据库通讯，比如JDBC调用；&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 业务逻辑和与你的应用程序相关的验证；&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 事务管理； </p>
<p>在表现层中引入这种代码将导致典型耦合（type coupling）和讨厌的维护。</p>
</fieldset>
<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 id="Code_Closed_Image_173121" onclick="this.style.display='none'; Code_Closed_Text_173121.style.display='none'; Code_Open_Image_173121.style.display='inline'; Code_Open_Text_173121.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_173121" style="display: none" onclick="this.style.display='none'; Code_Open_Text_173121.style.display='none'; Code_Closed_Image_173121.style.display='inline'; Code_Closed_Text_173121.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_173121" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">为什么使用Struts？ </span><span id="Code_Open_Text_173121" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">Struts将业务数据、页面显示、动作处理进行分离，这有利各部分的维护。&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Struts采用Front&nbsp;Controller模式来实现动作处理，让所有的动作请求都是经过一个统一入口，&nbsp;然后进行分发。这样方便我们在入口加入一些全局控制代码的实现，如安全控制、日志管理、国际化编码等。&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />通过Struts提供的ActionForm封装web&nbsp;form&nbsp;中的元素，使重用web表单成为可能。&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />借助Struts&nbsp;Validator框架帮助完成web层的验证工作，通常情况下我们不用再去为每个web页面写其验证代码，只需通过配置即可实现。这也减少了我们的开发量，由于验证代码的集中管理，也为维护带来便利。&nbsp;</span></span></div>
<br />
<br />
<fieldset><legend>业务层（The Business Layer） / Spring</legend>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;在一个典型的web应用程序的中间的组件是业务层或服务层。从编码的视角来看，这个服务层是最容易被忽视的一层。不难在用户接口（UI）层或者持久层里找到散布在其中的这种类型的代码。这不是正确的地方，因为这导致了应用程序的紧耦合，这样一来，随着时间推移代码将很难维护。幸好，针对这一问题有好几种Frameworks存在。在这个领域两个最流行的框架是Spring和PicoContainer，它们叫作微容器（microcontainers），你可以不费力不费神的把你的对象连在一起。所有这些框架都工作在一个简单的叫作&#8220;依赖注入&#8221;（dependency injection）（也通称&#8220;控制反转&#8221;（inversion of control））的概念上。这篇文章将着眼于Spring的为指定的配置参数通过bean属性的setter注入（setter injection）的使用。Spring也提供了一个构建器注入（constructor injection）的复杂形式作为setter注入的一个替代。对象们被一个简单的XML文件连在一起，这个XML文件含有到像事务管理器（transaction management handler）、对象工厂（object factories）、包含业务逻辑的服务对象（service objects）、和数据存取对象（DAO）这些对象的引用（references）。<br />
&nbsp;
<p>这篇文章的后面将用例子来把Spring使用这些概念的方法说得更清楚一些。业务层应该负责下面这些事情： </p>
<p>&nbsp;&nbsp;&nbsp; 处理应用程序的业务逻辑和业务验证； <br />
&nbsp;&nbsp;&nbsp; 管理事务； <br />
&nbsp;&nbsp;&nbsp; 预留和其它层交互的接口； <br />
&nbsp;&nbsp;&nbsp; 管理业务层对象之间的依赖； <br />
&nbsp;&nbsp;&nbsp; 增加在表现层和持久层之间的灵活性，使它们互不直接通讯； <br />
&nbsp;&nbsp;&nbsp; 从表现层中提供一个上下文（context）给业务层获得业务服务（business services ）； <br />
&nbsp;&nbsp;&nbsp; 管理从业务逻辑到持久层的实现。 </p>
</fieldset>
<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 id="Code_Closed_Image_173543" onclick="this.style.display='none'; Code_Closed_Text_173543.style.display='none'; Code_Open_Image_173543.style.display='inline'; Code_Open_Text_173543.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_173543" style="display: none" onclick="this.style.display='none'; Code_Open_Text_173543.style.display='none'; Code_Closed_Image_173543.style.display='inline'; Code_Closed_Text_173543.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_173543" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">为什么使用Spring ？ </span><span id="Code_Open_Text_173543" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">利用延时注入思想组装代码，提高系统扩展性，灵活性，实现插件式编程。&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />利用AOP思想，集中处理业务逻辑，减少重复代码，构建优雅的解决方案。&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />利用其对Hibernate的SessionFactory、事务管理的封装，更简洁的应用Hibernate。&nbsp;<br />
<br />
ps.&nbsp;&nbsp;&nbsp;&nbsp; Spring 的开发大部分情况下就是编写 XML 配置文件来组织各种各样的 Bean和切面。将程序个部分 软连接 起来，通过使用注释或者 XML 配置文件方式，程序运行的时候 Spring 能够&#8220;按需&#8221;创建或者初始化所有的对象关系。(不要要重新编译程序，鼓励使用模块化的架构来维护应用)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ++1、动态注入 Bean的值，号称不用编程赋值，用 XML 文件可以解决一切赋值语句。</span></span></div>
<br />
<br />
<fieldset><legend>持久层 （The Persistence Layer ） / Hibernate</legend>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在典型web应用的另一端是持久层。这通常是使事情迅速失控的地方。开发者低估了构建他们自己的持久层框架的挑战性。一般来说，机构内部自己写的持久层不仅需要大量的开发时间，而且还经常缺少功能和变得难以控制。有几个开源的&#8220;对象－关系映射&#8221;（ORM）框架非常解决问题。尤其是，Hibernate框架为java提供了＂对象－关系持久化＂（object-to-relational persistence）机制和查询服务。Hibernate对那些已经熟悉了SQL和JDBC API的Java开发者有一个适中的学习曲线。Hibernate持久对象是基于简单旧式Java对象（POJO）和Java集合（Java collections）。此外，使用Hibernate并不妨碍你正在使用的IDE。下面的列表包含了你该写在一个持久层框架里的代码类型： </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查询相关的信息成为对象。Hibernate通过一种叫作HQL的面向对象（OO）的查询语言或者使用条件表达式API（expressive criteria API）来做这个事情。 HQL非常类似于SQL-- 只是把SQL里的table和columns用Object和它的fields代替。有一些新的专用的HQL语言成分要学；不过，它们容易理解而且文档做得好。HQL是一种使用来查询对象的自然语言，花很小的代价就能学习它。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 保存、更新、删除储存在数据库中的信息。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 像Hibernate这样的高级&#8220;对象－关系&#8221;映射（object-to-relational mapping）框架提供对大多数主流SQL数据库的支持，它们支持&#8220;父/子&#8221;（parent/child）关系、事务处理、继承和多态。 </p>
<p><br />
这儿是一些应该在持久层里被避免的项目： </p>
<p>&nbsp;&nbsp;&nbsp; 业务逻辑应该在你的应用的一个高一些的层次里。持久层里仅仅允许数据存取操作。 </p>
<p>&nbsp;&nbsp;&nbsp; 你不应该把持久层逻辑（persistence logic）和你的表现层逻辑（presentation logic）搅在一起。避免像JSPs或基于servlet的类这些表现层组件里的逻辑和数据存取直接通讯。通过把持久层逻辑隔离进它自己的层，应用程序变得易于修改而不会影响在其它层的代码。例如：Hebernate能够被其它持久层框架或者API代替而不会修改在其它任何层的代码。</p>
</fieldset>
<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 id="Code_Closed_Image_173818" onclick="this.style.display='none'; Code_Closed_Text_173818.style.display='none'; Code_Open_Image_173818.style.display='inline'; Code_Open_Text_173818.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_173818" style="display: none" onclick="this.style.display='none'; Code_Open_Text_173818.style.display='none'; Code_Closed_Image_173818.style.display='inline'; Code_Closed_Text_173818.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_173818" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">为什么使用Hibernate ？ </span><span id="Code_Open_Text_173818" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">1</span><span style="color: #000000">、减轻了编写Sql语句工作量<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />例&nbsp;</span><span style="color: #000000">4.1</span><span style="color: #000000">.&nbsp;传统的数据库访问代码<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />insert&nbsp;into&nbsp;table&nbsp;(field_1,field_2,field_n)&nbsp;values(</span><span style="color: #000000">'</span><span style="color: #000000">"+&nbsp;field_value1&nbsp;+"</span><span style="color: #000000">'</span><span style="color: #000000">,</span><span style="color: #000000">'</span><span style="color: #000000">"&nbsp;+&nbsp;field_value2&nbsp;+&nbsp;"</span><span style="color: #000000">'</span><span style="color: #000000">,</span><span style="color: #000000">'</span><span style="color: #000000">"&nbsp;+&nbsp;field_value3&nbsp;+&nbsp;"</span><span style="color: #000000">'"</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />例&nbsp;</span><span style="color: #000000">4.2</span><span style="color: #000000">.&nbsp;借助Hibernate后数据库访问代码<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />session.save(table_Object)&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />由代码比较可以看出，数据表可以跟对象一样被操作，这样代码显得更加简洁，可读性也增强。在实际开发中，这里是业务变动频繁的地方，保证代码的可读性和易维护，很有价值。&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">2</span><span style="color: #000000">、Hibernate封装了数据库访问、事务管理、数据缓存等工作。省去了自己去编写这些代码。&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">3</span><span style="color: #000000">、将数据表数据映射到对象中，以对象作为传输媒介，能更好的在系统各层传输数据。&nbsp;</span></span></div>
<br />
<br />
<fieldset><legend>领域模型层 （The Domain Model Layer ） </legend>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后，因为我们讨论的是一个不是很复杂的、基于web的应用程序，我们需要一组能在不同的层之间移动的对象。领域对象层由那些代表现实世界中的业务对象的对象们组成，比如：一份订单（Order）、订单项（OrderLineItem）、产品（Product）等等。这个层让开发者停止建立和维护不必要的数据传输对象（或者叫作DTOs）,来匹配他们的领域对象。例如，Hibernate允许你把数据库信息读进领域对象（domain objects）的一个对象图，这样你可以在连接断开的情况下把这些数据显示到UI层。那些对象也能被更新和送回到持久层并在数据库里更新。而且，你不必把对象转化成DTOs，因为DTOs在不同的应用层间移动，可能在转换中丢失。这个模型使得Java开发者自然地以一种面向对象的风格和对象打交道，没有附加的编码。 </fieldset> 
<img src ="http://www.blogjava.net/kiant/aggbug/227008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-09-04 16:45 <a href="http://www.blogjava.net/kiant/articles/227008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] 定制java web应用的错误页</title><link>http://www.blogjava.net/kiant/articles/226954.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Thu, 04 Sep 2008 06:54:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/226954.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/226954.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/226954.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/226954.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/226954.html</trackback:ping><description><![CDATA[原文转自：&nbsp;&nbsp;&nbsp; <a href="http://www.diybl.com/course/3_program/java/javajs/20071111/85327.html" target="_blank">http://www.diybl.com/course/3_program/java/javajs/20071111/85327.html</a><br />
<br />
<br />
<fieldset>
<p>第一步：你需要建立一个显示错误信息的jsp页面，内容如下：</p>
<p>&lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true"%&gt;<br />
&lt;%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%&gt;<br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;<br />
&lt;title&gt;系统执行发生错误&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;div&gt;系统执行发生错误，信息描述如下：&lt;/div&gt;<br />
&lt;div&gt;错误状态代码是：${pageContext.errorData.statusCode}&lt;/div&gt;<br />
&lt;div&gt;错误发生页面是：${pageContext.errorData.requestURI}&lt;/div&gt;<br />
&lt;div&gt;错误信息：${pageContext.exception}&lt;/div&gt;<br />
&lt;div&gt;<br />
错误堆栈信息：&lt;br/&gt;<br />
&lt;c:forEach var="trace" items="${pageContext.exception.stackTrace}"&gt;<br />
&lt;p&gt;${trace}&lt;/p&gt;<br />
&lt;/c:forEach&gt;<br />
&lt;/div&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>当然这个只是用来显示获取错误相关的信息，里面包含了绝大多数的错误相关信息，你可以使用这些信息来定制你的错误显示。</p>
</fieldset><br />
<br />
<fieldset>
<p>第二步：配置web.xml文件，添加错误页。<br />
&lt;error-page&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;exception-type&gt;java.lang.Exception&lt;/exception-type&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;location&gt;/error.jsp&lt;/location&gt;<br />
&lt;/error-page&gt;</p>
<p>这样的配置表示如果jsp页面或者servlet发生java.lang.Exception类型（当然包含子类）的异常就会转到error.jsp页面处理。</p>
<p>&lt;error-page&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;error-code&gt;500&lt;/error-code&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;location&gt;/error.jsp&lt;/location&gt;<br />
&lt;/error-page&gt;</p>
<p>这样配置也是可以的，表示发生500错误的时候，转到error.jsp页面处理。</p>
<p>是不是很简单，你可以配置多个&lt;error-page&gt;小节，将不同类型的错误转发到不同的错误处理页面，方法已经有了，赶快配置你的个性化错误信息显示吧。<br />
</p>
</fieldset> 
<img src ="http://www.blogjava.net/kiant/aggbug/226954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-09-04 14:54 <a href="http://www.blogjava.net/kiant/articles/226954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] 关于 Log4j</title><link>http://www.blogjava.net/kiant/articles/226361.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Tue, 02 Sep 2008 06:01:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/226361.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/226361.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/226361.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/226361.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/226361.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文内容转载自：Log4j 的介绍 http://hi.baidu.com/winer_mokou/blog/item/ee088f0138c3710b7aec2c80.html一、前言：Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com...&nbsp;&nbsp;<a href='http://www.blogjava.net/kiant/articles/226361.html'>阅读全文</a><img src ="http://www.blogjava.net/kiant/aggbug/226361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-09-02 14:01 <a href="http://www.blogjava.net/kiant/articles/226361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>"JSP2.0 技术手册" 读书笔记</title><link>http://www.blogjava.net/kiant/articles/220981.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sat, 09 Aug 2008 02:12:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/220981.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/220981.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/220981.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/220981.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/220981.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 以下文字皆是我阅读《JSP2.0 技术手册》1-7 章的心得&amp;笔记，此书做为 JSP 入门参考手册，值得推荐。1、JSP 的执行过程（1）客户端发出 Request(请求)；（2）JSP 容器将&nbsp;.jsp 页面转译成 Servlet 的 .java 源码；（3）将产生的 Sevlet 源码进行编译，并加载的内存执行；（4）把结果 Response (响...&nbsp;&nbsp;<a href='http://www.blogjava.net/kiant/articles/220981.html'>阅读全文</a><img src ="http://www.blogjava.net/kiant/aggbug/220981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-08-09 10:12 <a href="http://www.blogjava.net/kiant/articles/220981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSTL &amp; EL 笔记</title><link>http://www.blogjava.net/kiant/articles/220874.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Fri, 08 Aug 2008 04:40:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/220874.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/220874.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/220874.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/220874.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/220874.html</trackback:ping><description><![CDATA[<p><br />
</p>
<fieldset><legend>1、什么是 JSTL 和 EL 表达式</legend>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSP 标准标记库（JSP Standard Tag Library，JSTL）是一个实现 Web 应用程序中常见的通用功能的定制标记库集，这些功能包括迭代和条件判断、数据管理格式化、XML 操作以及数据库访问。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EL是 JSTL 经过简化的表达式语言，它允许在不必使用功能齐全的编程语言的情况下对 JSTL 操作指定动态属性值。</p>
</fieldset>
<p>&nbsp;<br />
<br />
</p>
<fieldset><legend>2、使用 JSTL 有什么好处</legend>
<p>&nbsp;&nbsp;&nbsp; 首先，JSTL现在采用独立于JSP标记的规范来定义。因此，即使JSP规范发生改动，也可以保证JSTL标记的一致性。容易受到JSP容器变更影响的许多应用程序都将受益于JSTL规范。<br />
&nbsp;&nbsp;&nbsp; 其次，JSTL具有比核心JSP标记更强大的功能，正如您在最佳实践系列中所视， c:import不仅 可以导入其它站点的URL，而且，它还可以导入 jsp:include 标记不可用的更为复杂的内容。<br />
&nbsp;&nbsp;&nbsp; 最后，JSTL使用自己的表达式语言（expression language，EL）。JSTL EL可以相当灵活地写入JSP代码，是对核心JSP语言的有力补充。 </p>
<p>&nbsp;&nbsp;&nbsp; 在JSP2.0中，通过使用 JSTL + EL，可以开发出没有 Scriptlets 的 JSP 。这就使得 JSP 的开发非常简单,非 JAVA 程序员都能胜任。另外，通过使用 JSTL，可以使编程的代码量大大减少。</p>
</fieldset><br />
<br />
<fieldset><legend>3、学习入门</legend>
<p><a href="http://www.ibm.com/developerworks/cn/" target="_blank">developerWords中国</a>&nbsp;JSTL入门系列：<br />
&nbsp;<br />
第1部分, " <a href="http://www.ibm.com/developerworks/cn/java/j-jstl0211/index.html" target="_blank">JSTL 入门：表达式语言</a>" (2003年2月)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过将常用功能包装到定制标记库的标准集合中，JSTL 使 JSP 作者可以减少对编制脚本元素的需求，甚至可以不需要它们，并避免了相关的维护成本。<br />
<br />
第2部分, " <a href="http://www.ibm.com/developerworks/cn/java/j-jstl0318/index.html" target="_blank">JSTL 入门：探讨 core</a>" (2003年3月) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSTL core 库为一些基本功能（如，管理限定了作用域的变量和与 URL 交互等）和基本操作（如，迭代和条件化）提供了定制标记。这些标记不仅可以由页面设计人员直接利用，而且还为与其它 JSTL 库相结合从而提供更复杂的表示逻辑奠定了基础。</p>
<p>第3部分, " <a href="http://www.ibm.com/developerworks/cn/java/j-jstl0415/index.html" target="_blank">JSTL 入门：表示就是一切</a>" (2003年4月) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSTL fmt 库中的定制标记支持通过资源束对文本内容进行本地化，并支持对数字和日期的显示和解析。<br />
<br />
</p>
<p>第4部分, " <a href="http://www.ibm.com/developerworks/cn/java/j-jstl0520/index.html" target="_blank">JSTL 入门：访问SQL和XML内容</a>" (2003年5月) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果您愿意接受将业务逻辑包含到表示层的结果，这两个库中的标记都使其能够非常轻松地将XML文件和关系数据库中的内容结合到JSP页面。这两个库还展示了当集成&lt;sql:query&gt; 和&lt;c:forEach&gt;时，JSTL库如何构建和集成，以及xml 库利用&lt;c:import&gt; 操作的能力。<br />
<br />
其他：&nbsp;<a href="http://www.oreilly.com.cn/news/jsppart1.php?c=java" target="_blank">JSP 2.0: The New Deal, Part 1&nbsp;</a>&nbsp; EL 函数部分<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当&nbsp;EL 从 JSTL 规范中移到 JSP 规范中，它使用了一个如何进行函数调用的技巧。这个EL函数语法非常简单：方法名，紧接着在圆括号中有一组参数：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${fn:length(myCollection)} </p>
</fieldset><br />
<br />
<fieldset><legend>4、参考手册</legend><a href="http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html" target="_blank">JSTL API Specifications</a>&nbsp;&nbsp; <br />
JSTL英文帮助文档&nbsp; Core JSTL: Mastering the JSP&#8482; Standard Tag Library <br />
<a href="http://www.diybl.com/course/3_program/java/javaxl/20071118/86750.html" target="_blank">JSTL详解</a>&nbsp;(中文，详细的用户手册，网络上有详细的 Word版本下载)&nbsp;</fieldset><br />
&nbsp;<br />
<fieldset><legend>其他</legend>JSTL 的 IF...ELSE...<br />
<br />
&lt;c:choose&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;c:when test=""&gt;&nbsp; &nbsp; 如果<br />
&nbsp; &nbsp;&lt;/c:when&gt;<br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;&lt;c:otherwise&gt;&nbsp;&nbsp;否则<br />
&nbsp; &nbsp;&lt;/c:otherwise&gt;<br />
&lt;/c:choose&gt;</fieldset> <br />
<br />
<fieldset><legend>隐式对象</legend>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 浏览器经常将request parameter作为文本发送，然而应用程序经常需要把他们作为数字类型、布尔类型（true 或者 false）来使用。通过EL，你根本就很少需要关心缺少某些参数的值或者类型转换。
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pageContext：&nbsp;提供对页面属性的访问。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${pageContext.request.contextPath} 返回请求的上下文路径&nbsp; 等内置属性。</p>
</fieldset> 
<img src ="http://www.blogjava.net/kiant/aggbug/220874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-08-08 12:40 <a href="http://www.blogjava.net/kiant/articles/220874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC 直连 SQL2005 的一点心得</title><link>http://www.blogjava.net/kiant/articles/214637.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sun, 13 Jul 2008 15:39:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/214637.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/214637.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/214637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/214637.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/214637.html</trackback:ping><description><![CDATA[<br />
一、配置 SQL Server 2005 以允许远程连接&nbsp;&nbsp;&nbsp;&nbsp;(通过使用实例名称来运行 SQL Server 2005 )<br />
<a href="http://support.microsoft.com/kb/914277/zh-cn" target="_blank">http://support.microsoft.com/kb/914277/zh-cn</a> <br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img id="Code_Closed_Image_010749" onclick="this.style.display='none'; Code_Closed_Text_010749.style.display='none'; Code_Open_Image_010749.style.display='inline'; Code_Open_Text_010749.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" height="16" width="11" /><img id="Code_Open_Image_010749" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_010749.style.display='none'; Code_Closed_Image_010749.style.display='inline'; Code_Closed_Text_010749.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11" /><span id="Code_Closed_Text_010749" style="border: 1px solid rgb(128, 128, 128); background-color: rgb(255, 255, 255);">摘要&amp;总结</span><span id="Code_Open_Text_010749" style="display: none;"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: rgb(0, 0, 0);">在尝试从远程计算机连接到&nbsp;Microsoft&nbsp;SQL&nbsp;Server&nbsp;</span><span style="color: rgb(0, 0, 0);">2005</span><span style="color: rgb(0, 0, 0);">&nbsp;实例时，可能会接收到错误消息。在使用任何程序连接到&nbsp;SQL&nbsp;Server&nbsp;时都可能会发生此问题。例如，在使用&nbsp;SQLCMD&nbsp;实用工具连接到&nbsp;SQL&nbsp;Server&nbsp;时收到以下错误消息：<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Sqlcmd:错误:Microsoft&nbsp;SQL&nbsp;Native&nbsp;Client:建立到服务器的连接时发生错误。连接到&nbsp;SQL&nbsp;Server&nbsp;</span><span style="color: rgb(0, 0, 0);">2005</span><span style="color: rgb(0, 0, 0);">&nbsp;时，默认设置&nbsp;SQL&nbsp;Server&nbsp;不允许远程连接这个事实可能会导致失败。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />如果没有将&nbsp;SQL&nbsp;Server&nbsp;</span><span style="color: rgb(0, 0, 0);">2005</span><span style="color: rgb(0, 0, 0);">&nbsp;配置为接受远程连接，则可能会发生此问题。默认情况下，SQL&nbsp;Server&nbsp;</span><span style="color: rgb(0, 0, 0);">2005</span><span style="color: rgb(0, 0, 0);">&nbsp;Express&nbsp;Edition&nbsp;和&nbsp;SQL&nbsp;Server&nbsp;</span><span style="color: rgb(0, 0, 0);">2005</span><span style="color: rgb(0, 0, 0);">&nbsp;Developer&nbsp;Edition&nbsp;不允许远程连接。若要配置&nbsp;SQL&nbsp;Server&nbsp;</span><span style="color: rgb(0, 0, 0);">2005</span><span style="color: rgb(0, 0, 0);">&nbsp;以允许远程连接，请完成以下所有步骤：<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8226;&nbsp;在您要从远程计算机连接到的&nbsp;SQL&nbsp;Server&nbsp;实例上启用远程连接。&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#8226;&nbsp;打开&nbsp;SQL&nbsp;Server&nbsp;Browser&nbsp;服务。&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#8226;&nbsp;配置防火墙以允许与&nbsp;SQL&nbsp;Server&nbsp;和&nbsp;SQL&nbsp;Server&nbsp;Browser&nbsp;服务相关的网络通讯。&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />启用&nbsp;SQL&nbsp;Server&nbsp;Browser&nbsp;服务<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><strong>如果您是通过使用实例名称来运行&nbsp;SQL&nbsp;Server&nbsp;</strong></span><strong><span style="color: rgb(0, 0, 0);">2005</span><span style="color: rgb(0, 0, 0);">&nbsp;并且在连接字符串中没有使用特定的&nbsp;TCP</span><span style="color: rgb(0, 0, 0);">/</span></strong><span style="color: rgb(0, 0, 0);"><strong>IP&nbsp;端口号，则必须启用&nbsp;SQL&nbsp;Server&nbsp;Browser&nbsp;服务以允许远程连接。<br />
</strong><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;例如，使用<strong>&nbsp;</strong></span><strong><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">计算机名</span><span style="color: rgb(0, 0, 0);">&gt;</span></strong><span style="color: rgb(0, 0, 0);"><strong>\SQLEXPRESS&nbsp;的默认实例名称</strong>安装的&nbsp;SQL&nbsp;Server&nbsp;</span><span style="color: rgb(0, 0, 0);">2005</span><span style="color: rgb(0, 0, 0);">&nbsp;Express。不管您正在运行多少个&nbsp;SQL&nbsp;Server&nbsp;</span><span style="color: rgb(0, 0, 0);">2005</span><span style="color: rgb(0, 0, 0);">&nbsp;实例，只需要启用一次&nbsp;SQL&nbsp;Server&nbsp;Browser&nbsp;服务。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(以下是个人的服务器上的配置，打开了&nbsp;TCP</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">IP&nbsp;和&nbsp;实例名)<br />
<img alt="同时使用 TCP/IP 和 Named Pipes (命名实例?)协议" src="http://www.blogjava.net/images/blogjava_net/kiant/2008.07.13/001.jpg" border="0" height="508" width="670" /></span></span></div>
<br />
<br />
<br />
<br />
二、通过 TCP 端口直接到 SQL Server 实例 (端口默认值是 1433)<br />
为SQL Server使用非标准的端口&nbsp;&nbsp;&nbsp;&nbsp;<a href=" http://www.windbi.com/showtopic-293.aspx" target="_blank">http://www.windbi.com/showtopic-293.aspx</a><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img id="Code_Closed_Image_010657" onclick="this.style.display='none'; Code_Closed_Text_010657.style.display='none'; Code_Open_Image_010657.style.display='inline'; Code_Open_Text_010657.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" height="16" width="11" /><img id="Code_Open_Image_010657" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_010657.style.display='none'; Code_Closed_Image_010657.style.display='inline'; Code_Closed_Text_010657.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11" /><span id="Code_Closed_Text_010657" style="border: 1px solid rgb(128, 128, 128); background-color: rgb(255, 255, 255);">摘要&amp;总结</span><span id="Code_Open_Text_010657" style="display: none;"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><strong><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">、为社么要使用&nbsp;TCP</span><span style="color: rgb(0, 0, 0);">/</span></strong><span style="color: rgb(0, 0, 0);"><strong>IP&nbsp;连接</strong><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;在程序配置文件里，Data&nbsp;Source</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">（服务器的IP地址）比&nbsp;Data&nbsp;Source</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">(local)&nbsp;更有利于移植。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">、服务器端关于标准端口(</span><span style="color: rgb(0, 0, 0);">1433</span></strong><span style="color: rgb(0, 0, 0);"><strong>)的更改</strong><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;当你安装SQL&nbsp;Server时，默认实例是监听1433端口号的。安全方面容易受到攻击。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;当安装一个命名实例后，在它启动的时候默认使用的是动态决定的端口号。因此，命名实例每次启动时，都有可能监听不同的端口号。对于通过防火墙访问方式造成极大问题。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;因此，<strong>为了限制对你的SQL&nbsp;Server的访问，你需要配置SQL&nbsp;Server去监听一个特定的端口</strong>。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(怎样配置SQL&nbsp;Server去监听特定的端口，示例中使用的是&nbsp;</span><span style="color: rgb(0, 0, 0);">1433</span><span style="color: rgb(0, 0, 0);">，你可以自由选择)<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/kiant/2008.07.13/002A.jpg" border="0" height="608" width="726" /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<br />
<br />
3<strong>、使用特定端口设置时的客户端连接</strong><br />
客户端有3种方法连接到一个使用特定非标准端口号的实例。<br />
<br />
第一种方法是运行SQL Server Browser服务。<br />
第二个方法是在客户端机器上创建一个SQL Server的别名。<br />
最后一个方法是在连接字符串里通过编程来指定端口号。Data Source=SERVER2,8484;Initial Catalog=AdventureWorks<br />
<br />
(客户端协议)<br />
<img alt="客户端协议" src="http://www.blogjava.net/images/blogjava_net/kiant/2008.07.13/003.jpg" border="0" height="608" width="727" /><br />
<br />
<br />
<br />
结论<br />
正如你所看到的，在用一个特定的端口号来设置你的SQL Server实例时没有太多的工作要做。最大的问题就是确保连接字符串的编码要正确。当设置端口号的时候，要确保该端口号没有被使用。<strong>为了确保你的环境更加安全，我建议你关闭SQL Server Browser服务。这样所有的客户端在连接SQL Server的时候都要求指定端口号。<br />
</strong></span></span></div>
<br />
<br />
<br />
<br />
三、程序中使用端口连接数据库<br />
在连接到 SQL Server 数据库之前，必须首先在本地计算机或服务器上安装 SQL Server，并且必须在本地计算机上安装 JDBC 驱动程序。<br />
<a href="http://www.microsoft.com/downloads/details.aspx?familyid=C47053EB-3B64-4794-950D-81E1EC91C1BA&amp;displaylang=zh-cn" target="_blank">Microsoft SQL Server 2005 JDBC Driver 1.2 下载</a><br />
使用 JDBC 驱动程序&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://msdn.microsoft.com/zh-cn/library/ms378526.aspx" target="_blank">http://msdn.microsoft.com/zh-cn/library/ms378526.aspx</a><br />
创建连接 URL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://msdn.microsoft.com/zh-cn/library/ms378428.aspx" target="_blank">http://msdn.microsoft.com/zh-cn/library/ms378428.aspx</a><br />
myeclicse怎么与sql server 2005连接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://zhidao.baidu.com/question/55043158.html?fr=qrl&amp;test=query" target="_blank">http://zhidao.baidu.com/question/55043158.html?fr=qrl&amp;test=query</a>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img id="Code_Closed_Image_063305" onclick="this.style.display='none'; Code_Closed_Text_063305.style.display='none'; Code_Open_Image_063305.style.display='inline'; Code_Open_Text_063305.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" height="16" width="11" /><img id="Code_Open_Image_063305" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_063305.style.display='none'; Code_Closed_Image_063305.style.display='inline'; Code_Closed_Text_063305.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11" /><span id="Code_Closed_Text_063305" style="border: 1px solid rgb(128, 128, 128); background-color: rgb(255, 255, 255);">摘要&amp;总结</span><span id="Code_Open_Text_063305" style="display: none;"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: rgb(0, 0, 0);"><strong>MyEclipse&nbsp;Database&nbsp;Explor&nbsp;配置</strong>&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Driver&nbsp;Template&nbsp;：在下拉框中选择数据库驱动模板。这里这里选择&nbsp;Microsoft&nbsp;SQL&nbsp;Server&nbsp;</span><span style="color: rgb(0, 0, 0);">2005</span><span style="color: rgb(0, 0, 0);">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Driver&nbsp;JARS&nbsp;:&nbsp;添加sql&nbsp;jdbc&nbsp;。点击&nbsp;Add&nbsp;JARs&nbsp;。JDBC包的sqljdbc.jar文件。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Connection&nbsp;URL:&nbsp;&nbsp;jdbc:sqlserver:</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">10.0.0.99:1433;databaseName=AdventureWorks&nbsp;</span><span style="color: rgb(0, 128, 0);"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0, 0, 0);">&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;&nbsp;&nbsp;或&nbsp;jdbc:sqlserver:</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">A9DFC026515C47B\MYSQL;databaseName=AdventureWorks&nbsp;&nbsp;(已启动SQL&nbsp;Server&nbsp;Browser服务)</span><span style="color: rgb(0, 128, 0);"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0, 0, 0);">User&nbsp;name&nbsp;和&nbsp;Password为登陆名字和密码：&nbsp;好像必须填，</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">window&nbsp;身份验证</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">无效<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><strong>VS&nbsp;</strong></span><strong><span style="color: rgb(0, 0, 0);">2005</span><span style="color: rgb(0, 0, 0);">&nbsp;和&nbsp;SQL&nbsp;</span><span style="color: rgb(0, 0, 0);">2005</span></strong><span style="color: rgb(0, 0, 0);"><strong>&nbsp;中的配置</strong><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />几乎和MyEclipse&nbsp;Database&nbsp;Explor一样，只不过是&nbsp;端口号前面的&nbsp;</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">&nbsp;变成了&nbsp;</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />服务器名称：&nbsp;&nbsp;&nbsp;</span><strong><span style="color: rgb(0, 0, 0);">10.0</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">0.99</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">1433</span></strong><span style="color: rgb(0, 0, 0);"><strong>&nbsp;</strong><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><strong>与数据库建立简单连接</strong><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />若要使用&nbsp;DriverManager&nbsp;类连接到数据库，必须首先按如下方式注册驱动程序：<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Class.forName(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">com.microsoft.sqlserver.jdbc.SQLServerDriver</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />加载驱动程序后，可通过使用连接&nbsp;URL&nbsp;来建立连接：<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String&nbsp;connectionUrl&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">jdbc:sqlserver://localhost:1433;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">databaseName=AdventureWorks;user=MyUserName;password=*****;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Connection&nbsp;con&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;DriverManager.getConnection(connectionUrl);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></span></div>
<br />
<br />
<br />
<br />
四、SQL 2005 更改sa密码<br />
<a href="http://topic.csdn.net/u/20071130/13/54df9ff6-ad1d-45a3-9d9b-da6a33714227.html" target="_blank">http://topic.csdn.net/u/20071130/13/54df9ff6-ad1d-45a3-9d9b-da6a33714227.html</a><br />
时间匆忙，没一一验证过。<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img id="Code_Closed_Image_010436" onclick="this.style.display='none'; Code_Closed_Text_010436.style.display='none'; Code_Open_Image_010436.style.display='inline'; Code_Open_Text_010436.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" height="16" width="11" /><img id="Code_Open_Image_010436" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_010436.style.display='none'; Code_Closed_Image_010436.style.display='inline'; Code_Closed_Text_010436.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11" /><span id="Code_Closed_Text_010436" style="border: 1px solid rgb(128, 128, 128); background-color: rgb(255, 255, 255);">摘要</span><span id="Code_Open_Text_010436" style="display: none;"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: rgb(0, 0, 0);">企业管理里—安全性—账号—右健属性(最好取消密码策略这项)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />sp_password&nbsp;</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">OldPassword</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">NewPassword</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0, 0, 255);">alter</span><span style="color: rgb(0, 0, 0);">&nbsp;login&nbsp;</span><span style="color: rgb(255, 0, 0);">[</span><span style="color: rgb(255, 0, 0);">sa</span><span style="color: rgb(255, 0, 0);">]</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">with</span><span style="color: rgb(0, 0, 0);">&nbsp;password</span><span style="color: rgb(128, 128, 128);">=</span><span style="color: rgb(0, 0, 0);">N</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">NewPassword</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 128, 128);">--</span><span style="color: rgb(0, 128, 128);">旧密码可以不用提供</span></span></div>
<br />
 <img src ="http://www.blogjava.net/kiant/aggbug/214637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-07-13 23:39 <a href="http://www.blogjava.net/kiant/articles/214637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>