<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>hejianjie</title>
    <description></description>
    <link>http://hejianjie.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Java中 引用调用 VS 按值调用</title>
        <author>hejianjie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hejianjie.javaeye.com">hejianjie</a>&nbsp;
          链接：<a href="http://hejianjie.javaeye.com/blog/141359" style="color:red;">http://hejianjie.javaeye.com/blog/141359</a>&nbsp;
          发表时间: 2007年11月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 貌似大多数的初学者对java中函数的调用是按照&quot;引用调用&quot;还是&quot;按值调用&quot;存在一定的误区。这些调</font><font face="Arial">用方式，表述了编</font></p>
<p><font face="Arial">程语言如何管理向函数(function)或方法传入的参数，归根到底，是要理解java如何管</font><font face="Arial">理参数的传递。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 按值调用意味着被调用的函数在幕后对参数进行了拷贝，函数中的代码操作的是这个拷贝，意味着对</font><font face="Arial">参数进行的任何改</font></p>
<p><font face="Arial">动，都会在函数执行完毕后被丢弃掉，原因是你所做的改动只作用于局部的拷贝，而非</font><font face="Arial">传入的参数，参数的拷贝只在方法范围</font></p>
<p><font face="Arial">内有效，当超出方法的执行范围后，那局部的拷贝的作用域也只限</font><font face="Arial">于方法的范围内。</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <font face="Arial">&nbsp;按引用调用意味着函数操作的和传入的参数，在物理上是相同的，由于两个引用指向的是堆中的同一</font><font face="Arial">个对象，对参数任</font></p>
<p><font face="Arial">何改动都会被保存下来。</font></p>
<p><font face="Arial"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;需要说明的是java中对基本类型的操作是按值调用的方式进行的，而对引用类型的操作是按照引用调</font></p>
<p><font face="Arial">用的方式进行的，下面的代码显示了java中对基本类型的按值调用的方式的处理结果。</font></p>
<div class="code_title">java 代码</div>
<font face="Arial">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;cn.com.two; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;TestCallByValue&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;count=</span><span class="number">1</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;increment(count); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;count==&quot;</span><span>+count); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;increment(</span><span class="keyword">int</span><span>&nbsp;count){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count++; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>执行结果：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>count==</span><span class="number">1</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在这里increment方法改变了count的值，这个改变只作用于局部的拷贝，而这个局部的拷贝在方法执行后就消失了，最</p>
<p>后count保存的还是原来的值。</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;下面再来看看引用调用的方式，先回顾一下，引用是一个指针，---指向的是内存中的一个地址，而该方法中参数只是创</p>
<p>建了一个新的指针指向同样的内存位置，如果你在调用的方法的内部，将一个新的内存地址(也就是一个不同的对象)赋值给这个</p>
<p>引用，新的地址在方法执行完后同样会被丢弃。对引用方法的调用导致该引用所指向的对象的状态的永久性的改变。</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;cn.com.two; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;TestCallByReferences&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;args </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Customer&nbsp;customer=</span><span class="keyword">new</span><span>&nbsp;Customer(</span><span class="number">1</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Customer&nbsp;customer_2=increment(customer); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;Customer&nbsp;id==&quot;</span><span>+customer.getId()); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;Customer_2&nbsp;id=&quot;</span><span>+customer_2.getId()); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;Customer&nbsp;increment(Customer&nbsp;customer){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customer.setId(customer.getId()+</span><span class="number">1</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customer=</span><span class="keyword">new</span><span>&nbsp;Customer(</span><span class="number">22</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;customer; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">class</span><span>&nbsp;Customer{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;id; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Customer(</span><span class="keyword">int</span><span>&nbsp;id){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id=id; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getId()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;id; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setId(</span><span class="keyword">int</span><span>&nbsp;id)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id&nbsp;=&nbsp;id; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在这里创建了一个ID为1的客户，调用increment方法，传如的是一个引用，指向了堆中创建的一个Customer对象，对这</p>
<p>个引用执行的操作将直接反应在堆的对象上，接着创建了一个新的Customer对象，将它的地址赋给customer参数引用，然后</p>
<p>返回customer引用，此时它指向的是堆中ID为22的那个Customer对象，最后打印结果如下：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>Customer&nbsp;id==</span><span class="number">2</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>Customer_2&nbsp;id=</span><span class="number">22</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
</font>
          <br/>
          <span style="color:red;">
            <a href="http://hejianjie.javaeye.com/blog/141359#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 17 Nov 2007 11:58:30 +0800</pubDate>
        <link>http://hejianjie.javaeye.com/blog/141359</link>
        <guid>http://hejianjie.javaeye.com/blog/141359</guid>
      </item>
      <item>
        <title>Java反射Reflection--常用API函数的使用</title>
        <author>hejianjie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hejianjie.javaeye.com">hejianjie</a>&nbsp;
          链接：<a href="http://hejianjie.javaeye.com/blog/140726" style="color:red;">http://hejianjie.javaeye.com/blog/140726</a>&nbsp;
          发表时间: 2007年11月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
                 下面提供了java反射中常用的一些API函数的使用。<br />
  <br />
       首先看看Class，反射的核心类，所有的操作都是围绕该类来生成的，Class类十分的特殊，和其他的类一样继承与Object类，其实例用来表达java在运行时的classes和interface ，也用来表达enum、array、primitive Java types（boolean, byte, char, short, int, long, float, double）以及关键字void。当一個class被加载，或当类加载器（class loader）的defineClass()被JVM 调用，JVM 便自动的产生一個Class object实例。<br />
<br />
获得Class的途径可以有以下几种：<br />
     <br />
<font color="#ff0000">------1. 运用getClass()</font><br />
注：每个class 都有此函数<br />
String str = "abc";<br />
Class c1 = str.getClass();<br />
<br />
<font color="#ff0000">------2.运用etSuperclass()</font><br />
Class.getSuperclass();<br />
Button b = new Button();<br />
Class c1 = b.getClass();<br />
Class c2 = c1.getSuperclass();<br />
<br />
<font color="#ff0000">-----3. 运用static 方法 Class.forName()</font><br />
Class c1 = Class.forName ("java.lang.String");<br />
Class c2 = Class.forName ("java.awt.Button");<br />
Class c3 = Class.forName ("java.util.LinkedList$Entry");<br />
Class c4 = Class.forName ("I");<br />
Class c5 = Class.forName ("[I");<br />
<br />
<font color="#ff0000">------4. 运用  .class 語法</font><br />
Class c1 = String.class;<br />
Class c2 = java.awt.Button.class;<br />
Class c3 = Main.InnerClass.class;<br />
Class c4 = int.class;<br />
Class c5 = int[].class;<br />
<br />
<font color="#ff0000">-----运用 primitive wrapper classes 的TYPE 语法</font><br />
Class c1 = Boolean.TYPE;<br />
Class c2 = Byte.TYPE;<br />
Class c3 = Character.TYPE;<br />
Class c4 = Short.TYPE;<br />
Class c5 = Integer.TYPE;<br />
Class c6 = Long.TYPE;<br />
Class c7 = Float.TYPE;<br />
Class c8 = Double.TYPE;<br />
Class c9 = Void.TYPE;<br />
<br />
Java Reflection中常用的函数使用方法如下：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"> </div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">package</span><span> cn.com.reflection;  </span></span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span><span class="keyword">import</span><span> java.lang.reflect.Modifier;  </span></span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> ReflectTester2 {  </span></span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>    <span class="comment">/**</span> </span></li>
    <li class=""><span><span class="comment">     * @param args</span> </span></li>
    <li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
    <li class=""><span>    <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String[] args) {  </span></span></li>
    <li class="alt"><span>          </span></li>
    <li class=""><span>        String str=<span class="string">"hejianjie"</span><span>;  </span></span></li>
    <li class="alt"><span>        Class cls=str.getClass();  </span></li>
    <li class=""><span>          </span></li>
    <li class="alt"><span>        <span class="comment">//获取该对象所属于的包</span><span>  </span></span></li>
    <li class=""><span>        Package pack=cls.getPackage();  </span></li>
    <li class="alt"><span>        String packName=pack.getName();  </span></li>
    <li class=""><span>        System.out.println(<span class="string">"包名："</span><span>+packName);  </span></span></li>
    <li class="alt"><span>          </span></li>
    <li class=""><span>        <span class="comment">//获取对象所属类的修饰符</span><span>  </span></span></li>
    <li class="alt"><span>        <span class="keyword">int</span><span> flag=cls.getModifiers();  </span></span></li>
    <li class=""><span>        String modiferName=Modifier.toString(flag);  </span></li>
    <li class="alt"><span>        System.out.println(<span class="string">"类修饰符："</span><span>+modiferName);  </span></span></li>
    <li class=""><span>        <span class="comment">//判断是否接口</span><span>  </span></span></li>
    <li class="alt"><span>        <span class="keyword">boolean</span><span> bool=Modifier.isInterface(flag);  </span></span></li>
    <li class=""><span>        System.out.println(<span class="string">"该Class是接口乎："</span><span>+bool);  </span></span></li>
    <li class="alt"><span>          </span></li>
    <li class=""><span>        <span class="comment">//返回类的名字</span><span>  </span></span></li>
    <li class="alt"><span>        String classname=cls.getName();  </span></li>
    <li class=""><span>        System.out.println(<span class="string">"该Class所代表对象的完整的包名是："</span><span>+classname);  </span></span></li>
    <li class="alt"><span>          </span></li>
    <li class=""><span>        <span class="comment">//返回父类的Class的名字</span><span>  </span></span></li>
    <li class="alt"><span>        Class supClass=cls.getSuperclass();  </span></li>
    <li class=""><span>        String supClassName=supClass.getName();  </span></li>
    <li class="alt"><span>        System.out.println(<span class="string">"父类的Class的名称："</span><span>+supClassName);  </span></span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>        <span class="comment">//返回该Class所代表的对象实现的接口的Class的数组</span><span>  </span></span></li>
    <li class=""><span>        Class[] iterClass=cls.getInterfaces();  </span></li>
    <li class="alt"><span>        <span class="keyword">for</span><span>(</span><span class="keyword">int</span><span> i=</span><span class="number">0</span><span>;i<iterClass.length;i++){  </span></span></li>
    <li class=""><span>            Class classType=iterClass[i];  </span></li>
    <li class="alt"><span>            System.out.println(classname+<span class="string">"类所实现的接口："</span><span>+classType);  </span></span></li>
    <li class=""><span>        }  </span></li>
    <li class="alt"><span>          </span></li>
    <li class=""><span>          </span></li>
    <li class="alt"><span>    }  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>}  </span></li>
</ol>
</div>
<br />
<strong>程序运行结果如下：</strong><br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"> </div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>包名：java.lang  </span></span></li>
    <li class=""><span>类修饰符：<span class="keyword">public</span><span> </span><span class="keyword">final</span><span>  </span></span></li>
    <li class="alt"><span>该Class是接口乎：<span class="keyword">false</span><span>  </span></span></li>
    <li class=""><span>该Class所代表对象的完整的包名是：java.lang.String  </span></li>
    <li class="alt"><span>父类的Class的名称：java.lang.Object  </span></li>
    <li class=""><span>java.lang.String类所实现的接口：<span class="keyword">interface</span><span> java.io.Serializable  </span></span></li>
    <li class="alt"><span>java.lang.String类所实现的接口：<span class="keyword">interface</span><span> java.lang.Comparable  </span></span></li>
    <li class=""><span>java.lang.String类所实现的接口：<span class="keyword">interface</span><span> java.lang.CharSequence  </span></span></li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://hejianjie.javaeye.com/blog/140726#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 Nov 2007 22:23:26 +0800</pubDate>
        <link>http://hejianjie.javaeye.com/blog/140726</link>
        <guid>http://hejianjie.javaeye.com/blog/140726</guid>
      </item>
      <item>
        <title>Java反射Reflection--运行时生成instance</title>
        <author>hejianjie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hejianjie.javaeye.com">hejianjie</a>&nbsp;
          链接：<a href="http://hejianjie.javaeye.com/blog/140718" style="color:red;">http://hejianjie.javaeye.com/blog/140718</a>&nbsp;
          发表时间: 2007年11月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font face="Arial"><font face="Arial">            想生成对象的实体，在反射动态机制中有两种方法，一个针对无变量的构造方法，一个针对带参数的构造方法，，如果想调用无参数的构造函数直接调用Class类中的newInstance（），而如果想调用有参数的构造函数，则需要调用Constructor类中newInstance（）方法，首先准备一个Class[]作为Constructor的参数类型。然后调用该Class对象的getConstructor（）方法获得一个专属的Constructor的对象，最后再准备一个Object[]作为Constructor对象昂的newInstance（）方法的实参。<br />
            <font color="#ff0000">在这里需要说明的是 只有两个类拥有newInstance（）方法，分别是Class类和Constructor类，Class类中的newInstance（）方法是不带参数的，而Constructro类中的newInstance（）方法是带参数的需要提供必要的参数。<br />
<br />
             <strong><font color="#000000">下面提供的代码是构造Customer2类的三个构造函数</font></strong>
<div class="code_title"><font><font><font>java 代码</font></font></font></div>
<div class="dp-highlighter">
<ol class="dp-j" start="1"><font><font><font>
    <li class="alt"><span><span class="keyword">package</span><span> cn.com.reflection;  </span></span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span><span class="keyword">import</span><span> java.lang.reflect.Constructor;  </span></span></li>
    <li class=""><span><span class="keyword">import</span><span> java.lang.reflect.InvocationTargetException;  </span></span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span><span class="comment">/**</span> </span></li>
    <li class="alt"><span><span class="comment"> * 在反射Reflection机制中，想生成一个类的实例有两种方法</span> </span></li>
    <li class=""><span><span class="comment"> * 一个是针对无参数的构造函数 ，另一个是针对有参数的构造函数</span> </span></li>
    <li class="alt"><span><span class="comment"> * </span> </span></li>
    <li class=""><span><span class="comment"> */</span><span>  </span></span></li>
    <li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> ReflecTest3 {  </span></span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>    <span class="comment">/**</span> </span></li>
    <li class=""><span><span class="comment">     * 反射的动态性质之一： 运行期动态生成Instance</span> </span></li>
    <li class="alt"><span><span class="comment">     * @throws IllegalAccessException </span> </span></li>
    <li class=""><span><span class="comment">     * @throws InstantiationException </span> </span></li>
    <li class="alt"><span><span class="comment">     * @throws NoSuchMethodException </span> </span></li>
    <li class=""><span><span class="comment">     * @throws InvocationTargetException </span> </span></li>
    <li class="alt"><span><span class="comment">     * @throws SecurityException </span> </span></li>
    <li class=""><span><span class="comment">     * @throws IllegalArgumentException </span> </span></li>
    <li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
    <li class=""><span>    <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String[] args) </span><span class="keyword">throws</span><span> InstantiationException, IllegalAccessException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException {  </span></span></li>
    <li class="alt"><span>          </span></li>
    <li class=""><span>        Customer2 customer=<span class="keyword">new</span><span> Customer2();  </span></span></li>
    <li class="alt"><span>          </span></li>
    <li class=""><span>        Class cls=customer.getClass();  </span></li>
    <li class="alt"><span>          </span></li>
    <li class=""><span>        <span class="comment">//获得Class所代表的对象的所有类型的构造函数Constructor的数组</span><span>  </span></span></li>
    <li class="alt"><span>        Constructor ctor[]=cls.getDeclaredConstructors();  </span></li>
    <li class=""><span>          </span></li>
    <li class="alt"><span>        <span class="keyword">for</span><span>(</span><span class="keyword">int</span><span> i=</span><span class="number">0</span><span>;i</span></span></li>
    <li class=""><span>            <span class="comment">//获得对应的构造函数参数列表的Class类型的数组</span><span>  </span></span></li>
    <li class="alt"><span>            Class cx[]=ctor[i].getParameterTypes();  </span></li>
    <li class=""><span>          </span></li>
    <li class="alt"><span>            <span class="keyword">if</span><span>(cx.length==</span><span class="number">0</span><span>){  </span></span></li>
    <li class=""><span>                <span class="comment">//无参的构造函数可以通过Class实例直接调用Class类的newInstance（）方法</span><span>  </span></span></li>
    <li class="alt"><span>                Object obj=cls.newInstance();  </span></li>
    <li class=""><span>                <span class="comment">//同样也可以象以下这样构造，调用Constructor类的newInstance（）方法</span><span>  </span></span></li>
    <li class="alt"><span>                <span class="comment">//Customer2 obj=(Customer2)cls.getConstructor(cx).newInstance(new Object[]{});</span><span>  </span></span></li>
    <li class=""><span>                System.out.println(obj);  </span></li>
    <li class="alt"><span>            }<span class="keyword">else</span><span> </span><span class="keyword">if</span><span>(cx.length==</span><span class="number">2</span><span>){  </span></span></li>
    <li class=""><span>  <span class="comment">//此时只能调用Constructor类的newInstance（）方法,注意：利用反射调用的是私有private的构造方法</span><span>  </span></span></li>
    <li class="alt"><span>         Customer2 obj=(Customer2)cls.getConstructor(cx).newInstance(</span></li>
    <li class="alt"><span><span class="keyword">                                   new</span><span> Object[]{</span><span class="keyword">new</span><span> Long(</span><span class="number">123</span><span>),</span><span class="string">"hejianjie"</span><span>});  </span></span></li>
    <li class=""><span>                System.out.println(obj);  </span></li>
    <li class="alt"><span>            }<span class="keyword">else</span><span> </span><span class="keyword">if</span><span>(cx.length==</span><span class="number">3</span><span>){  </span></span></li>
    <li class="alt"><span>  <span class="comment">//此时只能调用Constructor类的newInstance（）方法,注意：利用反射调用的是公有public的构造方法</span><span></span>                                                                      Customer2 obj=(Customer2)cls.getConstructor(cx).newInstance(</span></li>
    <li class="alt"><span><span class="keyword">                            new</span><span> Object[]{</span><span class="keyword">new</span><span> Long(</span><span class="number">133</span><span>),</span><span class="string">"China-Boy"</span><span>,</span><span class="keyword">new</span><span> Integer(</span><span class="number">21</span><span>)});  </span></span></li>
    <li class=""><span>                System.out.println(obj);  </span></li>
    <li class="alt"><span>            }  </span></li>
    <li class=""><span>        }  </span></li>
    <li class="alt"><span>          </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>    }  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>}  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span><span class="keyword">class</span><span> Customer2{  </span></span></li>
    <li class=""><span>      </span></li>
    <li class="alt"><span>    <span class="keyword">private</span><span> Long id;  </span></span></li>
    <li class=""><span>      </span></li>
    <li class="alt"><span>    <span class="keyword">private</span><span> String name;  </span></span></li>
    <li class=""><span>      </span></li>
    <li class="alt"><span>    <span class="keyword">private</span><span> </span><span class="keyword">int</span><span> age;  </span></span></li>
    <li class=""><span>      </span></li>
    <li class="alt"><span>    <span class="comment">/**</span> </span></li>
    <li class=""><span><span class="comment">     * 无参数的构造函数</span> </span></li>
    <li class="alt"><span><span class="comment">     *</span> </span></li>
    <li class=""><span><span class="comment">     */</span><span>  </span></span></li>
    <li class="alt"><span>    <span class="keyword">public</span><span> Customer2(){  </span></span></li>
    <li class=""><span>          </span></li>
    <li class="alt"><span>    }  </span></li>
    <li class=""><span>      </span></li>
    <li class="alt"><span>    <span class="comment">/**</span> </span></li>
    <li class=""><span><span class="comment">     * public修饰的有参数的构造函数，3个参数</span> </span></li>
    <li class="alt"><span><span class="comment">     * @param id</span> </span></li>
    <li class=""><span><span class="comment">     * @param name</span> </span></li>
    <li class="alt"><span><span class="comment">     * @param age</span> </span></li>
    <li class=""><span><span class="comment">     */</span><span>  </span></span></li>
    <li class="alt"><span>    <span class="keyword">public</span><span> Customer2(Long id,String name,</span><span class="keyword">int</span><span> age){  </span></span></li>
    <li class=""><span>       <span class="keyword">this</span><span>.id=id;  </span></span></li>
    <li class="alt"><span>       <span class="keyword">this</span><span>.name=name;  </span></span></li>
    <li class=""><span>       <span class="keyword">this</span><span>.age=age;  </span></span></li>
    <li class="alt"><span>    }  </span></li>
    <li class=""><span>      </span></li>
    <li class="alt"><span>    <span class="comment">/**</span> </span></li>
    <li class=""><span><span class="comment">     * public修饰的构造函数,2个参数</span> </span></li>
    <li class="alt"><span><span class="comment">     * @param id</span> </span></li>
    <li class=""><span><span class="comment">     * @param name</span> </span></li>
    <li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
    <li class=""><span>    <span class="keyword">public</span><span> Customer2(Long id,String name){  </span></span></li>
    <li class="alt"><span>           <span class="keyword">this</span><span>.id=id;  </span></span></li>
    <li class=""><span>           <span class="keyword">this</span><span>.name=name;  </span></span></li>
    <li class="alt"><span>           <span class="keyword">this</span><span>.age=age;  </span></span></li>
    <li class=""><span>    }  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span>    <span class="keyword">public</span><span> </span><span class="keyword">int</span><span> getAge() {  </span></span></li>
    <li class="alt"><span>        <span class="keyword">return</span><span> age;  </span></span></li>
    <li class=""><span>    }  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>    <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setAge(</span><span class="keyword">int</span><span> age) {  </span></span></li>
    <li class=""><span>        <span class="keyword">this</span><span>.age = age;  </span></span></li>
    <li class="alt"><span>    }  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span>    <span class="keyword">public</span><span> Long getId() {  </span></span></li>
    <li class="alt"><span>        <span class="keyword">return</span><span> id;  </span></span></li>
    <li class=""><span>    }  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>    <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setId(Long id) {  </span></span></li>
    <li class=""><span>        <span class="keyword">this</span><span>.id = id;  </span></span></li>
    <li class="alt"><span>    }  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span>    <span class="keyword">public</span><span> String getName() {  </span></span></li>
    <li class="alt"><span>        <span class="keyword">return</span><span> name;  </span></span></li>
    <li class=""><span>    }  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>    <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setName(String name) {  </span></span></li>
    <li class=""><span>        <span class="keyword">this</span><span>.name = name;  </span></span></li>
    <li class="alt"><span>    }  </span></li>
    <li class=""><span>      </span></li>
    <li class="alt"><span>    <span class="keyword">public</span><span> String toString(){  </span></span></li>
    <li class=""><span>        <span class="keyword">return</span><span> (</span><span class="string">"id=="</span><span>+</span><span class="keyword">this</span><span>.getId()+</span><span class="string">"  Name=="</span><span>+</span><span class="keyword">this</span><span>.getName()+</span><span class="string">" Age:"</span><span>+</span><span class="keyword">this</span><span>.getAge());  </span></span></li>
    <li class="alt"><span>    }  </span></li>
    <li class=""><span>      </span></li>
    <li class="alt"><span>}  </span></li>
    </font></font></font></ol>
    </div>
    <br />
       程序执行结果如下：<br />
    <div class="code_title"><font><font><font>java 代码</font></font></font></div>
    <div class="dp-highlighter">
    <ol class="dp-j" start="1"><font><font><font>
        <li class="alt"><span><span>id==</span><span class="number">123</span><span>  Name==hejianjie Age:</span><span class="number">0</span><span>  </span></span></li>
        <li class=""><span>id==<span class="number">133</span><span>  Name==China-Boy Age:</span><span class="number">21</span><span>  </span></span></li>
        <li class="alt"><span>id==<span class="keyword">null</span><span>  Name==</span><span class="keyword">null</span><span> Age:</span><span class="number">0</span><span>  </span></span></li>
        </font></font></font></ol>
        </div>
        <br />
                     <strong><font color="#000000">显然，第一行是执行的两个参数的构造函数，int类型的age初始化为0，第二行执行的是带三个参数的构造函数，最后，第三行执行的是无参数的</font></strong></font></font></font><strong><font color="#000000" face="Arial"><font face="Arial">构造函数。</font></font></strong><font face="Arial"><font face="Arial"><font color="#ff0000"><strong><font color="#000000">，Long，String类型的id，name都初始化为null，而int类型的age初始化为0。</font></strong><br />
        </font></font></font>
          <br/>
          <span style="color:red;">
            <a href="http://hejianjie.javaeye.com/blog/140718#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 Nov 2007 21:44:32 +0800</pubDate>
        <link>http://hejianjie.javaeye.com/blog/140718</link>
        <guid>http://hejianjie.javaeye.com/blog/140718</guid>
      </item>
      <item>
        <title>[转载]什么是用户体验？</title>
        <author>hejianjie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hejianjie.javaeye.com">hejianjie</a>&nbsp;
          链接：<a href="http://hejianjie.javaeye.com/blog/136504" style="color:red;">http://hejianjie.javaeye.com/blog/136504</a>&nbsp;
          发表时间: 2007年10月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">用户体验， 英文叫做user experience，缩写为UE, 或者UX。</font></p>
<p><font face="Arial">当指电子商务网站的时候也被称作顾客体验（CUSTOMER EXPERIENCE). 它是指用户访问一个网站或者使用一个产品时的全部体验。他们的印象和感觉，是否成功，是否享受，是否还想再来/使用。他们能够忍受的问题，疑惑和BUG的程度</font></p>
<p><font face="Arial">附英文原文供参考：<br />
the user experience, mostly called &quot;customer experience&quot; when referring to e-commerce websites; the totality of the experience of a user when visiting a website. Their impressions and feelings. Whether they're successful. Whether they enjoy themselves. Whether they feel like coming back again. The extent to which they encounter problems, confusions, and bugs.</font></p>
<p><font face="Arial">个人理解用户体验应当是一种行为，可由用户，或指定人员站在用户立场来从事此行为。<br />
可是，现在我们公司交用户体验作为一个角色，并通常交由UI设计人员来执行，更多的像是产品交付之后的项目实施或者客户服务。<br />
由此对用户体验概念如何运用到项目的过程中间，概念更加模糊，求解！</font></p>
<p><font face="Arial">用户体验是一种纯主观的在用户使用一个产品（服务）的过程中建立起来的心理感受。因为它是纯主观的，就带有一定的不确定因素。个体差异也决定了每个用户的真实体验是无法通过其他途径来完全模拟或再现的。但是对于一个界定明确的用户群体来讲，其用户体验的共性是能够经由良好设计的实验来认识到。</font></p>
<p><font face="Arial">用户体验主要是来自用户和人机界面的交互过程。在早期的软件设计过程中，人机界面被看做仅仅是一层包裹于功能核心之外的&ldquo;包装&rdquo;而没有得到足够的重视。其结果就是对人机界面的开发是独立于功能核心的开发，而且往往是在整个开发过程的尾声部分才开始的。这种方式极大地限制了对人机交互的设计，其结果带有很大的风险性。因为在最后阶段再修改功能核心的设计代价巨大，牺牲人机交互界面便是唯一的出路。这种带有猜测性和赌博性的开发几乎是难以获得令人满意的用户体验。至于客户服务，从广义上说也是用户体验的一部分，因为它是同产品自身的设计分不开的。客户服务更多的是对人员素质的要求，而已经难以改变已经完成并投入市场的产品了。但是一个好的设计可以减少用户对客户服务的需要，从而减少公司在客户服务方面的投入，也降低由于客户服务质量引发用户流失的机率。</font></p>
<p><font face="Arial">现在流行的设计过程注重以用户为中心。用户体验的概念从开发的最早期就开始进入整个流程，并贯穿始终。其目的就是保证（1）对用户体验有正确的预估（2）认识用户的真实期望和目的（3）在功能核心还能够以低廉成本加以修改的时候对设计进行修正（4）保证功能核心同人机界面之间的协调工作，减少BUG。</font></p>
<p><font face="Arial">在具体的实施上，就包括了早期的focus group（焦点小组），contextual interview，和开发过程中的多次usability study（可用性实验），以及后期的user test（用户测试）。在设计--测试--修改这个反复循环的开发流程中，可用性实验为何时出离该循环提供了可量化的指标。</font></p>
<p><font face="Arial">我做为测试角色做User experience一年多了，大体的宏观上楼上的说得都挺对的。我想补充的就是用户体验的测试不仅仅是对设计和UI的应用，我们也可以在功能测试中去应用，就我个人体验，功能测试中用户体验测试倾向于一种基础的集成测试。就是用户需要将多个功能或者服务综合起来去运行，达到一种体验，同时也保证了在功能测试和单元测试中可能漏掉的地方。这不是简单的集成测试，因为在这种集成中一定要本着用户的角色和感受去保证质量，而用户也不是简单的个性化用户，是要通过相当多的商务调查和综合最后得出的你的产品的各个典型用户，这才算得上真正的用户体验。测试人员就是要投入到典型角色中去体验的。</font></p>
<p><font face="Arial"><br />
微软对&ldquo;用户体验&rdquo;的定义。几乎所有讲师都这么说用户体验，说一个产品用户体验是这么设计的，用户体验有什么特点，不管是硬件还是软件，只要是涉及界面、语音、文字表达、用户操作交互等，都统称为用户体验，除了用户体验没有什么界面、交互的叫法。</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://hejianjie.javaeye.com/blog/136504#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 29 Oct 2007 22:48:02 +0800</pubDate>
        <link>http://hejianjie.javaeye.com/blog/136504</link>
        <guid>http://hejianjie.javaeye.com/blog/136504</guid>
      </item>
      <item>
        <title>JAVA反射机制的学习</title>
        <author>hejianjie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hejianjie.javaeye.com">hejianjie</a>&nbsp;
          链接：<a href="http://hejianjie.javaeye.com/blog/136205" style="color:red;">http://hejianjie.javaeye.com/blog/136205</a>&nbsp;
          发表时间: 2007年10月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font face="Arial">
<p><font face="Arial">JAVA语言中的反射机制：<br />
&nbsp;&nbsp;&nbsp; 在Java 运行时 环境中，对于任意一个类，能否知道这个类有哪些属性和方法？<br />
&nbsp;&nbsp;&nbsp; 对于任意一个对象，能否调用他的方法？这些答案是肯定的，这种动态获取类的信息，以及动态调用类的方法的功能来源于JAVA的反射。从而使java具有动态语言的特性。</font></p>
<p><font face="Arial">&nbsp; <strong>JAVA反射机制主要提供了以下功能：<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.在运行时判断任意一个对象所属的类<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.在运行时构造任意一个类的对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.在运行时判断任意一个类所具有的成员变量和方法（通过反射甚至可以调用private方法）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.在运行时调用任意一个对象的方法（*****注意：前提都是在运行时，而不是在编译时）</font></p>
<p><font face="Arial">&nbsp; <strong>Java 反射相关的API简介：</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 位于java。lang。reflect包中<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --Class类：代表一个类<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --Filed类：代表类的成员变量<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;--Method类：代表类的方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;--Constructor类：代表类的构造方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;--Array类：提供了动态创建数组，以及访问数组的元素的静态方法。该类中的所有方法都是静态方法</font></p>
<p><font face="Arial"><br />
<strong>----Class类<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp; 在 java 的Object类中的申明了数个应该在所有的java类中被改写的methods：<br />
hashCode(), equals(),clone(),toString(),getClass()等，其中的getClass()返回yige<br />
Class 类型的对象。<br />
&nbsp;&nbsp;&nbsp;&nbsp; Class类十分的特殊，它和一般的类一样继承自Object，其实体用以表达java程序运行<br />
时的 class和 interface，也用来表达 enum，array，primitive，Java Types 以及关键字void<br />
，当加载一个类，或者当加载器（class loader）的defineClass（）被JVM调用，便产生一个Class<br />
对象，<br />
&nbsp;&nbsp;&nbsp;&nbsp; Class是Reflection起源，针对任何你想探勘的class（类），唯有现为他产生一个Class<br />
的对象，接下来才能经由后者唤起为数十多个的反射API。</font></p>
<p><font face="Arial"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#ff0000"> Java允许我们从多种途径为一个类class生成对应的Class对象。<br />
</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --运用 getClass（）：Object类中的方法，每个类都拥有此方法 <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; String str=&quot;abc&quot;;<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;Class cl=str.getClass();</font></p>
<p><font face="Arial"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --运用 Class。getSuperclass（）：Class类中的方法，返回该Class的父类的Class<br />
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; --运用 Class。forName（）静态方法：<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;--运用 ,Class：类名.class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;--运用primitive wrapper classes的TYPE语法： 基本类型包装类的TYPE，如：Integer.TYPE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;注意：TYPE的使用，只适合原生（基本）数据类型</font></p>
<p><font face="Arial"><strong>----运行时生成instance</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp; 想生成对象的实体，在反射动态机制中有两种方法，一个针对无变量的构造方法，一个针对带参数的<br />
构造方法，，如果想调用带参数的构造方法，就比较的麻烦，不能直接调用Class类中的newInstance（）<br />
，而是调用Constructor类中newInstance（）方法，首先准备一个Class[]作为Constructor的参数类型。<br />
然后调用该Class对象的getConstructor（）方法获得一个专属的Constructor的对象，最后再准备一个<br />
Object[]作为Constructor对象昂的newInstance（）方法的实参。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">在这里需要说明的是 只有两个类拥有newInstance（）方法，分别是Class类和Constructor类<br />
Class类中的newInstance（）方法是不带参数的，而Constructro类中的newInstance（）方法是带参数的<br />
需要提供必要的参数。</font><br />
&nbsp;&nbsp;&nbsp; 例:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class c=Class.forName(&quot;DynTest&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class[] ptype=new Class[]{double.class,int.class}；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Constructor ctor=c.getConstructor(ptypr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] obj=new Object[]{new Double(3.1415),new Integer(123)};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object object=ctor.newInstance(obj);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(object);</font></p>
<p><font face="Arial"><strong>----运行时调用Method</strong><br />
&nbsp;&nbsp;&nbsp; 这个动作首先准备一个Class[]{}作为getMethod（String name，Class[]）方法的参数类型，接下来准备一个<br />
Obeject[]放置自变量，然后调用Method对象的invoke（Object obj，Object[]）方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 注意，在这里调用</font></p>
<p><font face="Arial"><strong>----运行时调用Field内容</strong><br />
&nbsp;&nbsp;&nbsp; 变更Field不需要参数和自变量，首先调用Class的getField（）并指定field名称，获得特定的Field对象后<br />
便可以直接调用Field的 get（Object obj）和set(Object obj,Object value)方法</font></p>
<font face="Arial">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;cn.com.reflection; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.lang.reflect.Field; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.lang.reflect.InvocationTargetException; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.lang.reflect.Method; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ReflectTester&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp; </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;在这个类里面存在有copy（）方法，根据指定的方法的参数去&nbsp;构造一个新的对象的拷贝 </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;并将他返回 </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;NoSuchMethodException&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;InvocationTargetException&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IllegalAccessException&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;InstantiationException&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;SecurityException&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IllegalArgumentException&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Object&nbsp;copy(Object&nbsp;obj)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IllegalArgumentException,&nbsp;SecurityException,&nbsp;InstantiationException,&nbsp;IllegalAccessException,&nbsp;InvocationTargetException,&nbsp;NoSuchMethodException{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//获得对象的类型 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;classType=obj.getClass(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;该对象的类型是：&quot;</span><span>+classType.toString()); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//通过默认构造方法去创建一个新的对象，getConstructor的视其参数决定调用哪个构造方法 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;objectCopy=classType.getConstructor(</span><span class="keyword">new</span><span>&nbsp;Class[]{}).newInstance(</span><span class="keyword">new</span><span>&nbsp;Object[]{}); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//获得对象的所有属性 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field[]&nbsp;fields=classType.getDeclaredFields(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;i </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//获取数组中对应的属性 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field&nbsp;field=fields[i]; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fieldName=field.getName(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;stringLetter=fieldName.substring(</span><span class="number">0</span><span>,&nbsp;</span><span class="number">1</span><span>).toUpperCase(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//获得相应属性的getXXX和setXXX方法名称 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;getName=</span><span class="string">&quot;get&quot;</span><span>+stringLetter+fieldName.substring(</span><span class="number">1</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;setName=</span><span class="string">&quot;set&quot;</span><span>+stringLetter+fieldName.substring(</span><span class="number">1</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//获取相应的方法 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;getMethod=classType.getMethod(getName,&nbsp;</span><span class="keyword">new</span><span>&nbsp;Class[]{}); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;setMethod=classType.getMethod(setName,&nbsp;</span><span class="keyword">new</span><span>&nbsp;Class[]{field.getType()}); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//调用源对象的getXXX（）方法 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;value=getMethod.invoke(obj,&nbsp;</span><span class="keyword">new</span><span>&nbsp;Object[]{}); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(fieldName+</span><span class="string">&quot;&nbsp;:&quot;</span><span>+value); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//调用拷贝对象的setXXX（）方法 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setMethod.invoke(objectCopy,</span><span class="keyword">new</span><span>&nbsp;Object[]{value}); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;objectCopy; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IllegalArgumentException,&nbsp;SecurityException,&nbsp;InstantiationException,&nbsp;IllegalAccessException,&nbsp;InvocationTargetException,&nbsp;NoSuchMethodException&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Customer&nbsp;customer=</span><span class="keyword">new</span><span>&nbsp;Customer(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customer.setName(</span><span class="string">&quot;hejianjie&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customer.setId(</span><span class="keyword">new</span><span>&nbsp;Long(</span><span class="number">1234</span><span>)); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customer.setAge(</span><span class="number">19</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Customer&nbsp;customer2=</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customer2=(Customer)</span><span class="keyword">new</span><span>&nbsp;ReflectTester().copy(customer); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(customer.getName()+</span><span class="string">&quot;&nbsp;&quot;</span><span>+customer2.getAge()+</span><span class="string">&quot;&nbsp;&quot;</span><span>+customer2.getId()); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(customer); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(customer2); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">class</span><span>&nbsp;Customer{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Long&nbsp;id; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;name; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;age; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Customer(){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getAge()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;age; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setAge(</span><span class="keyword">int</span><span>&nbsp;age)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.age&nbsp;=&nbsp;age; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Long&nbsp;getId()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;id; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setId(Long&nbsp;id)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id&nbsp;=&nbsp;id; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getName()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;name; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setName(String&nbsp;name)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.name&nbsp;=&nbsp;name; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><br />
</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;cn.com.reflection; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.lang.reflect.Array; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ArrayTester1&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;此类根据反射来创建 </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;一个动态的数组&nbsp; </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;ClassNotFoundException&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;classType=Class.forName(</span><span class="string">&quot;java.lang.String&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;array=&nbsp;Array.newInstance(classType,</span><span class="number">10</span><span>);&nbsp;&nbsp;</span><span class="comment">//指定数组的类型和大小 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//对索引为5的位置进行赋值 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Array.set(array,&nbsp;</span><span class="number">5</span><span>,&nbsp;</span><span class="string">&quot;hello&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s=(String)Array.get(array,&nbsp;</span><span class="number">5</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(s); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//循环遍历这个动态数组 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;i&lt;((String[])array).length;i++){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str=(String)Array.get(array,&nbsp;i); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
</font></font>
          <br/>
          <span style="color:red;">
            <a href="http://hejianjie.javaeye.com/blog/136205#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 29 Oct 2007 00:14:49 +0800</pubDate>
        <link>http://hejianjie.javaeye.com/blog/136205</link>
        <guid>http://hejianjie.javaeye.com/blog/136205</guid>
      </item>
      <item>
        <title>MySQL存储过程学习（一）</title>
        <author>hejianjie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hejianjie.javaeye.com">hejianjie</a>&nbsp;
          链接：<a href="http://hejianjie.javaeye.com/blog/136203" style="color:red;">http://hejianjie.javaeye.com/blog/136203</a>&nbsp;
          发表时间: 2007年10月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">1. 创建实例数据库<br />
&nbsp;&nbsp; create database db5;<br />
&nbsp;&nbsp; use db5;</font></p>
<p><font face="Arial">2.创建一个简单的工作表,并插入数据<br />
&nbsp;&nbsp; create table t(s1 int);<br />
&nbsp;&nbsp; insert into t values(5);</font></p>
<p><font face="Arial">3.创建程序实例 create procedure Example<br />
&nbsp;&nbsp; create procedure p1() select * from t;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL语句存储过程的第一部分是 create procedure<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二部分是过程名：上面新存储过程的名字是p1。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第三部分书参数列表（），第四部分是程序的主体，&ldquo;select * from t&rdquo;</font></p>
<p><font face="Arial">*****什么样的MySQL语句在存储过程体中是合法的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在存储过程体中可以包含所有的合法SQL数据库定义语言，insert，update,delete,drop,create,replace等等语句<br />
包括（set，commit，rollback）但是，在代码中如果包含MYSQL的扩充功能，那么代码将不能移植。<br />
&nbsp;&nbsp;&nbsp; <br />
4. 调用存储过程，所需要输入的就是call和你过程名以及一个括号。<br />
&nbsp;&nbsp;&nbsp; call p1(); </font></p>
<p><font face="Arial">5.过程中的特征子句<br />
&nbsp;&nbsp;&nbsp; create procedure p2()language SQL <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; NOT DETERMINISTIC<br />
&nbsp;&nbsp;&nbsp; SQL SECURITY DEFINER<br />
&nbsp;&nbsp;&nbsp; COMMENT ''<br />
&nbsp;&nbsp;&nbsp;&nbsp; select current_date,rand() from t;</font></p>
<p><font face="Arial">6.Parameters参数<br />
&nbsp;&nbsp;&nbsp; create procedure p5()------; //参数列表是空的<br />
&nbsp;&nbsp;&nbsp; create procedure p5([IN] name data-type)---- //输入参数in可选，默认为参数为in<br />
&nbsp;&nbsp;&nbsp; create procedure p5(out name data-type)----- //输出参数out<br />
&nbsp;&nbsp;&nbsp; create procedure p5(inout 那么data-type)----- //即可以做输入参数也可以做输出参数</font></p>
<p><font face="Arial">&nbsp;&nbsp; ----输入参数in 例子。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create procedure p5(p int) set @x=p;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call p5(12345);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select @x;</font></p>
<p><font face="Arial">&nbsp;&nbsp; ----输出参数out 例子<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create procedure p6(out p int)set p=-5;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call p6(@y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select @y;</font></p>
<p><font face="Arial">7. 复合语句:如果你的过程中有多条语句，那么你需要begin/end块。在这里你可以进行变量的定义和流程的控制<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先执行命令 delimiter //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create procedure p7()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set&nbsp; @a=6;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set&nbsp; @b=5;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert into t values (@a);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select s1 * @a from t where s1&gt;= @b;<br />
&nbsp;&nbsp;&nbsp; END;//</font></p>
<p><font face="Arial">&nbsp;&nbsp; -----在复合语句中申明变量<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create procedure p8()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECLARE a INT;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECLARE b INT;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET a=5;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET b=5;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert into t values (a);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select s1*a from t where s1&gt;=b;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;//</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 含有default默认语句舌设定语句的例子<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create procedure p9()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare a ,b int default 5;<br />
&nbsp;&nbsp; insert into t values(a);<br />
&nbsp;&nbsp; select s1*a from t where s1&gt;=b;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;//</font></p>
<p><font face="Arial">8. scope作用域的问题：内部的变量在其作用域范围内享有更高的优先权，当执行到end<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量时，内部变量消失，此时已经在其作用域外，变量不再可见了，应为在存储<br />
&nbsp;过程外再也不能找到这个申明的变量，但是你可以通过out参数或者将其值指派<br />
&nbsp;给会话变量来保存其值。<br />
&nbsp;&nbsp; create procedure p11()<br />
&nbsp;&nbsp; begin <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare x1 char(5) default 'outer';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare x1 char(5) default 'inner';<br />
&nbsp;select x1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select x1;<br />
&nbsp;&nbsp; end;//<br />
&nbsp;&nbsp; <br />
/*********************************&nbsp; 存储过程中的条件式语句&nbsp; ***************************************/</font></p>
<p><font face="Arial">1. if-then -else语句<br />
&nbsp;&nbsp;&nbsp; create procedure p12(in parameter int)<br />
&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare var int;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set var=parameter+1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if var=0 then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert into t values(17);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end if;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if parameter=0 then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; update t set s1=s1+1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; update t set s1=s1+2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end if;<br />
&nbsp;&nbsp;&nbsp; end;//</font></p>
<p><font face="Arial">2. case指令：如果需要进行更多条件真假的判断我们可以使用case语句<br />
&nbsp;&nbsp; create procedure p13(in parameter int)<br />
&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare var int;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set var=parameter+1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case var<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; when 0 then insert into t values(17);<br />
&nbsp; when 1 then insert into t values(18);<br />
&nbsp; else insert into t values(19);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end case;<br />
&nbsp;&nbsp;&nbsp; end;//</font></p>
<p><font face="Arial">/*****************************&nbsp; 循环语句&nbsp; ************************************/<br />
1. while &middot;&middot;&middot;&middot; end while; 循环语句<br />
&nbsp; create procedure p14()<br />
&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp; declare var int;<br />
&nbsp;&nbsp;&nbsp;&nbsp; set var=0;<br />
&nbsp;&nbsp;&nbsp;&nbsp; while var&lt;6 do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert into t values(var);<br />
&nbsp;set var=var+1;<br />
&nbsp;&nbsp;&nbsp;&nbsp; end while;<br />
&nbsp;&nbsp; end;//</font></p>
<p><font face="Arial">2. repeat&middot;&middot;&middot;&middot; end repeat ；它在执行操作后检查结果，而while则是执行前进行检查<br />
&nbsp; create procedure p15()<br />
&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp; declare v int;<br />
&nbsp;&nbsp;&nbsp;&nbsp; set v=0;<br />
&nbsp;&nbsp;&nbsp;&nbsp; repeat<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert into t values(v);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set v=v+1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; until v&gt;=5<br />
&nbsp;&nbsp;&nbsp;&nbsp; end repeat;<br />
&nbsp;&nbsp; end;//</font></p>
<p><font face="Arial">3. loop &middot;&middot;&middot;&middot;&middot;end loop; loop 循环不需要初始条件，这点和while 循环相似，同时和repeat<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 循环一样不需要结束条件, leave语句的意义是离开循环，<br />
&nbsp; create procedure p16()<br />
&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare v int;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set v=0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOOP_LABLE:loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert into t values(v);<br />
&nbsp; set v=v+1;<br />
&nbsp; if v &gt;=5 then<br />
&nbsp;&nbsp;&nbsp;&nbsp; leave LOOP_LABLE;<br />
&nbsp; end if;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end loop;<br />
&nbsp;&nbsp; end;//</font></p>
<p><font face="Arial">4. LABLES 标号：标号可以用在begin repeat while 或者loop 语句前，语句标号只能在<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 合法的语句前面使用。可以跳出循环，使运行指令达到复合语句的最后一步。</font></p>
<p><font face="Arial">/*****************************&nbsp; ITERATE迭代&nbsp; ***************************************/</font></p>
<p><font face="Arial">1. ITERATE:通过引用复合语句的标号,来从新开始复合语句<br />
&nbsp;&nbsp;&nbsp; create procedure p20()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare v int;<br />
&nbsp;set v=0;<br />
&nbsp;LOOP_LABLE:loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if v=3 then <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set v=v+1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ITERATE LOOP_LABLE;<br />
&nbsp;&nbsp; end if;<br />
&nbsp;&nbsp; insert into t values(v);<br />
&nbsp;&nbsp; set v=v+1;<br />
&nbsp;&nbsp; if v&gt;=5 then<br />
&nbsp;&nbsp;&nbsp;&nbsp; leave LOOP_LABLE;<br />
&nbsp;&nbsp; end if;<br />
&nbsp;end loop;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;//</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://hejianjie.javaeye.com/blog/136203#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 29 Oct 2007 00:10:46 +0800</pubDate>
        <link>http://hejianjie.javaeye.com/blog/136203</link>
        <guid>http://hejianjie.javaeye.com/blog/136203</guid>
      </item>
      <item>
        <title>MySQL存储过程学习（二）</title>
        <author>hejianjie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hejianjie.javaeye.com">hejianjie</a>&nbsp;
          链接：<a href="http://hejianjie.javaeye.com/blog/136202" style="color:red;">http://hejianjie.javaeye.com/blog/136202</a>&nbsp;
          发表时间: 2007年10月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p align="center"><font face="Arial">&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;<strong> <font color="#ff0000">MySQL存储过程 ERROR Handler 异常处理</font></strong><br />
&nbsp;问题样例：当insert失败时，我希望将其记录在日志文件中，</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 》》在这里需要创建一个主键表，以及一个外键表，我们使用的是Innodb ，因此外键关联检查是打开的，当我向外键表中插入<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 非主键表中的值时，动作将会失败，创建的数据表如下：<br />
&nbsp;&nbsp;&nbsp; create table t2(s1 int primary key)engine=innodb;//<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create table t3(s1 int,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key(s1),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreign key (s1) references t2(s1))engine=innodb;//<br />
&nbsp;&nbsp;&nbsp; create table error_log(error_message char(80));//</font></p>
<p><font face="Arial">1. 建立一个过程，第一个语句 <font color="#ff0000">DECLARE EXIT HANDLER</font>是用来处理异常的，意思是如果错误 1216发生，这个程序将会在错误记录表中插入一行，<br />
&nbsp;&nbsp; EXIT的意思是 当动作成功提交后推出这个复合语句。<br />
&nbsp;&nbsp;&nbsp;&nbsp; create procedure p22(parameter int)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">declare exit Handler for 1452<br />
</font>&nbsp;&nbsp;&nbsp;&nbsp; insert into error_log values(concat('Time: ',current_date,'.Foreign key reference failure for value=',parameter));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert into t3 values(parameter);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;//</font></p>
<p><font face="Arial">2. 申明异常处理的语法 DECLARE HANDLER syntax：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">DECLARE {EXIT|CONTINUE} HANDLER FOR {error_number|{SQLSTATE error-string}|condition} SQL Statement</font><br />
&nbsp;&nbsp; 上面就是错误处理的用法，也就是一段当程序出错后自动触发的代码，MYSQL允许两种处理器，一种是exit处理，另外一种是 continue处理，与exit<br />
&nbsp;&nbsp; 不同的是在于他执行后，原主程序仍然继续运行，那么该复合语句就没有出口了。</font></p>
<p><font face="Arial">----continue处理的例子：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create table t4(s1 int primary key);//<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create procedure p23()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare continue handler for SQLSTATE '23000' set @x2=1;<br />
&nbsp; set @x=1;<br />
&nbsp; insert into t4 values (1);<br />
&nbsp; set @x=2;<br />
&nbsp; insert into t4 values(1);<br />
&nbsp; set @x=3;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select @x, @x2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;//<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call p23();//</font></p>
<p><font face="Arial">---- rollback（回滚事务）,定义自己的错误处理名字 declare '错误处理名' condition for SQLSTATE'23000';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create procedure p24()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare ViolationSelf condition for SQLSTATE'23000';<br />
&nbsp; DECLARE EXIT HANDLER for ViolationSelf rollback;<br />
&nbsp; start transaction;<br />
&nbsp; insert into t2 values(1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert into t2 values(1);<br />
&nbsp; commit;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;//</font></p>
<font face="Arial">
<p><br />
/********************************************&nbsp; Cursor游标&nbsp; **********************************************************/</p>
<p>游标实现功能的摘要： 声明游标， 打开游标，从游标里读取，关闭游标<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECLARE cursor-name CURSOR FOR SELECT &middot;&middot;&middot;&middot;&middot;&middot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OPEN cursor-name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FETCH cursor-name INTO variable;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLOSE cursor-name;</p>
<p>1. create procedure p25(out return_val int)<br />
&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECLARE a,b,c int;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECLARE cur_1 CURSOR for select s1 from t;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECLARE continue handler for not found set b=1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; open cur_1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set c=0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; repeat<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fetch cur_1 into a;<br />
&nbsp; until b=1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end repeat;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; close cur_1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set return_val=a;<br />
&nbsp;&nbsp;&nbsp; end;//</p>
<p>2.&nbsp;&nbsp;&nbsp; create procedure p25_1(out return_val int)<br />
&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECLARE a,b,c int;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECLARE cur_1 CURSOR for select s1 from t;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECLARE continue handler for not found set b=1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; open cur_1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set c=0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lable_1:loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fetch cur_1 into a;<br />
&nbsp; if b=1 then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; leave lable_1;<br />
&nbsp; end if;<br />
&nbsp; set c=c+1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end loop;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; close cur_1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set return_val=c;<br />
&nbsp;&nbsp;&nbsp; end;//</p>
<p>&nbsp;&nbsp;&nbsp; create procedure p34(in va int)<br />
&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete from t where s1=va;<br />
&nbsp;&nbsp;&nbsp; end;//</p>
</font>
          <br/>
          <span style="color:red;">
            <a href="http://hejianjie.javaeye.com/blog/136202#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 29 Oct 2007 00:09:15 +0800</pubDate>
        <link>http://hejianjie.javaeye.com/blog/136202</link>
        <guid>http://hejianjie.javaeye.com/blog/136202</guid>
      </item>
      <item>
        <title>SQL Select语句完整的执行顺序</title>
        <author>hejianjie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hejianjie.javaeye.com">hejianjie</a>&nbsp;
          链接：<a href="http://hejianjie.javaeye.com/blog/136200" style="color:red;">http://hejianjie.javaeye.com/blog/136200</a>&nbsp;
          发表时间: 2007年10月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">SQL Select语句完整的执行顺序：</font></p>
<p><font face="Arial">1、from子句组装来自不同数据源的数据；<br />
2、where子句基于指定的条件对记录行进行筛选；<br />
3、group by子句将数据划分为多个分组；<br />
4、使用聚集函数进行计算；<br />
5、使用having子句筛选分组；<br />
6、计算所有的表达式；<br />
7、使用order by对结果集进行排序</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://hejianjie.javaeye.com/blog/136200#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 29 Oct 2007 00:06:27 +0800</pubDate>
        <link>http://hejianjie.javaeye.com/blog/136200</link>
        <guid>http://hejianjie.javaeye.com/blog/136200</guid>
      </item>
      <item>
        <title>SQL Group by 学习</title>
        <author>hejianjie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hejianjie.javaeye.com">hejianjie</a>&nbsp;
          链接：<a href="http://hejianjie.javaeye.com/blog/136198" style="color:red;">http://hejianjie.javaeye.com/blog/136198</a>&nbsp;
          发表时间: 2007年10月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">&nbsp;在select 语句中可以使用group by 子句将行划分成较小的组，然后，使用聚组函数返回每一个组的汇总信息，另外，可以使用having子句限制返回的结果集。group by 子句可以将查询结果分组，并返回行的汇总信息Oracle 按照group by 子句中指定的表达式的值分组查询结果。</font></p>
<p><font face="Arial">&nbsp;&nbsp; <font color="#ff0000">在带有group by 子句的查询语句中，在select 列表中指定的列要么是group by 子句中指定的列，要么包含聚组函数</font></font></p>
<p><font face="Arial">&nbsp;&nbsp; select max(sal),job emp group by job;<br />
&nbsp;<font color="#ff0000">&nbsp; (注意max(sal),job的job并非一定要出现，但有意义)</font></font></p>
<p><font face="Arial">&nbsp;&nbsp; 查询语句的select 和group by ,having 子句是聚组函数唯一出现的地方，在where 子句中不能使用聚组函数。</font></p>
<p><font face="Arial">&nbsp; select deptno,sum(sal) from emp where sal&gt;1200 group by deptno having sum(sal)&gt;8500 order by deptno;</font></p>
<p><font face="Arial">&nbsp; <font color="#ff0000">当在gropu by 子句中使用having 子句时，查询结果中只返回满足having条件的组。在一个sql语句中可以有where子句和having子句。having 与where 子句类似，均用于设置限定条件<br />
</font>&nbsp;<br />
&nbsp; where 子句的作用是在对查询结果进行分组前，将不符合where条件的行去掉，即在<font color="#ff0000">分组之前</font>过滤数据，条件中不能包含聚组函数，使用where条件显示特定的行。<br />
&nbsp; having 子句的作用是筛选满足条件的组，即在<font color="#ff0000">分组之后</font>过滤数据，条件中经常包含聚组函数，使用having 条件显示特定的组，也可以使用多个分组标准进行分组。</font></p>
<p><font face="Arial">&nbsp; 查询每个部门的每种职位的雇员数<br />
&nbsp; select deptno,job,count(*) from emp group by deptno,job;</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://hejianjie.javaeye.com/blog/136198#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 29 Oct 2007 00:05:09 +0800</pubDate>
        <link>http://hejianjie.javaeye.com/blog/136198</link>
        <guid>http://hejianjie.javaeye.com/blog/136198</guid>
      </item>
      <item>
        <title>MySQL语句优化的原则</title>
        <author>hejianjie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hejianjie.javaeye.com">hejianjie</a>&nbsp;
          链接：<a href="http://hejianjie.javaeye.com/blog/135300" style="color:red;">http://hejianjie.javaeye.com/blog/135300</a>&nbsp;
          发表时间: 2007年10月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">1、使用索引来更快地遍历表。 <br />
缺省情况下建立的索引是非群集索引，但有时它并不是最佳的。在非群集索引下，数据在物理上随机存放在数据页上。合理的索引设计要建立在对各种查询的分析和预测上。一般来说： <br />
a.有大量重复值、且经常有范围查询（ &gt; ,&lt; ，&gt; =,&lt; =）和order by、group by发生的列，可考虑建立群集索引； <br />
b.经常同时存取多列，且每列都含有重复值可考虑建立组合索引； <br />
c.组合索引要尽量使关键查询形成索引覆盖，其前导列一定是使用最频繁的列。索引虽有助于提高性能但不是索引越多越好，恰好相反过多的索引会导致系统低效。用户在表中每加进一个索引，维护索引集合就要做相应的更新工作。 <br />
2、在海量查询时尽量少用格式转换。 <br />
3、ORDER BY和GROPU BY使用ORDER BY和GROUP BY短语，任何一种索引都有助于SELECT的性能提高。 <br />
4、任何对列的操作都将导致表扫描，它包括数据库函数、计算表达式等等，查询时要尽可能将操作移至等号右边。 <br />
5、IN、OR子句常会使用工作表，使索引失效。如果不产生大量重复值，可以考虑把子句拆开。拆开的子句中应该包含索引。 <br />
6、只要能满足你的需求，应尽可能使用更小的数据类型：例如使用MEDIUMINT代替INT </font></p>
<p><font face="Arial">7、尽量把所有的列设置为NOT NULL，如果你要保存NULL，手动去设置它，而不是把它设为默认值。 <br />
8、尽量少用VARCHAR、TEXT、BLOB类型 <br />
9、如果你的数据只有你所知的少量的几个。最好使用ENUM类型 <br />
10、正如graymice所讲的那样，建立索引。 <br />
以下是我做的一个实验，可以发现索引能极大地提高查询的效率：&nbsp; <br />
我有一个会员信息表users，里边有37365条用户记录： <br />
在不加索引的时候进行查询： <br />
sql语句A: <br />
select * from users where username like '%许%'; <br />
在Mysql-Front中的8次查询时长为：1.40,0.54,0.54,0.54,0.53,0.55,0.54 共找到960条记录 <br />
sql语句B: <br />
select * from users where username like '许%'; <br />
在Mysql-Front中的8次查询时长为：0.53,0.53,0.53,0.54,0.53,0.53,0.54,0.54 共找到836条记录 <br />
sql语句C: <br />
select * from users where username like '%许'; <br />
在Mysql-Front中的8次查询时长为：0.51,0.51,0.52,0.52,0.51,0.51,0.52,0.51 共找到7条记录 <br />
为username列添加索引: <br />
create index usernameindex on users(username(6)); <br />
再次查询： <br />
sql语句A: <br />
select * from users where username like '%许%'; <br />
在Mysql-Front中的8次查询时长为：0.35,0.34,0.34,0.35,0.34,0.34,0.35,0.34 共找到960条记录 <br />
sql语句B: <br />
select * from users where username like '许%'; <br />
在Mysql-Front中的8次查询时长为：0.06,0.07,0.07,0.07,0.07,0.07,0.06,0.06 共找到836条记录 <br />
sql语句C: <br />
select * from users where username like '%许'; <br />
在Mysql-Front中的8次查询时长为：0.32,0.31,0.31,0.32,0.31,0.32,0.31,0.31 共找到7条记录 </font></p>
<p><font face="Arial">在实验过程中，我没有另开任何程序，以上的数据说明在单表查询中，建立索引的可以极大地提高查询速度。 <br />
另外要说的是如果建立了索引，对于like '许%'类型的查询，速度提升是最明显的。因此，我们在写sql语句的时候也尽量采用这种方式查询。 <br />
对于多表查询我们的优化原则是： <br />
尽量将索引建立在：left join on/right join on ...　＋条件，的条件语句中所涉及的字段上。 <br />
多表查询比单表查询更能体现索引的优势。 </font></p>
<p><font face="Arial">11、索引的建立原则： <br />
如果一列的中数据的前缀重复值很少，我们最好就只索引这个前缀。Mysql支持这种索引。我在上面用到的索引方法就是对username最左边的6个字符进行索引。索引越短，占用的 <br />
磁盘空间越少，在检索过程中花的时间也越少。这方法可以对最多左255个字符进行索引。 <br />
在很多场合，我们可以给建立多列数据建立索引。 <br />
索引应该建立在查询条件中进行比较的字段上，而不是建立在我们要找出来并且显示的字段上 <br />
12、一往情深问到的问题:IN、OR子句常会使用工作表，使索引失效。如果不产生大量重复值，可以考虑把子句拆开。拆开的子句中应该包含索引。 <br />
这句话怎么理解决，请举个例子 <br />
例子如下: <br />
如果在fields1和fields2上同时建立了索引，fields1为主索引 <br />
以下sql会用到索引 <br />
select * from tablename1 where fields1='value1' and fields2='value2' <br />
以下sql不会用到索引 <br />
select * from tablename1 where fields1='value1' or fields2='value2' <br />
13.索引带来查询上的速度的大大提升,但索引也占用了额外的硬盘空间(当然现在一般硬盘空间不成问题),而且往表中插入新记录时索引也要随着更新这也需要一定时间. <br />
有些表如果经常insert,而较少select,就不用加索引了.不然每次写入数据都要重新改写索引,花费时间; <br />
这个视实际情况而定,通常情况下索引是必需的. <br />
14.我在对查询效率有怀疑的时候,一般是直接用Mysql的Explain来跟踪查询情况. <br />
你用Mysql-Front是通过时长来比较,我觉得如果从查询时扫描字段的次数来比较更精确一些.</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://hejianjie.javaeye.com/blog/135300#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 24 Oct 2007 23:18:40 +0800</pubDate>
        <link>http://hejianjie.javaeye.com/blog/135300</link>
        <guid>http://hejianjie.javaeye.com/blog/135300</guid>
      </item>
      <item>
        <title> Java连接各种数据库 </title>
        <author>hejianjie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hejianjie.javaeye.com">hejianjie</a>&nbsp;
          链接：<a href="http://hejianjie.javaeye.com/blog/135299" style="color:red;">http://hejianjie.javaeye.com/blog/135299</a>&nbsp;
          发表时间: 2007年10月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">1、Oracle8/8i/9i数据库（thin模式）<br />
Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;).newInstance();<br />
String url=&quot;jdbc:oracle:thin:@localhost:1521:orcl&quot;;&nbsp; //orcl为数据库的SID<br />
String user=&quot;test&quot;;<br />
String password=&quot;test&quot;;<br />
Connection conn= DriverManager.getConnection(url,user,password);</font></p>
<p><font face="Arial">2、DB2数据库<br />
Class.forName(&quot;com.ibm.db2.jdbc.app.DB2Driver &quot;).newInstance();<br />
String url=&quot;jdbc:db2://localhost:5000/sample&quot;;&nbsp; //sample为你的数据库名<br />
String user=&quot;admin&quot;;<br />
String password=&quot;&quot;;<br />
Connection conn= DriverManager.getConnection(url,user,password);</font></p>
<p><font face="Arial">3、Sql Server7.0/2000数据库<br />
Class.forName(&quot;com.microsoft.jdbc.sqlserver.SQLServerDriver&quot;).newInstance();<br />
String url=&quot;jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb&quot;;&nbsp; //mydb为数据库<br />
String user=&quot;sa&quot;;<br />
String password=&quot;&quot;;<br />
Connection conn= DriverManager.getConnection(url,user,password);</font></p>
<p><font face="Arial">4、Sybase数据库<br />
Class.forName(&quot;com.sybase.jdbc.SybDriver&quot;).newInstance();<br />
String url =&quot; jdbc:sybase:Tds:localhost:5007/myDB&quot;;&nbsp; //myDB为你的数据库名<br />
Properties sysProps = System.getProperties();<br />
SysProps.put(&quot;user&quot;,&quot;userid&quot;);<br />
SysProps.put(&quot;password&quot;,&quot;user_password&quot;);<br />
Connection conn= DriverManager.getConnection(url, SysProps);</font></p>
<p><font face="Arial">5、Informix数据库<br />
Class.forName(&quot;com.informix.jdbc.IfxDriver&quot;).newInstance();<br />
String url =<br />
&quot;jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;<br />
user=testuser;password=testpassword&quot;;&nbsp; //myDB为数据库名<br />
Connection conn= DriverManager.getConnection(url);</font></p>
<p><font face="Arial">6、MySQL数据库<br />
Class.forName(&quot;org.gjt.mm.mysql.Driver&quot;).newInstance();<br />
String url =&quot;jdbc:mysql://localhost/myDB?user=soft&amp;password=soft1234&amp;useUnicode=true&amp;characterEncoding=8859_1&quot;&nbsp; //myDB为数据库名<br />
Connection conn= DriverManager.getConnection(url);</font></p>
<p><font face="Arial">7、PostgreSQL数据库<br />
Class.forName(&quot;org.postgresql.Driver&quot;).newInstance();<br />
String url =&quot;jdbc:postgresql://localhost/myDB&quot;&nbsp; //myDB为数据库名<br />
String user=&quot;myuser&quot;;<br />
String password=&quot;mypassword&quot;;<br />
Connection conn= DriverManager.getConnection(url,user,password);</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://hejianjie.javaeye.com/blog/135299#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 24 Oct 2007 23:12:51 +0800</pubDate>
        <link>http://hejianjie.javaeye.com/blog/135299</link>
        <guid>http://hejianjie.javaeye.com/blog/135299</guid>
      </item>
      <item>
        <title>Oracle学习笔记（一）</title>
        <author>hejianjie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hejianjie.javaeye.com">hejianjie</a>&nbsp;
          链接：<a href="http://hejianjie.javaeye.com/blog/132691" style="color:red;">http://hejianjie.javaeye.com/blog/132691</a>&nbsp;
          发表时间: 2007年10月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">--创建数据库表结构<br />
create table product(<br />
&nbsp;&nbsp;&nbsp;&nbsp; product_name varchar2(25),<br />
&nbsp;&nbsp;&nbsp;&nbsp; product_price number(4,2),<br />
&nbsp;&nbsp;&nbsp;&nbsp; quantity_on_hand number(5,0),<br />
&nbsp;&nbsp;&nbsp;&nbsp; last_stock_date date<br />
);</font></p>
<p><font face="Arial">--插入数据<br />
insert into product values('Small Widget',99,1,to_date('2006-6-15','yyyy-MM-DD'));<br />
insert into product values('Medium Wodget',75,1000,to_date('2005-3-25','yyyy-MM-DD'));<br />
insert into product values('Chrome-Phoobar',50,100,to_date('2005-6-6','yyyy-MM-DD'));<br />
insert into product values('Round Chrome Snaphoo',25,10000,to_date('2007-6-28','yyyy-MM-DD'));<br />
insert into product values('KFC',23,1120,to_date('2006-8-13','yyyy-MM-DD'));<br />
insert into product values('MaiDanLo',99.98,120,to_date('2007-5-4','yyyy-MM-DD'));<br />
insert into product values('HaGenDSi',45.68,1,to_date('2006-7-8','yyyy-MM-DD'));</font></p>
<p><font face="Arial">--创建数据库表结构<br />
create table purchase(<br />
&nbsp;&nbsp;&nbsp; product_name varchar2(25),<br />
&nbsp;&nbsp;&nbsp; salesperson varchar2(3),<br />
&nbsp;&nbsp;&nbsp; purchase_date date,<br />
&nbsp;&nbsp;&nbsp; quantity number(4,2)<br />
);</font></p>
<p><font face="Arial">--插入数据<br />
insert into purchase values('Small Widget','CA',to_date('2006-6-12','YYYY-MM-DD'),1);<br />
insert into purchase values('Medium Wodget','BB',to_date('2006-7-16','YYYY-MM-DD'),75);<br />
insert into purchase values('Chrome Phoobar','GA',to_date('2007-6-3','YYYY-MM-DD'),2);<br />
insert into purchase values('Small Widget','GA',to_date('2006-9-24','YYYY-MM-DD'),8);<br />
insert into purchase values('Medium Wodget','LB',to_date('2006-12-12','YYYY-MM-DD'),20);<br />
insert into purchase values('Round Chrome Snaphoo','CA',to_date('2007-4-16','YYYY-MM-DD'),5);</font></p>
<p><font face="Arial">/*********************************&nbsp; 常用的单行函数&nbsp; **********************************/</font></p>
<p><font face="Arial">--系统变量：SYSDATE,SYSTIMESTAMP,CURRENT_DATE,CURRENT_TIMESTAMP，USER<br />
-- sysdate：返回当前日期和时间<br />
&nbsp; select sysdate from emp;&nbsp; <br />
&nbsp; --可以用该变量做数据的插入操作。<br />
&nbsp;&nbsp;&nbsp;&nbsp; insert into purchase values('Small Widget','CA',sysdate,12);<br />
&nbsp; --可以通过增加或减少天数对当前的日期进行简单的操作<br />
&nbsp;&nbsp;&nbsp;&nbsp; insert into purchase values('Small Widget','CA',sysdate-30,12); <br />
--SYSTIMESTAMP ：返回数据库当前日期和时间<br />
--CURRENT_DATE：返回本地计算机当前日期和时间<br />
--CURRENT_TIMESTAMP：返回本地计算机当前日期和时间<br />
--user: 返回Oracle用户的ID<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select user from dual;</font></p>
<font face="Arial">
<p><br />
/***************************************&nbsp; 数字函数&nbsp; ***********************************/<br />
--round(input_value,decimal_places_of_pricision)函数：将数字四舍五入到指定的精确程度<br />
&nbsp;&nbsp; select product_name, round(product_price) from product;<br />
&nbsp;&nbsp; select&nbsp; round(1234.5678,4) from dual;<br />
--trunc(input_value,decimal_places_of_pricision)函数：数字截取函数，与round函数不同的是将不会进行四舍五入的操作<br />
&nbsp;&nbsp; select trunc(1234.5678,2) from dual;</p>
<p>/******************************************&nbsp; 文本函数&nbsp; *************************************/<br />
--upper()：文本的答谢转换函数<br />
&nbsp;&nbsp; select&nbsp; upper(product_name) from product;<br />
--lower()：文本的小写转换函数<br />
&nbsp;&nbsp; select&nbsp; lower(product_name) from product;<br />
--initcap()：使串中的所有单词的首字母变为大写的函数<br />
&nbsp;&nbsp; select&nbsp; initcap(product_name) from product;<br />
--length():确定串的长度<br />
&nbsp;&nbsp; select product_name,length(product_name) NAME_LENGTH from product where length(product_name)&gt;15 order by product_name;<br />
--substr(source_text,start_position,number_of_character):获取字符串的子串<br />
&nbsp;&nbsp; select substr('iloveyou',1,5) from dual;<br />
--instr():查找指定的文本，并返回该文本在串中的起始位置，通常可与substr结合使用。<br />
&nbsp;&nbsp; select substr(product_name,1,instr(product_name,'-',1)-1) First,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; substr(product_name,instr(product_name,'-',1)+1,30) Sec <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from product where product_name='Chrome-Phoobar';<br />
--Ltrim(column_name),rtirm(column_name)函数：分别是从串的开始和结尾部分删除空格<br />
&nbsp;&nbsp; select ltrim('&nbsp;&nbsp;&nbsp; china') from dual;</p>
<p>/***********************************************&nbsp; 日期处理&nbsp; ***************************************/<br />
--SYSDATE系统变量和Trunc()截取函数的使用：用sysdate操作数据时，带有系统的时间部分，用trunc()截取函数可以截取掉系统的时间部分，而只显示日期部分<br />
&nbsp;&nbsp; insert into purchase values('Small Widget','CA',trunc(sysdate),22);<br />
&nbsp;&nbsp; delete from purchase where trunc(purchase_date)=to_date('2007-10-8','YYYY-MM-DD');<br />
--add_months(start_date,number)函数：从开始日期start_date中添加或者删除相应的月份。<br />
&nbsp;&nbsp;&nbsp; select add_months(trunc(sysdate),3) from dual;<br />
--months_betweeen(date_1,date_2)函数：返回两个日期之间的月份数<br />
&nbsp;&nbsp;&nbsp; select months_between(trunc(sysdate),last_stock_date) from product;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --可以使用round()函数包围在外面<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select round(months_between(trunc(sysdate),last_stock_date)) from product;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 插看自己出生了多少个月<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select round(months_between(sysdate,to_date('1986-11-30','YYYY-MM-DD')))from dual;</p>
<p><br />
/********************************************&nbsp; 数据类型的转换&nbsp; ****************************************/<br />
--to_char(input_value，'format_code')函数：用于将日期，时间或者数字转换为文本<br />
格式化日期和时间值：<br />
&nbsp;&nbsp; select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;<br />
格式化数字值：使数字的显示方式标准化。<br />
&nbsp;&nbsp; select product_name, to_char(product_price,'$99,999.00') &quot;price&quot;, quantity_on_hand from product;<br />
--to_char()函数：日期转换函数</p>
<p>&nbsp;&nbsp; </p>
</font>
          <br/>
          <span style="color:red;">
            <a href="http://hejianjie.javaeye.com/blog/132691#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 16 Oct 2007 23:05:07 +0800</pubDate>
        <link>http://hejianjie.javaeye.com/blog/132691</link>
        <guid>http://hejianjie.javaeye.com/blog/132691</guid>
      </item>
      <item>
        <title> EJB的存根和骨架的工作原理</title>
        <author>hejianjie</