隨筆:93 文章:11 評(píng)論:22 引用:0
          首頁(yè) 發(fā)新隨筆
          發(fā)新文章 聯(lián)系 聚合管理

          java截取字符串,截串,substring和split,分割字母和數(shù)字,正則縫隙

          關(guān)鍵字: java截取字符串 截串 substring

          需求,把"01:大汽車",分成01和大汽車

          有兩種做法:一是substring

          Java代碼
          1. package test;  
          2.   
          3. public class substringTest  
          4. {  
          5.  public static void main(String args[])   
          6.  {   
          7.   String N = "01:大汽車";   
          8.   String L="";   
          9.   String R="";   
          10.   int k= N.length();   
          11.   for (int i = 0; i < N.length(); i++)   
          12.   {   
          13.    if (N.substring(i, i + 1).equals("|"))   
          14.    {     
          15.     L=N.substring(0,i).trim();   
          16.     R=N.substring(i+1,k).trim();   
          17.    }   
          18.    else   
          19.    {   
          20.                 
          21.    }   
          22.    System.out.println(L);   
          23.    System.out.println(R);   
          24.   }  
          25.  }  
          26. }   

           另外一種方法是CSDN上一位叫老六的人給我寫的

          package Test

          Java代碼
          1. public class splitTest  
          2. {  
          3.     public static void main(String[] args)  
          4.     {  
          5.         String s = new String("01:大汽車");   
          6.         String a[] = s.split(":");  
          7.       
          8.         System.out.println(a[0]);  
          9.         System.out.println(a[1]);  
          10.     }  
          11. }  

           split分割字母和數(shù)字,簡(jiǎn)單正則縫隙

          Java代碼
          1. public class Test01 {  
          2.     public static void main(String[] args) {  
          3.         String str = "one123";  
          4.         String regex = "(?<=one)(?=123)";  
          5.         String[] strs = str.split(regex);  
          6.         for(int i = 0; i < strs.length; i++) {  
          7.             System.out.printf("strs[%d] = %s%n", i, strs[i]);  
          8.         }  
          9.     }  
          10. }  

           

           

           

          substring講解:

          s=s.substring(int begin);截取掉s從首字母起長(zhǎng)度為begin的字符串,將剩余字符串賦值給s;

          s=s.substring(int begin,int end);截取s中從begin開(kāi)始至end結(jié)束時(shí)的字符串,并將其賦值給s;

          split講解:

          java.lang.string.split
          split 方法
          將一個(gè)字符串分割為子字符串,然后將結(jié)果作為字符串?dāng)?shù)組返回。
          stringObj.split([separator,[limit]])
          參數(shù)
          stringObj
          必選項(xiàng)。要被分解的 String 對(duì)象或文字。該對(duì)象不會(huì)被 split 方法修改。
          separator
          可選項(xiàng)。字符串或 正則表達(dá)式 對(duì)象,它標(biāo)識(shí)了分隔字符串時(shí)使用的是一個(gè)還是多個(gè)字符。如果忽

          略該選項(xiàng),返回包含整個(gè)字符串的單一元素?cái)?shù)組。
          limit
          可選項(xiàng)。該值用來(lái)限制返回?cái)?shù)組中的元素個(gè)數(shù)。

          說(shuō)明
          split 方法的結(jié)果是一個(gè)字符串?dāng)?shù)組,在 stingObj 中每個(gè)出現(xiàn) separator 的位置都要進(jìn)行分解

          。separator 不作為任何數(shù)組元素的部分返回。

          split 的實(shí)現(xiàn)直接調(diào)用的 matcher 類的 split 的方法。“ . ”在正則表達(dá)式中有特殊的含義,因此我們使用的時(shí)候必須進(jìn)行轉(zhuǎn)義。

          Java代碼
          1. public static void main(string[] args) {  
          2. string value = "192.168.128.33";  
          3. string[] names = value.split("\\.");  
          4. for (int i = 0; i < names.length; i++) {  
          5. system.out.println(names[i]);  
          6. }}  

           如果用豎線“|”分隔的話,將出現(xiàn)不可得到的結(jié)果,必須改為“\\|” 

          posted @ 2010-03-19 17:34 redcoatjk 閱讀(157803) | 評(píng)論 (2)編輯 收藏
           
          摘自:http://www.aygfsteel.com/ghyghost/archive/2008/06/16/208309.html
          標(biāo)題           在Java中實(shí)現(xiàn)浮點(diǎn)數(shù)的精確計(jì)算         AYellow(原作)   修改          
            關(guān)鍵字           Java   浮點(diǎn)數(shù)   精確計(jì)算        
             
             
            問(wèn)題的提出:   
            編譯運(yùn)行下面這個(gè)程序會(huì)看到什么?  
            public   class   Test{  
                    public   static   void   main(String   args[]){  
                            System.out.println(0.05+0.01);  
                            System.out.println(1.0-0.42);  
                            System.out.println(4.015*100);  
                            System.out.println(123.3/100);  
                    }  
            };  
             
            你沒(méi)有看錯(cuò)!結(jié)果確實(shí)是  
            0.060000000000000005  
            0.5800000000000001  
            401.49999999999994  
            1.2329999999999999  
             
            Java中的簡(jiǎn)單浮點(diǎn)數(shù)類型float和double不能夠進(jìn)行運(yùn)算。不光是Java,在其它很多編程語(yǔ)言中也有這樣的問(wèn)題。在大多數(shù)情況下,計(jì)算的結(jié)果是準(zhǔn)確的,但是多試幾次(可以做一個(gè)循環(huán))就可以試出類似上面的錯(cuò)誤。現(xiàn)在終于理解為什么要有BCD碼了。  
            這個(gè)問(wèn)題相當(dāng)嚴(yán)重,如果你有9.999999999999元,你的計(jì)算機(jī)是不會(huì)認(rèn)為你可以購(gòu)買10元的商品的。  
            在有的編程語(yǔ)言中提供了專門的貨幣類型來(lái)處理這種情況,但是Java沒(méi)有。現(xiàn)在讓我們看看如何解決這個(gè)問(wèn)題。  
             
               
             
            四舍五入  
            我們的第一個(gè)反應(yīng)是做四舍五入。Math類中的round方法不能設(shè)置保留幾位小數(shù),我們只能象這樣(保留兩位):  
            public   double   round(double   value){  
                    return   Math.round(value*100)/100.0;  
            }  
             
            非常不幸,上面的代碼并不能正常工作,給這個(gè)方法傳入4.015它將返回4.01而不是4.02,如我們?cè)谏厦婵吹降? 
            4.015*100=401.49999999999994  
            因此如果我們要做到精確的四舍五入,不能利用簡(jiǎn)單類型做任何運(yùn)算  
            java.text.DecimalFormat也不能解決這個(gè)問(wèn)題:  
            System.out.println(new   java.text.DecimalFormat("0.00").format(4.025));  
            輸出是4.02  
             
               
             
            BigDecimal  
            在《Effective   Java》這本書中也提到這個(gè)原則,float和double只能用來(lái)做科學(xué)計(jì)算或者是工程計(jì)算,在商業(yè)計(jì)算中我們要用 java.math.BigDecimal。BigDecimal一共有4個(gè)夠造方法,我們不關(guān)心用BigInteger來(lái)夠造的那兩個(gè),那么還有兩個(gè), 它們是:  
            BigDecimal(double   val)    
                                Translates   a   double   into   a   BigDecimal.    
            BigDecimal(String   val)    
                                Translates   the   String   repre   sentation   of   a   BigDecimal   into   a   BigDecimal.  
             
            上面的API簡(jiǎn)要描述相當(dāng)?shù)拿鞔_,而且通常情況下,上面的那一個(gè)使用起來(lái)要方便一些。我們可能想都不想就用上了,會(huì)有什么問(wèn)題呢?等到出了問(wèn)題的時(shí)候,才發(fā)現(xiàn)上面哪個(gè)夠造方法的詳細(xì)說(shuō)明中有這么一段:  
            Note:   the   results   of   this   constructor   can   be   somewhat   unpredictable.   One   might   assume   that   new   BigDecimal(.1)   is   exactly   equal   to   .1,   but   it   is   actually   equal   to   .1000000000000000055511151231257827021181583404541015625.   This   is   so   because   .1   cannot   be   represented   exactly   as   a   double   (or,   for   that   matter,   as   a   binary   fraction   of   any   finite   length).   Thus,   the   long   value   that   is   being   passed   in   to   the   constructor   is   not   exactly   equal   to   .1,   appearances   nonwithstanding.    
            The   (String)   constructor,   on   the   other   hand,   is   perfectly   predictable:   new   BigDecimal(".1")   is   exactly   equal   to   .1,   as   one   would   expect.   Therefore,   it   is   generally   recommended   that   the   (String)   constructor   be   used   in   preference   to   this   one.  
             
            原來(lái)我們?nèi)绻枰_計(jì)算,非要用String來(lái)夠造BigDecimal不可!在《Effective   Java》一書中的例子是用String來(lái)夠造BigDecimal的,但是書上卻沒(méi)有強(qiáng)調(diào)這一點(diǎn),這也許是一個(gè)小小的失誤吧。  
               
             
            解決方案  
            現(xiàn)在我們已經(jīng)可以解決這個(gè)問(wèn)題了,原則是使用BigDecimal并且一定要用String來(lái)夠造。  
            但是想像一下吧,如果我們要做一個(gè)加法運(yùn)算,需要先將兩個(gè)浮點(diǎn)數(shù)轉(zhuǎn)為String,然后夠造成BigDecimal,在其中一個(gè)上調(diào)用add方法,傳入另 一個(gè)作為參數(shù),然后把運(yùn)算的結(jié)果(BigDecimal)再轉(zhuǎn)換為浮點(diǎn)數(shù)。你能夠忍受這么煩瑣的過(guò)程嗎?下面我們提供一個(gè)工具類Arith來(lái)簡(jiǎn)化操作。它 提供以下靜態(tài)方法,包括加減乘除和四舍五入:  
            public   static   double   add(double   v1,double   v2)  
            public   static   double   sub(double   v1,double   v2)  
            public   static   double   mul(double   v1,double   v2)  
            public   static   double   div(double   v1,double   v2)  
            public   static   double   div(double   v1,double   v2,int   scale)  
            public   static   double   round(double   v,int   scale)  
             
             
             
            附錄  
             
             
            源文件Arith.java:  
             
            import   java.math.BigDecimal;  
            /**  
              *   由于Java的簡(jiǎn)單類型不能夠精確的對(duì)浮點(diǎn)數(shù)進(jìn)行運(yùn)算,這個(gè)工具類提供精  
              *   確的浮點(diǎn)數(shù)運(yùn)算,包括加減乘除和四舍五入。  
              */  
             
            public   class   Arith{  
             
                    //默認(rèn)除法運(yùn)算精度  
                    private   static   final   int   DEF_DIV_SCALE   =   10;  
             
             
                    //這個(gè)類不能實(shí)例化  
                    private   Arith(){  
                    }  
             
               
                    /**  
                      *   提供精確的加法運(yùn)算。  
                      *   @param   v1   被加數(shù)  
                      *   @param   v2   加數(shù)  
                      *   @return   兩個(gè)參數(shù)的和  
                      */  
             
                    public   static   double   add(double   v1,double   v2){  
                            BigDecimal   b1   =   new   BigDecimal(Double.toString(v1));  
                            BigDecimal   b2   =   new   BigDecimal(Double.toString(v2));  
                            return   b1.add(b2).doubleValue();  
                    }  
             
                    /**  
                      *   提供精確的減法運(yùn)算。  
                      *   @param   v1   被減數(shù)  
                      *   @param   v2   減數(shù)  
                      *   @return   兩個(gè)參數(shù)的差  
                      */  
             
                    public   static   double   sub(double   v1,double   v2){  
                            BigDecimal   b1   =   new   BigDecimal(Double.toString(v1));  
                            BigDecimal   b2   =   new   BigDecimal(Double.toString(v2));  
                            return   b1.subtract(b2).doubleValue();  
                    }    
             
                    /**  
                      *   提供精確的乘法運(yùn)算。  
                      *   @param   v1   被乘數(shù)  
                      *   @param   v2   乘數(shù)  
                      *   @return   兩個(gè)參數(shù)的積  
                      */  
             
                    public   static   double   mul(double   v1,double   v2){  
                            BigDecimal   b1   =   new   BigDecimal(Double.toString(v1));  
                            BigDecimal   b2   =   new   BigDecimal(Double.toString(v2));  
                            return   b1.multiply(b2).doubleValue();  
                    }  
             
               
             
                    /**  
                      *   提供(相對(duì))精確的除法運(yùn)算,當(dāng)發(fā)生除不盡的情況時(shí),精確到  
                      *   小數(shù)點(diǎn)以后10位,以后的數(shù)字四舍五入。  
                      *   @param   v1   被除數(shù)  
                      *   @param   v2   除數(shù)  
                      *   @return   兩個(gè)參數(shù)的商  
                      */  
             
                    public   static   double   div(double   v1,double   v2){  
                            return   div(v1,v2,DEF_DIV_SCALE);  
                    }  
             
               
             
                    /**  
                      *   提供(相對(duì))精確的除法運(yùn)算。當(dāng)發(fā)生除不盡的情況時(shí),由scale參數(shù)指  
                      *   定精度,以后的數(shù)字四舍五入。  
                      *   @param   v1   被除數(shù)  
                      *   @param   v2   除數(shù)  
                      *   @param   scale   表示表示需要精確到小數(shù)點(diǎn)以后幾位。  
                      *   @return   兩個(gè)參數(shù)的商  
                      */  
             
                    public   static   double   div(double   v1,double   v2,int   scale){  
                            if(scale<0){  
                                    throw   new   IllegalArgumentException(  
                                            "The   scale   must   be   a   positive   integer   or   zero");  
                            }  
                            BigDecimal   b1   =   new   BigDecimal(Double.toString(v1));  
                            BigDecimal   b2   =   new   BigDecimal(Double.toString(v2));  
                            return   b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();  
                    }  
             
               
             
                    /**  
                      *   提供精確的小數(shù)位四舍五入處理。  
                      *   @param   v   需要四舍五入的數(shù)字  
                      *   @param   scale   小數(shù)點(diǎn)后保留幾位  
                      *   @return   四舍五入后的結(jié)果  
                      */  
             
                    public   static   double   round(double   v,int   scale){  
                            if(scale<0){  
                                    throw   new   IllegalArgumentException(  
                                            "The   scale   must   be   a   positive   integer   or   zero");  
                            }  
                            BigDecimal   b   =   new   BigDecimal(Double.toString(v));  
                            BigDecimal   one   =   new   BigDecimal("1");  
                            return   b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();  
                    }  
            };  


          posted @ 2010-03-07 17:23 redcoatjk 閱讀(467) | 評(píng)論 (0)編輯 收藏
           

          0
          推薦

          要學(xué)習(xí)ANT的使用,要先了解什么是ANT。
          什么是ant呢? ant是構(gòu)建工具;那構(gòu)建是又什么意思呢?形象來(lái)說(shuō),你要把代碼從某個(gè)地方拿來(lái),編譯,再拷貝到某個(gè)地方去等等操作,當(dāng)然不僅與此,但是主要用來(lái)干這個(gè)。
          知道這些,我們還要了解為什么要用ANT,呵呵,哦對(duì),就像那位MM說(shuō)的,當(dāng)然是有好處的:
          A, 跨平臺(tái)  --因?yàn)閍nt是使用java實(shí)現(xiàn)的,所以它跨平臺(tái)
          B,使用簡(jiǎn)單--與ant的兄弟make比起來(lái)
          C, 語(yǔ)法清晰--同樣是和make相比
          D,功能強(qiáng)大--ant能做的事情很多,可能你用了很久,你仍然不知道它能有多少功能。當(dāng)你自己開(kāi)發(fā)一些ant插件的時(shí)候,你會(huì)發(fā)現(xiàn)它更多的功能。

          一,構(gòu)建ant環(huán)境
          要使用ant首先要構(gòu)建一個(gè)ant環(huán)境,步驟很簡(jiǎn)單:
          1),安裝jdk,設(shè)置JAVA_HOME ,PATH ,CLASS_PATH(這些應(yīng)該是看這篇文章的人應(yīng)該知道的)
          2),下載ant 地址http://17xx.zhmy.com找一個(gè)你喜歡的版本,或者干脆最新的版本
          3),解壓ant 你得到的是一個(gè)壓縮包,解壓縮它,并把它放在一個(gè)盡量簡(jiǎn)單的目錄,例如D:\ant-1.6雖然你不一 定要這么做,但這么做是有好處的。
          4),設(shè)置ANT_HOME PATH中添加ANT_HOME目錄下的bin目錄
          5),測(cè)試一下你的設(shè)置,開(kāi)始-->運(yùn)行-->cmd進(jìn)入命令行-->鍵入 ant 回車,如果看到
          Buildfile: build.xml does not exist!
          Build failed
          那么恭喜你你已經(jīng)完成ant的設(shè)置

          二,體驗(yàn)ant
          就像每個(gè)語(yǔ)言都有HelloWorld一樣,一個(gè)最簡(jiǎn)單的應(yīng)用能讓人感受一下Ant
          1,首先你要知道你要干什么,我現(xiàn)在想做的事情是:
          編寫一些程序
          編譯它們
          把它打包成jar包
          把他們放在應(yīng)該放置的地方
          運(yùn)行它們
          這里為了簡(jiǎn)單起見(jiàn)只寫一個(gè)程序,就是HelloWorld.java程序代碼如下:
          package test.ant;
          public class HelloWorld{
           public static void main(String[] args){
            System.out.println("Hello world1");
           }
          };
          2,為了達(dá)到上邊的目的,你可以手動(dòng)的用javac 、copy 、jar、java來(lái)完成,但是考慮一下如果你有成百上千個(gè)類,在多次調(diào)試,部署的時(shí)候,一次次的javac 、copy、jar、
          java那將是一份辛苦的工作。現(xiàn)在看看ant怎么優(yōu)雅的完成它們。
          要運(yùn)行ant需要有一個(gè)build.xml雖然不一定要叫這個(gè)名字,但是建議你這么做
          下邊就是一個(gè)完整的build.xml,然后我們來(lái)詳細(xì)的解釋每一句
          <?xml version="1.0" encoding="UTF-8" ?>
          <project name="HelloWorld" default="run" basedir=".">
           <property name="src" value="http://www.zhmy.com/src"/>
           <property name="dest" value="classes"/>
           <property name="hello_jar" value="hello1.jar"/>
           <target name="init">
            <mkdir dir="${dest}"/>
           </target>
           <target name="compile" depends="init">
            <javac srcdir="${src}" destdir="${dest}"/>
           </target>
           <target name="build" depends="compile">
            <jar jarfile="${hello_jar}" basedir="${dest}"/>
           </target>
           <target name="run" depends="build">
            <java classname="test.ant.HelloWorld" classpath="${hello_jar}"/>
           </target>
           <target name="clean">
            <delete dir="${dest}" />
            <delete file="${hello_jar}" />
           </target>
           <target name="rerun" depends="clean,run">
            <ant target="clean" />
            <ant target="run" />
           </target>
          </project>
          解釋:
          <?xml version="1.0" encoding="UTF-8" ?>
          build.xml中的第一句話,沒(méi)有實(shí)際的意義
          <project name="HelloWorld" default="run" basedir=".">
          </project>
          ant的所有內(nèi)容必須包含在這個(gè)里邊,name是你給它取的名字,basedir故名思意就是工作的根目錄 .代表當(dāng)前目錄。default代表默認(rèn)要做的事情。
          <property name="src" value="src"/>
          類似程序中的變量,為什么這么做想一下變量的作用
          <target name="compile" depends="init">
            <javac srcdir="${src}" destdir="${dest}"/>
          </target>
          把你想做的每一件事情寫成一個(gè)target ,它有一個(gè)名字,depends是它所依賴的target,在執(zhí)行這個(gè)target 例如這里的compile之前ant會(huì)先檢查init是否曾經(jīng)被執(zhí)行過(guò),如果執(zhí)行
          過(guò)則直接直接執(zhí)行compile,如果沒(méi)有則會(huì)先執(zhí)行它依賴的target例如這里的init,然后在執(zhí)行這個(gè)target
          如我們的計(jì)劃
          編譯:
          <target name="compile" depends="init">
           <javac srcdir="${src}" destdir="${dest}"/>
          </target>
          做jar包:
          <target name="build" depends="compile">
           <jar jarfile="${hello_jar}" basedir="${dest}"/>
          </target>
          運(yùn)行:
          <target name="run" depends="build">
           <java classname="test.ant.HelloWorld" classpath="${hello_jar}"/>
          </target>
          為了不用拷貝,我們可以在最開(kāi)始定義好目標(biāo)文件夾,這樣ant直接把結(jié)果就放在目標(biāo)文件夾中了
          新建文件夾:
          <target name="init">
           <mkdir dir="${dest}"/>
          </target>
          為了更多一點(diǎn)的功能體現(xiàn),又加入了兩個(gè)target
          刪除生成的文件
          <target name="clean">
           <delete dir="${dest}" />
           <delete file="${hello_jar}" />
          </target>
          再次運(yùn)行,這里顯示了如何在一個(gè)target里邊調(diào)用其他的target
          <target name="rerun" depends="clean,run">
           <ant target="clean" />
           <ant target="run" />
          </target>
          好了,解釋完成了,下邊檢驗(yàn)一下你的ant吧
          新建一個(gè)src的文件夾,然后把HelloWorld.java按照包目錄放進(jìn)去
          做好build.xml文件
          在命令行下鍵入ant ,你會(huì)發(fā)現(xiàn)一個(gè)個(gè)任務(wù)都完成了。每次更改完代碼只需要再次鍵入ant
          有的時(shí)候我們可能并不想運(yùn)行程序,只想執(zhí)行這些步驟中的某一兩個(gè)步驟,例如我只想重新部署而不想運(yùn)行,鍵入
          ant build
          ant中的每一個(gè)任務(wù)都可以這樣調(diào)用ant + target name
          好了,這樣一個(gè)簡(jiǎn)單的ant任務(wù)完成了。

          到此你應(yīng)該看出來(lái)了,ant的使用,關(guān)鍵就是build.xml的編寫,一個(gè)優(yōu)秀的build.xml可以用來(lái)做模板,甚至直接用就OK,打開(kāi)命令提示窗口,鍵入ANT即可~~
          posted @ 2010-03-06 21:20 redcoatjk 閱讀(221) | 評(píng)論 (0)編輯 收藏
           
            一、利用SQL自帶函數(shù)
          SQL Sever足夠強(qiáng)大,可以在需要的時(shí)候把大部分?jǐn)?shù)值從一種類型轉(zhuǎn)換為另一種類型。例如,要比較SMALLINT型和INT型數(shù)據(jù)的大小,你不需要進(jìn)行顯式 的類型轉(zhuǎn)換。SQL Sever會(huì)為你完成這項(xiàng)工作。但是,當(dāng)你想在字符型數(shù)據(jù)和其它類型的數(shù)據(jù)之間進(jìn)行轉(zhuǎn)換時(shí),你的確需要自己進(jìn)行轉(zhuǎn)換操作。例如,假設(shè)你想從一個(gè)MONEY 型字段中取出所有的值,并在結(jié)果后面加上字符串“US Dollars”。你需要使用函數(shù)CONVERT(),如下例所示:
          SELECT CONVERT(CHAR(8),price)+’US Dollars’ FROM orders
          函數(shù)CONVERT()帶有兩個(gè)變量。第一個(gè)變量指定了數(shù)據(jù)類型和長(zhǎng)度。第二個(gè)變量指定了要進(jìn)行轉(zhuǎn)換的字段。在這個(gè)例子中,字段price被轉(zhuǎn)換成長(zhǎng)度為8個(gè)字符的CHAR型字段。字段price要被轉(zhuǎn)換成字符型,才可以在它后面連接上字符串’US Dollars’。
          當(dāng)向BIT型,DATETIME型,INT型,或者NUMERIC型字段添加字符串時(shí),你需要進(jìn)行同樣的轉(zhuǎn)換操作。例如,下面的語(yǔ)句在一個(gè)SELECT語(yǔ)句的查詢結(jié)果中加入字符串’The vote is’,該SELECT語(yǔ)句返回一個(gè)BIT型字段的值:
          SELECT ‘The vote is’+CONVERT(CHAR(1),vote) FROM opinion
          下面是這個(gè)語(yǔ)句的結(jié)果示例:
          The vote is 1
          The vote is 1
          The vote is 0
          (3 row(s) affected)
          如果你不進(jìn)行顯式的轉(zhuǎn)換,你會(huì)收到如下的錯(cuò)誤信息:
          Implicit conversion from datatype ‘varchar’ to ‘bit’ is not allowec.
          Use the CONVERT function to run this query.
          操作字符串?dāng)?shù)據(jù)
          SQL Sever有許多函數(shù)和表達(dá)式,使你能對(duì)字符串進(jìn)行有趣的操作,包括各種各樣的模式匹配和字符轉(zhuǎn)換。在這一節(jié)中,你將學(xué)習(xí)如何使用最重要的字符函數(shù)和表達(dá)式。
          匹配通配符
          假設(shè)你想建立一個(gè)與Yahoo功能相似的Internet目錄。你可以建立一個(gè)表用來(lái)保存一系列的站點(diǎn)名稱,統(tǒng)一資源定位器(URL),描述,和類別,并允許訪問(wèn)者通過(guò)在HTML form中輸入關(guān)鍵字來(lái)檢索這些內(nèi)容。
          假如有一個(gè)訪問(wèn)者想從這個(gè)目錄中得到其描述中包含關(guān)鍵字trading card的站點(diǎn)的列表。要取出正確的站點(diǎn)列表,你也許試圖使用這樣的查詢:
          SELECT site_name FROM site_directory WHERE site_desc=’trading card’
          這個(gè)查詢可以工作。但是,它只能返回那些其描述中只有trading card這個(gè)字符串的站點(diǎn)。例如,一個(gè)描述為We have the greatest collection of trading cards in the world!的站點(diǎn)不會(huì)被返回。
          要把一個(gè)字符串與另一個(gè)字符串的一部分相匹配,你需要使用通配符。你使用通配符和關(guān)鍵字LIKE來(lái)實(shí)現(xiàn)模式匹配。下面的語(yǔ)句使用通配符和關(guān)鍵字LIKE重寫了上面的查詢,以返回所有正確站點(diǎn)的名字:
          SELECT SITE_name FROM site_directory
          WHERE site_desc LIKE ‘%trading cark%’
          在這個(gè)例子中,所有其描述中包含表達(dá)式trading card的站點(diǎn)都被返回。描述為We have the greatest collection of trading cards in the world!的站點(diǎn)也被返回。當(dāng)然,如果一個(gè)站點(diǎn)的描述中包含I am trading cardboard boxes online ,該站點(diǎn)的名字也被返回。
          注意本例中百分號(hào)的使用。百分號(hào)是通配符的例子之一。它代表0個(gè)或多個(gè)字符。通過(guò)把trading card括在百分號(hào)中,所有其中嵌有字符串trading card的字符串都被匹配。
          現(xiàn)在,假設(shè)你的站點(diǎn)目錄變得太大而不能在一頁(yè)中完全顯示。你決定把目錄分成兩部分。在第一頁(yè),你想顯示所有首字母在A到M之間的站點(diǎn)。在第二頁(yè),你想顯示所有首字母在N到Z之間的站點(diǎn)。要得到第一頁(yè)的站點(diǎn)列表,你可以使用如下的SQL語(yǔ)句:
          SELECT site_name FROM site_directory WHERE site_name LIKE ‘[A-M]%’
          在這個(gè)例子中使用了表達(dá)式[A-M],只取出那些首字母在A到M之間的站點(diǎn)。中括號(hào)([])用來(lái)匹配處在指定范圍內(nèi)的單個(gè)字符。要得到第二頁(yè)中顯示的站點(diǎn),應(yīng)使用這個(gè)語(yǔ)句:
          SELECT site_name FROM site_directory
          WHERE site_name LIKE ‘[N-Z]%’
          在這個(gè)例子中,括號(hào)中的表達(dá)式代表任何處在N到Z之間的單個(gè)字符。
          假設(shè)你的站點(diǎn)目錄變得更大了,你現(xiàn)在需要把目錄分成更多頁(yè)。如果你想顯示那些以A,B或C開(kāi)頭的站點(diǎn),你可以用下面的查詢來(lái)實(shí)現(xiàn):
          SELECT site_name FROM site_directory WHERE site_name LIKE ‘[ABC]%’
          在這個(gè)例子中,括號(hào)中的表達(dá)式不再指定一個(gè)范圍,而是給出了一些字符。任何一個(gè)其名字以這些字符中的任一個(gè)開(kāi)頭的站點(diǎn)都將被返回。
          通過(guò)在括號(hào)內(nèi)的表達(dá)式中同時(shí)包含一個(gè)范圍和一些指定的字符,你可以把這兩種方法結(jié)合起來(lái)。例如,用下面的這個(gè)查詢,你可以取出那些首字母在C到F之間,或者以字母Y開(kāi)頭的站點(diǎn):
          SELECT site_name FROM site_directory WHERE site_name LIKE ‘[C-FY]%’
          在這個(gè)例子中,名字為Collegescape和Yahoo的站點(diǎn)會(huì)被選取,而名字為Magicw3的站點(diǎn)則不會(huì)被選取。
          你也可以使用脫字符(^)來(lái)排除特定的字符。例如,要得到那些名字不以Y開(kāi)頭的站點(diǎn),你可以使用如下的查詢:
          SELECT site_name FROM site_directory WHERE site_name LIKE ‘[^Y]%’
          對(duì)給定的字符或字符范圍均可以使用脫字符。
          最后,通過(guò)使用下劃線字符(_),你可以匹配任何單個(gè)字符。例如,下面這個(gè)查詢返回每一個(gè)其名字的第二個(gè)字符為任何字母的站點(diǎn):
          SELECT site_name FROM site_directory WHERE site_name LIKE ‘M_crosoft’
          這個(gè)例子既返回名為Microsoft的站點(diǎn),也返回名為Macrosoft的站點(diǎn)。但是,名字為Moocrosoft的站點(diǎn)則不被返回。與通配符’%’不同,下劃線只代表單個(gè)字符。
          注意:
          如果你想匹配百分號(hào)或下劃線字符本身,你需要把它們括在方括號(hào)中。如果你想匹配連字符(-),應(yīng)把它指定為方括號(hào)中的第一個(gè)字符。如果你想匹配方括號(hào),應(yīng)把它們也括在方括號(hào)中。例如,下面的語(yǔ)句返回所有其描述中包含百分號(hào)的站點(diǎn):
          SELECT site_name FROM site_directory WHERE site_desc LIKE ‘%[%]%’
          匹配發(fā)音\r
          Microsoft SQL 有兩個(gè)允許你按照發(fā)音來(lái)匹配字符串的函數(shù)。函數(shù)SOUNDEX()給一個(gè)字符串分配一個(gè)音標(biāo)碼,函數(shù)DIFFERENCE()按照發(fā)音比較兩個(gè)字符串。當(dāng) 你不知道一個(gè)名字的確切拼寫,但多少知道一點(diǎn)它的發(fā)音時(shí),使用這兩個(gè)函數(shù)將有助于你取出該記錄。
          例如,如果你建立一個(gè)Internet目錄,你也許想增加一個(gè)選項(xiàng),允許訪問(wèn)者按照站點(diǎn)名的發(fā)音來(lái)搜索站點(diǎn),而不是按名字的拼寫。考慮如下的語(yǔ)句:
          SELECT site_name FROM site_directory
          WHERE DIFFERENCE(site_name , ‘Microsoft’>3
          這個(gè)語(yǔ)句使用函數(shù)DEFFERENCE()來(lái)取得其名字的發(fā)音與Microsoft非常相似的站點(diǎn)。函數(shù)DIFFERENCE()返回一個(gè)0到4之間的數(shù)字。如果該函數(shù)返回4,表示發(fā)音非常相近;如果該函數(shù)返回0,說(shuō)明這兩個(gè)字符串的發(fā)音相差很大。
          例如,上面的語(yǔ)句將返回站點(diǎn)名Microsoft和Macrosoft。這兩個(gè)名字的發(fā)音與Microsoft都很相似。如果你把上一語(yǔ)句中的大于3改為 大于2,那么名為Zicrosoft和Megasoft的站點(diǎn)也將被返回。最后,如果你只需要差別等級(jí)大于1即可,則名為Picosoft和 Minisoft的站點(diǎn)也將被匹配。
          要深入了解函數(shù)DIFFERENCE()是如何工作的,你可以用函數(shù)SOUNDEX()來(lái)返回函數(shù)DIFFERENCE()所使用的音標(biāo)碼。這里有一個(gè)例子:
          SELECT site_name ‘site name’,SOUNDEX(site_name) ‘sounds like’
          這個(gè)語(yǔ)句選取字段site_name的所有數(shù)據(jù)及其音標(biāo)碼。下面是這個(gè)查詢的結(jié)果:
          site name sounds like
          ……………………………………………………………….
          Yahoo Y000
          Mahoo M000
          Microsoft M262
          Macrosoft M262
          Minisoft M521
          Microshoft M262
          Zicrosoft Z262
          Zaposoft Z121
          Millisoft M421
          Nanosoft N521
          Megasoft M221
          Picosoft P221
          (12 row(s) affected)
          如果你仔細(xì)看一下音標(biāo)碼,你會(huì)注意到音標(biāo)碼的第一個(gè)字母與字段值的第一個(gè)字母相同。例如,Yahoo和Mahoo的音標(biāo)碼只有第一個(gè)字母不同。你還可以發(fā)現(xiàn)Microsoft和Macrosoft的音標(biāo)碼完全相同。
          函數(shù)DIFFERENDE()比較兩個(gè)字符串的第一個(gè)字母和所有的輔音字母。該函數(shù)忽略任何元音字母(包括y),除非一個(gè)元音字母是一個(gè)字符串的第一個(gè)字母。
          不幸的是,使用SOUNDEX()和DIFFERENCE()有一個(gè)欠缺。WHERE子句中包含這兩個(gè)函數(shù)的查詢執(zhí)行起來(lái)效果不好。因此,你應(yīng)該小心使用這兩個(gè)函數(shù)。
          刪除空格
          有兩個(gè)函數(shù),TTRIM()和LTRIM(),可以用來(lái)從字符串中剪掉空格。函數(shù)LTRIM()去除應(yīng)該字符串前面的所有空格;函數(shù)RTRIM()去除一個(gè)字符串尾部的所有空格。這里有一個(gè)任何使用函數(shù)RTRIM()的例子:
          SELECT RTRIM(site_name) FROM site_directory
          在這個(gè)例子中,如果任何一個(gè)站點(diǎn)的名字尾部有多余的空格,多余的空格將從查詢結(jié)果中刪去。
          你可以嵌套使用這兩個(gè)函數(shù),把一個(gè)字符串前后的空格同時(shí)刪去:
          SELECT LTRIM(RTRIM(site_name)) FROM site_directory
          你會(huì)發(fā)現(xiàn),在從CHAR型字段中剪掉多余的空格時(shí),這兩個(gè)函數(shù)非常有用。記住,如果你把一個(gè)字符串保存在CHAR型字段中,該字符串會(huì)被追加多余的空格,以匹配該字段的長(zhǎng)度。用這兩個(gè)函數(shù),你可以去掉無(wú)用的空格,從而解決這個(gè)問(wèn)題。
          刪除空格
          update zjkjt.code_subject set code = rtrim(code)
          二、利用SQL Update 語(yǔ)句刪除空格
          Update Table Set Colname=Replace(Colname," ","")
          三、利用SQL Update 語(yǔ)句刪除回車
          Update Table Set Colname=Replace(Colname,char(13),"")
          三、利用SQL Update 語(yǔ)句刪除硬回車
          Update Font Set DemoUrl=Replace(DemoUrl,'
          ','')
          注意:以上語(yǔ)句不要合關(guān)成一行,否則無(wú)法達(dá)到效果。
          posted @ 2009-11-13 16:40 redcoatjk 閱讀(1456) | 評(píng)論 (0)編輯 收藏
           

          可以從這2個(gè)表中查詢,
          user_constraints, user_cons_columns
          查詢的時(shí)候觀察下表的內(nèi)容即明白.


          posted @ 2009-11-12 10:58 redcoatjk 閱讀(164) | 評(píng)論 (0)編輯 收藏
           
          Ctrl+1 快速修復(fù)(最經(jīng)典的快捷鍵,就不用多說(shuō)了)
          Ctrl+D: 刪除當(dāng)前行
          Ctrl+Alt+↓ 復(fù)制當(dāng)前行到下一行(復(fù)制增加)
          Ctrl+Alt+↑ 復(fù)制當(dāng)前行到上一行(復(fù)制增加)
          Alt+↓ 當(dāng)前行和下面一行交互位置(特別實(shí)用,可以省去先剪切,再粘貼了)
          Alt+↑ 當(dāng)前行和上面一行交互位置(同上)
          Alt+← 前一個(gè)編輯的頁(yè)面
          Alt+→ 下一個(gè)編輯的頁(yè)面(當(dāng)然是針對(duì)上面那條來(lái)說(shuō)了)
          Alt+Enter 顯示當(dāng)前選擇資源(工程,or 文件 or文件)的屬性
          Shift+Enter 在當(dāng)前行的下一行插入空行(這時(shí)鼠標(biāo)可以在當(dāng)前行的任一位置,不一定是最后)
          Shift+Ctrl+Enter 在當(dāng)前行插入空行(原理同上條)
          Ctrl+Q 定位到最后編輯的地方
          Ctrl+L 定位在某行 (對(duì)于程序超過(guò)100的人就有福音了)
          Ctrl+M 最大化當(dāng)前的Edit或View (再按則反之)
          Ctrl+/ 注釋當(dāng)前行,再按則取消注釋
          Ctrl+O 快速顯示 OutLine
          Ctrl+T 快速顯示當(dāng)前類的繼承結(jié)構(gòu)
          Ctrl+W 關(guān)閉當(dāng)前Editer
          Ctrl+K 參照選中的Word快速定位到下一個(gè)
          Ctrl+E 快速顯示當(dāng)前Editer的下拉列表(如果當(dāng)前頁(yè)面沒(méi)有顯示的用黑體表示)
          Ctrl+/(小鍵盤) 折疊當(dāng)前類中的所有代碼
          Ctrl+×(小鍵盤) 展開(kāi)當(dāng)前類中的所有代碼
          Ctrl+Space 代碼助手完成一些代碼的插入(但一般和輸入法有沖突,可以修改輸入法的熱鍵,也可以暫用Alt+/來(lái)代替)
          Ctrl+Shift+E 顯示管理當(dāng)前打開(kāi)的所有的View的管理器(可以選擇關(guān)閉,激活等操作)
          Ctrl+J 正向增量查找(按下Ctrl+J后,你所輸入的每個(gè)字母編輯器都提供快速匹配定位到某個(gè)單詞,如果沒(méi)有,則在stutes line中顯示沒(méi)有

          找到了,查一個(gè)單詞時(shí),特別實(shí)用,這個(gè)功能Idea兩年前就有了)
          Ctrl+Shift+J 反向增量查找(和上條相同,只不過(guò)是從后往前查)
          Ctrl+Shift+F4 關(guān)閉所有打開(kāi)的Editer
          Ctrl+Shift+X 把當(dāng)前選中的文本全部變味小寫
          Ctrl+Shift+Y 把當(dāng)前選中的文本全部變?yōu)樾?br /> Ctrl+Shift+F 格式化當(dāng)前代碼
          Ctrl+Shift+P 定位到對(duì)于的匹配符(譬如{}) (從前面定位后面時(shí),光標(biāo)要在匹配符里面,后面到前面,則反之)

          下面的快捷鍵是重構(gòu)里面常用的,本人就自己喜歡且常用的整理一下(注:一般重構(gòu)的快捷鍵都是Alt+Shift開(kāi)頭的了)
          Alt+Shift+R 重命名 (是我自己最愛(ài)用的一個(gè)了,尤其是變量和類的Rename,比手工方法能節(jié)省很多勞動(dòng)力)
          Alt+Shift+M 抽取方法 (這是重構(gòu)里面最常用的方法之一了,尤其是對(duì)一大堆泥團(tuán)代碼有用)
          Alt+Shift+C 修改函數(shù)結(jié)構(gòu)(比較實(shí)用,有N個(gè)函數(shù)調(diào)用了這個(gè)方法,修改一次搞定)
          Alt+Shift+L 抽取本地變量( 可以直接把一些魔法數(shù)字和字符串抽取成一個(gè)變量,尤其是多處調(diào)用的時(shí)候)
          Alt+Shift+F 把Class中的local變量變?yōu)閒ield變量 (比較實(shí)用的功能)
          Alt+Shift+I 合并變量(可能這樣說(shuō)有點(diǎn)不妥Inline)
          Alt+Shift+V 移動(dòng)函數(shù)和變量(不怎么常用)
          Alt+Shift+Z 重構(gòu)的后悔藥(Undo)

          編輯
          作用域 功能 快捷鍵
          全局 查找并替換 Ctrl+F
          文本編輯器 查找上一個(gè) Ctrl+Shift+K
          文本編輯器 查找下一個(gè) Ctrl+K
          全局 撤銷 Ctrl+Z
          全局 復(fù)制 Ctrl+C
          全局 恢復(fù)上一個(gè)選擇 Alt+Shift+↓
          全局 剪切 Ctrl+X
          全局 快速修正 Ctrl1+1
          全局 內(nèi)容輔助 Alt+/
          全局 全部選中 Ctrl+A
          全局 刪除 Delete
          全局 上下文信息 Alt+?
          Alt+Shift+?
          Ctrl+Shift+Space
          Java編輯器 顯示工具提示描述 F2
          Java編輯器 選擇封裝元素 Alt+Shift+↑
          Java編輯器 選擇上一個(gè)元素 Alt+Shift+←
          Java編輯器 選擇下一個(gè)元素 Alt+Shift+→
          文本編輯器 增量查找 Ctrl+J
          文本編輯器 增量逆向查找 Ctrl+Shift+J
          全局 粘貼 Ctrl+V
          全局 重做 Ctrl+Y

           
          查看
          作用域 功能 快捷鍵
          全局 放大 Ctrl+=
          全局 縮小 Ctrl+-

           
          窗口
          作用域 功能 快捷鍵
          全局 激活編輯器 F12
          全局 切換編輯器 Ctrl+Shift+W
          全局 上一個(gè)編輯器 Ctrl+Shift+F6
          全局 上一個(gè)視圖 Ctrl+Shift+F7
          全局 上一個(gè)透視圖 Ctrl+Shift+F8
          全局 下一個(gè)編輯器 Ctrl+F6
          全局 下一個(gè)視圖 Ctrl+F7
          全局 下一個(gè)透視圖 Ctrl+F8
          文本編輯器 顯示標(biāo)尺上下文菜單 Ctrl+W
          全局 顯示視圖菜單 Ctrl+F10
          全局 顯示系統(tǒng)菜單 Alt+-

           
          導(dǎo)航
          作用域 功能 快捷鍵
          Java編輯器 打開(kāi)結(jié)構(gòu) Ctrl+F3
          全局 打開(kāi)類型 Ctrl+Shift+T
          全局 打開(kāi)類型層次結(jié)構(gòu) F4
          全局 打開(kāi)聲明 F3
          全局 打開(kāi)外部javadoc Shift+F2
          全局 打開(kāi)資源 Ctrl+Shift+R
          全局 后退歷史記錄 Alt+←
          全局 前進(jìn)歷史記錄 Alt+→
          全局 上一個(gè) Ctrl+,
          全局 下一個(gè) Ctrl+.
          Java編輯器 顯示大綱 Ctrl+O
          全局 在層次結(jié)構(gòu)中打開(kāi)類型 Ctrl+Shift+H
          全局 轉(zhuǎn)至匹配的括號(hào) Ctrl+Shift+P
          全局 轉(zhuǎn)至上一個(gè)編輯位置 Ctrl+Q
          Java編輯器 轉(zhuǎn)至上一個(gè)成員 Ctrl+Shift+↑
          Java編輯器 轉(zhuǎn)至下一個(gè)成員 Ctrl+Shift+↓
          文本編輯器 轉(zhuǎn)至行 Ctrl+L

           
          搜索
          作用域 功能 快捷鍵
          全局 出現(xiàn)在文件中 Ctrl+Shift+U
          全局 打開(kāi)搜索對(duì)話框 Ctrl+H
          全局 工作區(qū)中的聲明 Ctrl+G
          全局 工作區(qū)中的引用 Ctrl+Shift+G

           
          文本編輯
          作用域 功能 快捷鍵
          文本編輯器 改寫切換 Insert
          文本編輯器 上滾行 Ctrl+↑
          文本編輯器 下滾行 Ctrl+↓

           
          文件
          作用域 功能 快捷鍵
          全局 保存 Ctrl+X
          Ctrl+S
          全局 打印 Ctrl+P
          全局 關(guān)閉 Ctrl+F4
          全局 全部保存 Ctrl+Shift+S
          全局 全部關(guān)閉 Ctrl+Shift+F4
          全局 屬性 Alt+Enter
          全局 新建 Ctrl+N

           
          項(xiàng)目
          作用域 功能 快捷鍵
          全局 全部構(gòu)建 Ctrl+B

           
          源代碼
          作用域 功能 快捷鍵
          Java編輯器 格式化 Ctrl+Shift+F
          Java編輯器 取消注釋 Ctrl+\
          Java編輯器 注釋 Ctrl+/
          Java編輯器 添加導(dǎo)入 Ctrl+Shift+M
          Java編輯器 組織導(dǎo)入 Ctrl+Shift+O
          Java編輯器 使用try/catch塊來(lái)包圍 未設(shè)置,太常用了,所以在這里列出,建議自己設(shè)置。
          也可以使用Ctrl+1自動(dòng)修正。

           
          運(yùn)行
          作用域 功能 快捷鍵
          全局 單步返回 F7
          全局 單步跳過(guò) F6
          全局 單步跳入 F5
          全局 單步跳入選擇 Ctrl+F5
          全局 調(diào)試上次啟動(dòng) F11
          全局 繼續(xù) F8
          全局 使用過(guò)濾器單步執(zhí)行 Shift+F5
          全局 添加/去除斷點(diǎn) Ctrl+Shift+B
          全局 顯示 Ctrl+D
          全局 運(yùn)行上次啟動(dòng) Ctrl+F11
          全局 運(yùn)行至行 Ctrl+R
          全局 執(zhí)行 Ctrl+U

           
          重構(gòu)
          作用域 功能 快捷鍵
          全局 撤銷重構(gòu) Alt+Shift+Z
          全局 抽取方法 Alt+Shift+M
          全局 抽取局部變量 Alt+Shift+L
          全局 內(nèi)聯(lián) Alt+Shift+I
          全局 移動(dòng) Alt+Shift+V
          全局 重命名 Alt+Shift+R
          全局 重做 Alt+Shift+Y
          posted @ 2009-10-29 09:55 redcoatjk 閱讀(133) | 評(píng)論 (0)編輯 收藏
           

              對(duì)于大多數(shù)程序員來(lái)說(shuō),微軟是一家值得崇敬的公司,能夠加入微軟,也是很多程序 員的愿望。在付出足夠的努力后,一旦進(jìn)入了微軟,也就意味著可以和最先進(jìn)的技術(shù)終日為伍,一直沿著技術(shù)這條路線走下去了。對(duì)嗎?錯(cuò)。今年九月份剛剛加入微 軟開(kāi)發(fā)合作部的王洪超就為自己規(guī)劃了一條技術(shù)管理的路線,除了在技術(shù)方面繼續(xù)學(xué)習(xí)之外,他還希望在未來(lái)的時(shí)間里有意識(shí)的提升項(xiàng)目管理的能力。王洪超說(shuō):" 微軟為員工的職業(yè)發(fā)展規(guī)劃提供了足夠的學(xué)習(xí)機(jī)會(huì)。" 對(duì)更多的程序員來(lái)說(shuō),進(jìn)入微軟仍舊是一個(gè)夢(mèng)想。然而,與以往任何一個(gè)時(shí)候相比,做出職業(yè)規(guī)劃的必要性更加迫切。面對(duì)層出不窮的新技術(shù),激增的就業(yè)壓力,不 斷分化的開(kāi)發(fā)角色,再加上IT發(fā)展的不明確,做出職業(yè)規(guī)劃既是一種挑戰(zhàn),也是必須之舉。

               以前,學(xué)校的學(xué)生只要考取一個(gè)認(rèn)證就很容易開(kāi)始自己的職業(yè)生涯,已經(jīng)工作幾年的程序員更是成為公司搶奪的對(duì)象,而就在互聯(lián)網(wǎng)熱時(shí),高級(jí)程序員更多想到的是 自己出去創(chuàng)業(yè)。現(xiàn)在一切都改變了,混亂的認(rèn)證市場(chǎng)讓畢業(yè)的學(xué)生失去了一塊招牌,企業(yè)更注重其技能和做項(xiàng)目的經(jīng)驗(yàn),而少有工作經(jīng)驗(yàn)的學(xué)生和企業(yè)需求之間形成 了無(wú)法彌補(bǔ)的裂痕。已經(jīng)工作的程序員又面臨著學(xué)習(xí)軟件工程規(guī)范和技術(shù)更新?lián)Q代的壓力,不明朗的軟件行業(yè)前景讓他們?cè)谧呦蛉穆吠旧显庥隼Щ蟆?duì)于已經(jīng)具 備相當(dāng)水平的資深技術(shù)專家或者技術(shù)領(lǐng)導(dǎo)者來(lái)說(shuō),風(fēng)險(xiǎn)投資對(duì)軟件項(xiàng)目的謹(jǐn)慎使得創(chuàng)業(yè)變得更加困難。即便如此,仍然有很多非軟件專業(yè)的人員源源不斷的加入到這 個(gè)大隊(duì)伍中,更為市場(chǎng)增加了很多競(jìng)爭(zhēng)的對(duì)象。 與企業(yè)需求接軌是學(xué)生的職業(yè)規(guī)劃的第一步 很久以前,企業(yè)要承擔(dān)起學(xué)生的培訓(xùn)工作,畢業(yè)的學(xué)生要在公司經(jīng)過(guò)一段時(shí)間后,才能融入整個(gè)開(kāi)發(fā)團(tuán)隊(duì)。而現(xiàn)在,很少有公司愿意承擔(dān)這樣的培訓(xùn)費(fèi)用了,在激烈 的市場(chǎng)競(jìng)爭(zhēng)下,發(fā)著工資卻無(wú)法帶來(lái)利潤(rùn)的職員是大部分企業(yè)無(wú)法容忍的。

               大學(xué)教育是普適教育,教給學(xué)生的只是知識(shí),而企業(yè)對(duì)學(xué)生的需求是技能。這之間就是一個(gè)很難彌補(bǔ)的差距。中科天博總經(jīng)理王健華表示:"大學(xué)生學(xué)習(xí)完了之后, 只是知道是什么,根本不會(huì)用。學(xué)習(xí)了C、Delphi,學(xué)習(xí)了Java,只能夠按照書本的案例照著做下來(lái)。但讓他做一個(gè)最小的項(xiàng)目,包括一個(gè)帶后端數(shù)據(jù)庫(kù) 的小網(wǎng)站,都很難獨(dú)立承擔(dān)。" 前IBM 軟件部高級(jí)軟件工程師李巨鋒現(xiàn)在擔(dān)任科瑞爾思培訓(xùn)中心專職教師,他也表達(dá)了同樣的看法,"企業(yè)更關(guān)心你學(xué)習(xí)到了什么技能,做過(guò)什么,如何把學(xué)到的技術(shù)應(yīng)用 到實(shí)際中去。" 應(yīng)屆畢業(yè)生很難克服這個(gè)困難,因?yàn)閷W(xué)校不具備這樣的環(huán)境。IT大環(huán)境沒(méi)有解決的情況下,就需要大學(xué)生自己想辦法。如果在學(xué)校通過(guò)某些方式已經(jīng)積累到了經(jīng) 驗(yàn),當(dāng)然是最好的。但如果沒(méi)有積累到這些知識(shí),就必須尋找機(jī)會(huì)通過(guò)其他途徑彌補(bǔ)了。 曾擔(dān)任亞信公司軟件開(kāi)發(fā)技術(shù)總監(jiān),現(xiàn)在創(chuàng)辦達(dá)內(nèi)培訓(xùn)中心的韓少云有也切身的體會(huì)。 "原來(lái)我也在亞信做人才管理,需要不斷從社會(huì)上招聘好的軟件工程師,組建開(kāi)發(fā)團(tuán)隊(duì)。我發(fā)現(xiàn)很難找到合適的人選,但是一些被淘汰的人是很可惜的,他的基本素 質(zhì),包括計(jì)算機(jī)專業(yè)的相關(guān)背景非常不錯(cuò),但具備的技能和企業(yè)不能很好的匹配。"為此,韓少云萌發(fā)了要做IT培訓(xùn)的念頭,希望將企業(yè)需要而學(xué)員缺乏的知識(shí)和 技能通過(guò)這種培訓(xùn)進(jìn)行彌補(bǔ),創(chuàng)辦達(dá)內(nèi)科技以來(lái)也取得了巨大的成功。 對(duì)學(xué)生來(lái)說(shuō),提高適應(yīng)企業(yè)需求的技能也是為了尋找到適合自己的公司,職業(yè)生涯就是進(jìn)入正常的軌道中。尋找到適合的入口,面臨畢業(yè)的學(xué)生要謹(jǐn)慎的做出自 己的選擇。如果不好找入口,起點(diǎn)太低,對(duì)未來(lái)的發(fā)展也沒(méi)有好處,甚至導(dǎo)致以后的工作習(xí)慣都不好。金山公司負(fù)責(zé)人力資源的副總裁王春偉說(shuō):"《哈里波特3》 中有一句話讓我印象非常深刻:選擇比能力更重要。一個(gè)人年輕也只有很短暫的幾年,如果能夠選擇一個(gè)精彩有活力的團(tuán)隊(duì),會(huì)使他的職業(yè)生涯充滿精彩。如果在選 擇職業(yè)的時(shí)候,因?yàn)橐恍┦д`造成兩至三年沒(méi)有學(xué)到什么,自己也會(huì)非常慚愧的。" 王健華表示,企業(yè)是員工社會(huì)價(jià)值的附著。"大公司在自身的工作規(guī)范和工作習(xí)慣會(huì)更加正規(guī),其經(jīng)理的素質(zhì)會(huì)更好。很多人由于沒(méi)有對(duì)未來(lái)進(jìn)行規(guī)劃,沒(méi)有想清 楚,工作之后對(duì)自己的崗位不尊重,經(jīng)理也看不上他。" 企業(yè)對(duì)軟件工程流程越來(lái)越重視,這是企業(yè)做事的方式。要適應(yīng)企業(yè)的需要,甚至先要學(xué)會(huì)規(guī)范的文檔,然后才是技術(shù),這樣企業(yè)知道你受過(guò)正規(guī)的訓(xùn)練。王健華 說(shuō):"我們要求學(xué)員注重4方面的能力:眼界、學(xué)習(xí)的方法、技能和規(guī)范,他要學(xué)習(xí)如何與別人合作,比如在代碼風(fēng)格上統(tǒng)一。雖然只是一名程序員,但仍需要站在 項(xiàng)目經(jīng)理的層面上看自己的工作,這樣才能更好的合作,融入到團(tuán)隊(duì)中。"王春偉認(rèn)為團(tuán)隊(duì)能力也是通用軟件廠商非常看中的一點(diǎn),"現(xiàn)在不是凸現(xiàn)個(gè)人英雄主義的 年代,在金山公司,一個(gè)人如果很孤僻,很冰冷,溝通很艱澀就不行。我們要求程序員心態(tài)非常端正,有良好的配合意識(shí),個(gè)性特別樂(lè)觀。" 一些學(xué)生也意識(shí)到了這點(diǎn),正在軟件學(xué)員讀大四劉未鵬就表示:"我想當(dāng)雜志社編輯、從事教育工作或進(jìn)入研究機(jī)構(gòu),總之得是一個(gè)能夠靜下心來(lái)的地方。如果非要 進(jìn)公司工作,也得像趨勢(shì)、金山或微軟這樣具有開(kāi)放工作環(huán)境的公司。現(xiàn)在國(guó)內(nèi)很多公司還是被市場(chǎng)所奴役,不能建立自己的個(gè)性,個(gè)人覺(jué)得不要在一個(gè)終日趕工的 小公司工作。"因此,對(duì)現(xiàn)在的學(xué)生來(lái)說(shuō),不斷增加和企業(yè)能夠順利接軌的砝碼就是職業(yè)規(guī)劃的第一步。 工作后程序員的職業(yè)規(guī)劃是要將技術(shù)提升與行業(yè)結(jié)合. 已經(jīng)工作一段時(shí)間的程序員更要注重職業(yè)規(guī)劃。很多人剛畢業(yè)時(shí)充滿活力,然而幾年的摸爬滾打后,沖勁就會(huì)慢慢減弱甚至消失。再加上IT大環(huán)境的起伏不定,一 旦無(wú)法跟上技術(shù)或者行業(yè)發(fā)展的步伐,便會(huì)迷茫。王洪超說(shuō):"以前晚上睡覺(jué)之前想事情,經(jīng)常都不知道自己以后做什么。" 這并不奇怪,工作的新鮮感褪色后,就設(shè)法需要通過(guò)一個(gè)目標(biāo)為自己輸送動(dòng)力。這便是職業(yè)規(guī)劃。

               程序員首先需要提高系統(tǒng)設(shè)計(jì)能力。從2000年以后,軟件業(yè)的編程思維和模式、方法發(fā)生了翻天覆地的轉(zhuǎn)變,與九十年代、甚至2000年前是完全不同的。但 是,很多在企業(yè)工作的程序員的知識(shí)架構(gòu)很難跟上。中科天博謝新華老師直率的指出:"現(xiàn)在很多程序員不是按照應(yīng)該如何設(shè)計(jì)最好做得,而是按照我會(huì)什么來(lái)做 的,最終造成設(shè)計(jì)思想落后。現(xiàn)在做項(xiàng)目需要的是新的、巧的設(shè)計(jì)思想。我們可以將從無(wú)數(shù)次失敗中得到的理念告訴他們,包括如何學(xué)習(xí),如何思考,技術(shù)變化的原 因在哪里,其核心在哪里。這樣程序員的理解力就會(huì)完全不同。現(xiàn)在,對(duì)程序員的要求降低了,但對(duì)系統(tǒng)設(shè)計(jì)的要求提高了。所以程序員必須要提高系統(tǒng)設(shè)計(jì)的能 力,否則永遠(yuǎn)出不了頭。" 而曾經(jīng)從事過(guò)宏觀經(jīng)濟(jì)研究工作的李巨鋒更喜歡從行業(yè)走向來(lái)談問(wèn)題。他說(shuō):"現(xiàn)在中國(guó)純軟件公司不多,但是,中國(guó)的經(jīng)濟(jì)非常好,從整個(gè)社會(huì)的經(jīng)濟(jì)和行業(yè)角度 可以得出很多有價(jià)值的內(nèi)容。很多人不了解行業(yè)的需求情況,因此做不了判斷。" 跟隨一個(gè)快速發(fā)展的行業(yè),就比較容易取得發(fā)展,而在一個(gè)發(fā)展緩慢的行業(yè)中成功就比較困難。當(dāng)然,有了市場(chǎng)容量有多大和機(jī)會(huì),并不代表一定會(huì)成功,但沒(méi)有這 個(gè)因素成功的幾率會(huì)更低。工作一兩年的人,最關(guān)鍵的是要有一個(gè)方向感,不要太盲目,這就需要程序員有一定的判斷力。 李巨鋒認(rèn)為,電信行業(yè)新增的市場(chǎng)容量每年有1萬(wàn)億,而且由于是新增市場(chǎng),人員也比較容易進(jìn)入。此外,中國(guó)的手機(jī)市場(chǎng)非常大,由于無(wú)線應(yīng)用的迅速發(fā)展,可以 預(yù)料,基于手機(jī)和電信結(jié)合的軟件的就業(yè)前景就比較好,事實(shí)證明,很多人也在向這個(gè)方面轉(zhuǎn)變。達(dá)內(nèi)的成功與行業(yè)需求也不無(wú)關(guān)系,韓少云說(shuō):"從金融和電信行 業(yè)角度看,對(duì)軟件人才的需求每年以30-50%的比例增長(zhǎng)。熟悉這兩個(gè)行業(yè)所需要的IT技術(shù)和背景的人才,需求量是最大,缺口也是最大的。" 中國(guó)的信息管理軟件市場(chǎng)也是容易就業(yè)的市場(chǎng)。現(xiàn)在市場(chǎng)上有數(shù)不勝數(shù)的小管理軟件公司,這是同中國(guó)社會(huì)走轉(zhuǎn)型之路相關(guān)的。李巨鋒說(shuō),"基于商流、資金 流、信息流、物流的行業(yè)都有相當(dāng)?shù)陌l(fā)展前景。通過(guò)產(chǎn)權(quán)交易的商流,帶動(dòng)資金流和信息流的發(fā)展。物流是新興的行業(yè),這些都需要主流的IT技術(shù)。中國(guó)的物流成 本現(xiàn)在是20.9%,美國(guó)是9.8%,差距非常很大,這其中有1萬(wàn)億的市場(chǎng)容量,如果軟件和信息化服務(wù)占20%的份額,也有幾千億的市場(chǎng),行業(yè)需求很大 了。

              事實(shí)也證明供應(yīng)鏈等類型的軟件市場(chǎng)發(fā)展非常迅猛。" 而對(duì)于游戲,李巨鋒認(rèn)為這不能稱之為一個(gè)產(chǎn)業(yè),因?yàn)樗幌耠娦拍菢訋?dòng)很大的一個(gè)產(chǎn)業(yè)鏈,現(xiàn)在取得成功的只有幾個(gè)游戲,而且還主要偏重銷售,不是一個(gè)上下 游的產(chǎn)業(yè)。盡管比較熱,但李巨鋒認(rèn)為相比來(lái)說(shuō),至少一兩年內(nèi)可能不會(huì)有很大的市場(chǎng)容量,這就需要進(jìn)行判斷。 李巨鋒認(rèn)為,已經(jīng)工作兩年以上的程序員可以有幾種基本的職業(yè)規(guī)劃:技術(shù)專家、軟件架構(gòu)師、實(shí)施顧問(wèn)或銷售。其中程序員最主要的發(fā)展方向是資深技術(shù)專家,無(wú) 論是Java還是.NET,還是數(shù)據(jù)庫(kù)領(lǐng)域,都要首先成為專家,然后才可能繼續(xù)發(fā)展為架構(gòu)師。"盡管架構(gòu)師的職位可以工作一輩子,待遇也非常好,對(duì)于科班 出身的程序員最為適合,但這種工作職位非常有限。"一位畢業(yè)的學(xué)員到IBM軟件開(kāi)發(fā)中心后,過(guò)了一年左右,開(kāi)始請(qǐng)教其未來(lái)的發(fā)展,結(jié)合對(duì)方的情況,建議他 先深入的技術(shù),因?yàn)樵谥袊?guó)架構(gòu)師需要的條件比較復(fù)雜,而且需求量也比較少。 實(shí)施顧問(wèn)和銷售就比較偏向市場(chǎng)了,除了一定的技術(shù)能力外,需要掌握很多IT以外的知識(shí)。這些發(fā)展方向?qū)τ趶钠渌麑I(yè)轉(zhuǎn)入IT的人員更為適合。比如用友就培 養(yǎng)了很多實(shí)施顧問(wèn),這些人加上行業(yè)背景,收入也很高。要做行業(yè)專家,就要比自己的行業(yè)客戶還了解這個(gè)產(chǎn)業(yè)的發(fā)展現(xiàn)狀。李巨鋒說(shuō):"比如煙草行業(yè),一定要了 解大的趨勢(shì),中國(guó)最多的煙民在哪里,其實(shí)是在山西和遼寧,煙草行業(yè)的產(chǎn)業(yè)政策是什么,直接導(dǎo)致我的需求是什么,這些信息對(duì)于職業(yè)發(fā)展很重要。IBM的一些 顧問(wèn)都是行業(yè)內(nèi)的資深專家,他們的發(fā)展就非常具有代表性。" 對(duì)大多數(shù)人來(lái)說(shuō),首先是要專,在技術(shù)上做的比較深入,然后進(jìn)行工作調(diào)整,把自己轉(zhuǎn)變?yōu)槟硞€(gè)領(lǐng)域的專家,第三步,根據(jù)自己的情況,決定自己做軟件架構(gòu)師還是 高級(jí)的顧問(wèn)銷售,另外一部分人可能就會(huì)走向行政管理,這和個(gè)人性格有關(guān)。 要獲得職業(yè)成長(zhǎng),培訓(xùn)也很有幫助。韓少云說(shuō):"在北美,職業(yè)培訓(xùn)是一種高端的培訓(xùn),即便是專業(yè)的人員也需要職業(yè)培訓(xùn)。一個(gè)人在一生中需要經(jīng)過(guò)很多職業(yè)培訓(xùn) 才能成為一個(gè)資深或者專業(yè)的人員。而在國(guó)內(nèi)大家的觀念中,職業(yè)培訓(xùn)還沒(méi)有被大家廣泛的認(rèn)同。" 對(duì)于更高級(jí)的技術(shù)人員,他們所關(guān)注的就不是解決基本的生活問(wèn)題了。他們所關(guān)注的就是發(fā)展和成就感。從現(xiàn)在看,他們更為缺乏的是交流,尤其是和水平差不 多或者更高的人進(jìn)行交流。李巨鋒說(shuō):"我建議他們做一些國(guó)產(chǎn)的產(chǎn)品,做一些自主產(chǎn)權(quán)的技術(shù)。比如,我們還有產(chǎn)品開(kāi)發(fā)的部門就在做國(guó)產(chǎn)數(shù)據(jù)庫(kù)設(shè)計(jì)。" 職業(yè)規(guī)劃帶動(dòng)更好的成長(zhǎng) 從中國(guó)的軟件開(kāi)發(fā)人員的層次看,工作幾年以內(nèi)處于初級(jí)水平的程序員占據(jù)最大的比例,至少在50%之上,高級(jí)的人員最多也就10%左右。但無(wú)論處在哪個(gè)層 面,一定要有規(guī)劃,按照自己的個(gè)性和優(yōu)勢(shì)做一些規(guī)劃。 一個(gè)程序員的成長(zhǎng),學(xué)習(xí)過(guò)程中首先要讀到好書,然后是交到好的學(xué)友,找到好的老師,在這三個(gè)外圍的條件下,找到適合的工作環(huán)境,結(jié)合自己的特點(diǎn),然后在一 些重要的環(huán)節(jié)上遇到適合的人和合適的項(xiàng)目,這樣才能成功。有些職位可能在開(kāi)始的時(shí)候不適合,但工作一段時(shí)間后,可能就可以走上更高的職位。最近,IBM軟 件學(xué)院就開(kāi)始做一個(gè)"軟件人才庫(kù)"的項(xiàng)目,為的就是跟蹤技術(shù)人員的成長(zhǎng),給他們?cè)诤线m的時(shí)機(jī)提供合適的職位。業(yè)內(nèi)人士說(shuō):"IT行業(yè)良性的人員流動(dòng)也是很 好的。"

              有了一定的職業(yè)規(guī)劃,就需要補(bǔ)充自己缺乏的經(jīng)驗(yàn),只有經(jīng)歷過(guò)足夠的項(xiàng)目,才有可能不斷積累。對(duì)行業(yè)的判斷有一定的理解之后,對(duì)一般的企業(yè)適應(yīng)起來(lái)是沒(méi)有問(wèn) 題的,但高級(jí)的人才需要長(zhǎng)時(shí)間的積累。 在中國(guó),除了個(gè)人的基本技能,還需要具備一定的社會(huì)資源,行業(yè)資源和資本。學(xué)生要學(xué)會(huì)在提高智商的情況下,提高自己的情商。因?yàn)椋谌撕腿私煌星樯唐鸷? 大的作用。技術(shù)人員需要慢慢改變自己的一些思維方式。個(gè)人成長(zhǎng)要有意識(shí)的積累社會(huì)資源,認(rèn)識(shí)相關(guān)的人,了解相關(guān)的政策和行業(yè)發(fā)展的過(guò)程和規(guī)則,這些東西是 非技術(shù)的,非智商的,只要你關(guān)注就是可以得到的。我覺(jué)得最關(guān)鍵的就是多認(rèn)識(shí)人,然后有意識(shí)的尋找合適的事情來(lái)做。情商也就需要有渠道,有多少人能夠幫助 你,否則成不了。 機(jī)遇和經(jīng)歷對(duì)于職業(yè)的發(fā)展有相當(dāng)?shù)挠绊懥ΑD承┤嘶蛘吣承┦虑槎伎赡軙?huì)影響到未來(lái)的發(fā)展。王洪超也認(rèn)為成為微軟MVP是自己的一個(gè)轉(zhuǎn)折點(diǎn),由于成為 MVP,便有機(jī)會(huì)接觸更多的技術(shù)朋友和微軟人,為自己的發(fā)展奠定了基礎(chǔ)。 總而言之,每個(gè)人至少三年要點(diǎn)評(píng)一下自己:是環(huán)境的原因,還是自己個(gè)人的原因,如果是環(huán)境的原因,可以考慮是否需要換地方,如果知道自己,可以調(diào)整自 己或者設(shè)的目標(biāo)現(xiàn)實(shí)一些。從一個(gè)普通的程序員做起,3年時(shí)間至少能夠做到做獨(dú)立需求分析和設(shè)計(jì)的。

          posted @ 2009-10-16 17:41 redcoatjk 閱讀(457) | 評(píng)論 (2)編輯 收藏
           
          JNDI是 Java 命名與目錄接口(Java Naming and Directory Interface),在J2EE規(guī)范中是重要的規(guī)范之一,不少專家認(rèn)為,沒(méi)有透徹理解JNDI的意義和作用,就沒(méi)有真正掌握J(rèn)2EE特別是EJB的知識(shí)。
          那么,JNDI到底起什么作用?

          要了解JNDI的作用,我們可以從“如果不用JNDI我們?cè)鯓幼觯坑昧薐NDI后我們又將怎樣做?”這個(gè)問(wèn)題來(lái)探討。

          沒(méi)有JNDI的做法:
          程序員開(kāi)發(fā)時(shí),知道要開(kāi)發(fā)訪問(wèn)MySQL數(shù)據(jù)庫(kù)的應(yīng)用,于是將一個(gè)對(duì) MySQL JDBC 驅(qū)動(dòng)程序類的引用進(jìn)行了編碼,并通過(guò)使用適當(dāng)?shù)?JDBC URL 連接到數(shù)據(jù)庫(kù)。
          就像以下代碼這樣:
          1. Connection conn=null;  
          2. try {  
          3. Class.forName("com.mysql.jdbc.Driver",true, Thread.currentThread().getContextClassLoader());  
          4. conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&password=mingyue");   
          5. ......conn.close();  
          6. catch(Exception e) {  
          7. e.printStackTrace();  
          8. finally {  
          9. if(conn!=null) {  
          10. try {conn.close();  
          11. catch(SQLException e) {}  
          12. }  
          13. }  


          這是傳統(tǒng)的做法,也是以前非Java程序員(如Delphi、VB等)常見(jiàn)的做法。這種做法一般在小規(guī)模的開(kāi)發(fā)過(guò)程中不會(huì)產(chǎn)生問(wèn)題,只要程序員熟悉Java語(yǔ)言、了解JDBC技術(shù)和MySQL,可以很快開(kāi)發(fā)出相應(yīng)的應(yīng)用程序。

          沒(méi)有JNDI的做法存在的問(wèn)題:
          1、數(shù)據(jù)庫(kù)服務(wù)器名稱MyDBServer 、用戶名和口令都可能需要改變,由此引發(fā)JDBC URL需要修改;
          2、數(shù)據(jù)庫(kù)可能改用別的產(chǎn)品,如改用DB2或者Oracle,引發(fā)JDBC驅(qū)動(dòng)程序包和類名需要修改;
          3、隨著實(shí)際使用終端的增加,原配置的連接池參數(shù)可能需要調(diào)整;
          4、......

          解決辦法:
          程 序員應(yīng)該不需要關(guān)心“具體的數(shù)據(jù)庫(kù)后臺(tái)是什么?JDBC驅(qū)動(dòng)程序是什么?JDBC URL格式是什么?訪問(wèn)數(shù)據(jù)庫(kù)的用戶名和口令是什么?”等等這些問(wèn)題,程序員編寫的程序應(yīng)該沒(méi)有對(duì) JDBC 驅(qū)動(dòng)程序的引用,沒(méi)有服務(wù)器名稱,沒(méi)有用戶名稱或口令 —— 甚至沒(méi)有數(shù)據(jù)庫(kù)池或連接管理。而是把這些問(wèn)題交給J2EE容器來(lái)配置和管理,程序員只需要對(duì)這些配置和管理進(jìn)行引用即可。

          由此,就有了JNDI。

          用了JNDI之后的做法:
          首先,在在J2EE容器中配置JNDI參數(shù),定義一個(gè)數(shù)據(jù)源,也就是JDBC引用參數(shù),給這個(gè)數(shù)據(jù)源設(shè)置一個(gè)名稱;然后,在程序中,通過(guò)數(shù)據(jù)源名稱引用數(shù)據(jù)源從而訪問(wèn)后臺(tái)數(shù)據(jù)庫(kù)。
          具體操作如下(以JBoss為例):
          1、配置數(shù)據(jù)源
          在JBoss 的 D:\jboss420GA\docs\examples\jca 文件夾下面,有很多不同數(shù)據(jù)庫(kù)引用的數(shù)據(jù)源定義模板。將其中的 mysql-ds.xml 文件Copy到你使用的服務(wù)器下,如 D:\jboss420GA\server\default\deploy。
          修改 mysql-ds.xml 文件的內(nèi)容,使之能通過(guò)JDBC正確訪問(wèn)你的MySQL數(shù)據(jù)庫(kù),如下:
          1. <?xml version="1.0" encoding="UTF-8"?>  
          2. <datasources>  
          3. <local-tx-datasource>  
          4.     <jndi-name>MySqlDS</jndi-name>  
          5.     <connection-url>jdbc:mysql://localhost:3306/lw</connection-url>  
          6.     <driver-class>com.mysql.jdbc.Driver</driver-class>  
          7.     <user-name>root</user-name>  
          8.     <password>rootpassword</password>  
          9. <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>  
          10.     <metadata>  
          11.        <type-mapping>mySQL</type-mapping>  
          12.     </metadata>  
          13. </local-tx-datasource>  
          14. </datasources>  

          這里,定義了一個(gè)名為MySqlDS的數(shù)據(jù)源,其參數(shù)包括JDBC的URL,驅(qū)動(dòng)類名,用戶名及密碼等。

          2、在程序中引用數(shù)據(jù)源:
          1. Connection conn=null;  
          2. try {  
          3. Context ctx=new InitialContext();  
          4. Object datasourceRef=ctx.lookup("java:MySqlDS");   
          5. //引用數(shù)據(jù)源  
          6. DataSource ds=(Datasource)datasourceRef;conn=ds.getConnection();  
          7.  ......c.close();  
          8. catch(Exception e) {  
          9. e.printStackTrace();  
          10. finally {if(conn!=null) {  
          11. try {conn.close();} catch(SQLException e) { }  
          12. }  
          13. }   

          直接使用JDBC或者通過(guò)JNDI引用數(shù)據(jù)源的編程代碼量相差無(wú)幾,但是現(xiàn)在的程序可以不用關(guān)心具體JDBC參數(shù)了。
          在系統(tǒng)部署后,如果數(shù)據(jù)庫(kù)的相關(guān)參數(shù)變更,只需要重新配置 mysql-ds.xml 修改其中的JDBC參數(shù),只要保證數(shù)據(jù)源的名稱不變,那么程序源代碼就無(wú)需修改。

          由此可見(jiàn),JNDI避免了程序與數(shù)據(jù)庫(kù)之間的緊耦合,使應(yīng)用更加易于配置、易于部署。

          JNDI的擴(kuò)展:
          JNDI在滿足了數(shù)據(jù)源配置的要求的基礎(chǔ)上,還進(jìn)一步擴(kuò)充了作用:所有與系統(tǒng)外部的資源的引用,都可以通過(guò)JNDI定義和引用。

          所以,在J2EE規(guī)范中,J2EE 中的資源并不局限于 JDBC 數(shù)據(jù)源。引用的類型有很多,其中包括資源引用(已經(jīng)討論過(guò))、環(huán)境實(shí)體和 EJB 引用。特別是 EJB 引用,它暴露了 JNDI 在 J2EE 中的另外一項(xiàng)關(guān)鍵角色:查找其他應(yīng)用程序組件。

          EJB 的 JNDI 引用非常類似于 JDBC 資源的引用。在服務(wù)趨于轉(zhuǎn)換的環(huán)境中,這是一種很有效的方法。可以對(duì)應(yīng)用程序架構(gòu)中所得到的所有組件進(jìn)行這類配置管理,從 EJB 組件到 JMS 隊(duì)列和主題,再到簡(jiǎn)單配置字符串或其他對(duì)象,這可以降低隨時(shí)間的推移服務(wù)變更所產(chǎn)生的維護(hù)成本,同時(shí)還可以簡(jiǎn)化部署,減少集成工作。外部資源”。


          總結(jié):
          J2EE 規(guī)范要求所有 J2EE 容器都要提供 JNDI 規(guī)范的實(shí)現(xiàn)。JNDI 在 J2EE 中的角色就是“交換機(jī)” —— J2EE 組件在運(yùn)行時(shí)間接地查找其他組件、資源或服務(wù)的通用機(jī)制。在多數(shù)情況下,提供 JNDI 供應(yīng)者的容器可以充當(dāng)有限的數(shù)據(jù)存儲(chǔ),這樣管理員就可以設(shè)置應(yīng)用程序的執(zhí)行屬性,并讓其他應(yīng)用程序引用這些屬性(Java 管理擴(kuò)展(Java Management Extensions,JMX)也可以用作這個(gè)目的)。JNDI 在 J2EE 應(yīng)用程序中的主要角色就是提供間接層,這樣組件就可以發(fā)現(xiàn)所需要的資源,而不用了解這些間接性。

          在 J2EE 中,JNDI 是把 J2EE 應(yīng)用程序合在一起的粘合劑,JNDI 提供的間接尋址允許跨企業(yè)交付可伸縮的、功能強(qiáng)大且很靈活的應(yīng)用程序。這是 J2EE 的承諾,而且經(jīng)過(guò)一些計(jì)劃和預(yù)先考慮,這個(gè)承諾是完全可以實(shí)現(xiàn)的。
          posted @ 2009-09-07 14:03 redcoatjk 閱讀(135) | 評(píng)論 (0)編輯 收藏
           

          使用腳本能比較穩(wěn)定和安全的將數(shù)據(jù)導(dǎo)入導(dǎo)出.不會(huì)丟失.

          1、數(shù)據(jù)庫(kù)導(dǎo)出:exp 用戶名/密碼@實(shí)例名 file=路徑/文件名.dmp owner=用戶名
          2、數(shù)據(jù)庫(kù)導(dǎo)入:imp 用戶名/密碼@實(shí)例名 fromuser=導(dǎo)出時(shí)用的用戶名 touser=用戶名 file=路徑/文件名.dmp
          posted @ 2009-07-27 10:10 redcoatjk 閱讀(116) | 評(píng)論 (0)編輯 收藏
           

          子查詢:

          用子查詢能解決的問(wèn)題

          假想你想要寫一個(gè)查詢來(lái)找出掙錢比陸濤的薪水還多的人。為了解決這個(gè)問(wèn)題,你需要兩個(gè)查詢:一

           

          個(gè)找出陸濤的收入,第二個(gè)查詢找出收入高于陸濤的人。

          你可以用組合兩個(gè)查詢的方法解決這個(gè)問(wèn)題,放置一個(gè)查詢到另一個(gè)查詢中。

          內(nèi)查詢或子查詢返回一個(gè)值給外查詢或主查詢。使用一個(gè)子查詢相當(dāng)于執(zhí)行兩個(gè)連續(xù)查詢并且用第一個(gè)

           

          查詢的結(jié)果作為第二個(gè)查詢的搜索值。

           

          子查詢語(yǔ)法:

          SELECT select_list

          FROM table

          WHERE expr operator

                        (SELECT select_list

                        FROM table);

          1.子查詢(內(nèi)查詢) 在主查詢之前執(zhí)行一次

          2.子查詢的結(jié)果被用于主查詢(外查詢)

          首先執(zhí)行子查詢 (內(nèi)查詢) 顯示子查詢返回的值,然后用內(nèi)查詢返回的結(jié)果執(zhí)行外查詢,最后,執(zhí)行整個(gè)查詢 (包括子查詢),顯示相同的結(jié)果。

           

           

          子查詢可嵌套的位置:

          子查詢是一個(gè)SELECT 語(yǔ)句,它是嵌在

          另一個(gè) SELECT 語(yǔ)句中的子句。

          使用子查詢你可以用簡(jiǎn)單的語(yǔ)句構(gòu)建功能強(qiáng)大的語(yǔ)句。當(dāng)你需要從表中用依賴于表本身的數(shù)據(jù)選擇行時(shí)

           

          它們是非常有用的。

          也可以放在

          WHERE 子句 HAVING 子句 FROM 子句。

           

          在語(yǔ)法中:

          operator 包括比較條件,例如 >= IN

          比較條件分為兩個(gè)種類:?jiǎn)涡羞\(yùn)算符 (>, =, >=, <, <>, <=) 和多行運(yùn)算符 (IN, ANY, ALL)

          子查詢通常涉及一個(gè)嵌套的 SELECT、子-SELECT 或內(nèi) SELECT 語(yǔ)句。字查詢通常執(zhí)行一次。并且它的輸出被用于完成主或外查詢的查詢條件。

           

          另外,子查詢可以被放在 CREATE VIEW 語(yǔ)句中、CREATE TABLE 語(yǔ)句、UPDATE 語(yǔ)句、INSERT 語(yǔ)句的 INTO 子句和 UPDATE 語(yǔ)句的 SET 子句中。

           

          使用子查詢的原則:

          1.       子查詢放在圓括號(hào)中

          2.將子查詢放在比較條件的右邊, 以增加可讀性。

          在子查詢中的ORDER BY 子句不需要,除非你正在執(zhí)行Top-N 分析。

          Oracle8i 以前的版本中,子查詢不包含 ORDER BY 子句。對(duì)一個(gè) SELECT 語(yǔ)句只能用一個(gè) ORDER BY 子句,并且如果指定了它就必須放在主 SELECT 語(yǔ)句的最后。從 Oracle8i 開(kāi)始,ORDER BY 子句可以使用,并且在進(jìn)行 Top-N 分析時(shí)是必須的。

          3.在單行子查詢中用單行運(yùn)算符,在多行子查詢中用多行運(yùn)算符,

          在子查詢中可以使用兩種比較條件:?jiǎn)涡羞\(yùn)算符和多行運(yùn)算符。

          子查詢的個(gè)數(shù):

          Oracle 服務(wù)器沒(méi)有強(qiáng)制限制子查詢的數(shù)目;限制只與查詢所需的緩沖區(qū)大小有關(guān)。

           

          子查詢的類型:

          1.    單行子查詢:從內(nèi) SELECT 語(yǔ)句只返回一行的查詢

          2.       多行子查詢:從內(nèi) SELECT 語(yǔ)句返回多行的查詢

          3.    還有多列子查詢:從內(nèi) SELECT 語(yǔ)句返回多列的查詢。

           

          單行子查詢

          單行子查詢是從內(nèi)查詢返回一行的查詢。在該子查詢類型中用一個(gè)單行操作符

          SELECT last_name, job_id

          FROM employees

          WHERE job_id =

          (SELECT job_id

          FROM employees

          WHERE employee_id = 141);

           

           

          SELECT  last_name, job_id, salary

          FROM employees

          WHERE job_id =

          (SELECT  job_id  FROM  employees  WHERE  employee_id = 141)  AND  salary >(SELECT  salary  FROM  employees  WHERE  employee_id = 143);

          該例子可以由三個(gè)查詢塊組成:外查詢和兩個(gè)內(nèi)查詢。內(nèi)查詢塊首先被執(zhí)行,產(chǎn)生查詢結(jié)果分別為 ST_CLERK 2600。然后處理外查詢塊,并且使用內(nèi)查詢的返回值來(lái)完成它的查詢條件。

          兩個(gè)內(nèi)查詢返回單個(gè)值 (分別是 ST_CLERK 2600),所以這種 SQL 語(yǔ)句被稱為單行子查詢。

          注:外和內(nèi)查詢可以從不同的表中取得數(shù)據(jù)。

           

          在子查詢中使用組函數(shù):

          SELECT  last_name,  job_id,  salary

          FROM  employees

          WHERE  salary =

          (SELECT  MIN(salary) FROM  employees);

          你可以從主查詢中顯示數(shù)據(jù),該主查詢使用一個(gè)帶組函數(shù)的單行子查詢。子查詢放在圓括號(hào)中并且放在比較條件的后面。

          例子顯示所有其薪水等于最低薪水的雇員的 last namejob ID salary MIN 組函數(shù)返回單個(gè)的值 (2500) 給外函數(shù)。

           

          帶子查詢的HAVING 子句:

          1.Oracle 服務(wù)器首先執(zhí)行子查詢

          2.Oracle 服務(wù)器返回結(jié)果到主查詢的HAVING 子句中

          找出平均薪水為最低平均薪水的工作崗位。

          SELECT job_id, AVG(salary)

          FROM employees

          GROUP BY job_id

          HAVING AVG(salary) = (SELECT MIN(AVG(salary))

          FROM employees

          GROUP BY job_id);

           

          子查詢錯(cuò)誤

          使用子查詢的一個(gè)常見(jiàn)的錯(cuò)誤是單行子查詢返回返回了多行。

          SELECT employee_id, last_name

          FROM employees

          WHERE salary =

          (SELECT MIN(salary) FROM employees  GROUP  BY  department_id);

          ERROR at line 4:ORA-01427: single-rowsubqueryreturns more thanone rowERROR

          子查詢包含一個(gè) GROUP BY 子句,這就暗示該子查詢將返回多行,每個(gè)對(duì)應(yīng)它所找到的一組,在這種情況下,子查詢的結(jié)果將是 4400600025004200700017000 8300

          外查詢得到子查詢的結(jié)果 (44006000250042007000170008300) 并且在它的 WHERE 子句中使用這些結(jié)果。WHERE 子句包含一個(gè)等號(hào) (=) 運(yùn)算符,這是一個(gè)單行比較運(yùn)算符,只能使用一個(gè)值。 = 操作符不能接受來(lái)自子查詢的多個(gè)值,并且因此產(chǎn)生錯(cuò)誤。

          為了糾正該錯(cuò)誤,改變 = 操作為 IN

          子查詢的另一個(gè)常見(jiàn)問(wèn)題是內(nèi)查詢沒(méi)有返回行。

          ,子查詢包含一個(gè) WHERE 子句,推測(cè)起來(lái),其目的是找名字為 Haas 的雇員,該語(yǔ)句是正確的,但在執(zhí)行時(shí)選擇無(wú)行返回。

          沒(méi)有名叫 Haas 的雇員,所以子查詢無(wú)返回行,外查詢得到子查詢的結(jié)果 (null) 并且在 WHERE 子句中使用該結(jié)果,外查詢找不到一個(gè) job ID 等于 null 的雇員,所以也沒(méi)有行返回。如果一個(gè) job 存在 null 值,也沒(méi)有返回行,因?yàn)楸容^兩個(gè)空值還是空,因此 WHERE 子句的條件不為 true

          多行子查詢:

          多行子查詢

          子查詢返回多行被稱為多行子查詢。對(duì)多行子查詢要使用多行運(yùn)算符而不是單行運(yùn)算符。多行運(yùn)算符期待多個(gè)值。

          查找各部門收入為部門最低的那些雇員。

          SELECT last_name, salary, department_id

          FROM employees

          WHERE salary IN (SELECT MIN(salary)

          FROM employees

          GROUP BY department_id);

          內(nèi)查詢先被執(zhí)行,產(chǎn)生一個(gè)查詢結(jié)果,然后主查詢塊處理和使用由內(nèi)查詢返回的值完成它的搜索條件。事實(shí)上,在 Oracle 服務(wù)器看起來(lái)主查詢象是下面這樣:

          SELECT last_name, salary, department_id

          FROM employees

          WHERE salary IN (2500, 4200, 4400, 6000, 7000, 8300, 8600, 17000);

          在多行子查詢中使用ANY 運(yùn)算符

          SELECT employee_id, last_name, job_id, salary

          FROM employees

          WHERE salary < ANY(SELECT salaryFROM employeesWHERE job_id = 'IT_PROG')

          AND  job_id <> 'IT_PROG';

          ANY 運(yùn)算符 (和它的同義詞, SOME 運(yùn)算符) 比較一個(gè)值與一個(gè)子查詢返回的每一個(gè)值。幻燈片中的例子顯示不是 IT 程序員的雇員,并且這些雇員的的薪水少于IT 程序員。掙錢最多的程序員的薪水是 $9,000

          <ANY

          posted @ 2009-07-21 10:15 redcoatjk 閱讀(2821) | 評(píng)論 (0)編輯 收藏
          僅列出標(biāo)題
          共8頁(yè): 上一頁(yè) 1 2 3 4 5 6 7 8 下一頁(yè) 
          CALENDER
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(3)

          隨筆分類(22)

          隨筆檔案(76)

          文章分類(12)

          文章檔案(17)

          搜索

          •  

          積分與排名

          • 積分 - 250887
          • 排名 - 227

          最新評(píng)論

          評(píng)論排行榜


          Powered By: 博客園
          模板提供滬江博客

          主站蜘蛛池模板: 工布江达县| 会理县| 凉山| 文化| 福鼎市| 普陀区| 鲁山县| 常熟市| 张北县| 炉霍县| 多伦县| 高要市| 抚远县| 敖汉旗| 衡阳市| 遂宁市| 新宾| 饶河县| 磐安县| 抚州市| 葫芦岛市| 青龙| 新宾| 蕉岭县| 电白县| 曲周县| 渭源县| 湖州市| 永平县| 大邑县| 南漳县| 张家港市| 旬阳县| 射洪县| 青铜峡市| 仁化县| 财经| 景谷| 蚌埠市| 天等县| 米林县|