<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆:93 文章:11 評論:22 引用:0
    首頁 發新隨筆
    發新文章 聯系 聚合管理

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

    關鍵字: 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分割字母和數字,簡單正則縫隙

    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從首字母起長度為begin的字符串,將剩余字符串賦值給s;

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

    split講解:

    java.lang.string.split
    split 方法
    將一個字符串分割為子字符串,然后將結果作為字符串數組返回。
    stringObj.split([separator,[limit]])
    參數
    stringObj
    必選項。要被分解的 String 對象或文字。該對象不會被 split 方法修改。
    separator
    可選項。字符串或 正則表達式 對象,它標識了分隔字符串時使用的是一個還是多個字符。如果忽

    略該選項,返回包含整個字符串的單一元素數組。
    limit
    可選項。該值用來限制返回數組中的元素個數。

    說明
    split 方法的結果是一個字符串數組,在 stingObj 中每個出現 separator 的位置都要進行分解

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

    split 的實現直接調用的 matcher 類的 split 的方法。“ . ”在正則表達式中有特殊的含義,因此我們使用的時候必須進行轉義。

    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. }}  

     如果用豎線“|”分隔的話,將出現不可得到的結果,必須改為“\\|” 

    posted @ 2010-03-19 17:34 redcoatjk 閱讀(157796) | 評論 (2)編輯 收藏
     
    摘自:http://www.tkk7.com/ghyghost/archive/2008/06/16/208309.html
    標題           在Java中實現浮點數的精確計算         AYellow(原作)   修改          
      關鍵字           Java   浮點數   精確計算        
       
       
      問題的提出:   
      編譯運行下面這個程序會看到什么?  
      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);  
              }  
      };  
       
      你沒有看錯!結果確實是  
      0.060000000000000005  
      0.5800000000000001  
      401.49999999999994  
      1.2329999999999999  
       
      Java中的簡單浮點數類型float和double不能夠進行運算。不光是Java,在其它很多編程語言中也有這樣的問題。在大多數情況下,計算的結果是準確的,但是多試幾次(可以做一個循環)就可以試出類似上面的錯誤。現在終于理解為什么要有BCD碼了。  
      這個問題相當嚴重,如果你有9.999999999999元,你的計算機是不會認為你可以購買10元的商品的。  
      在有的編程語言中提供了專門的貨幣類型來處理這種情況,但是Java沒有。現在讓我們看看如何解決這個問題。  
       
         
       
      四舍五入  
      我們的第一個反應是做四舍五入。Math類中的round方法不能設置保留幾位小數,我們只能象這樣(保留兩位):  
      public   double   round(double   value){  
              return   Math.round(value*100)/100.0;  
      }  
       
      非常不幸,上面的代碼并不能正常工作,給這個方法傳入4.015它將返回4.01而不是4.02,如我們在上面看到的  
      4.015*100=401.49999999999994  
      因此如果我們要做到精確的四舍五入,不能利用簡單類型做任何運算  
      java.text.DecimalFormat也不能解決這個問題:  
      System.out.println(new   java.text.DecimalFormat("0.00").format(4.025));  
      輸出是4.02  
       
         
       
      BigDecimal  
      在《Effective   Java》這本書中也提到這個原則,float和double只能用來做科學計算或者是工程計算,在商業計算中我們要用 java.math.BigDecimal。BigDecimal一共有4個夠造方法,我們不關心用BigInteger來夠造的那兩個,那么還有兩個, 它們是:  
      BigDecimal(double   val)    
                          Translates   a   double   into   a   BigDecimal.    
      BigDecimal(String   val)    
                          Translates   the   String   repre   sentation   of   a   BigDecimal   into   a   BigDecimal.  
       
      上面的API簡要描述相當的明確,而且通常情況下,上面的那一個使用起來要方便一些。我們可能想都不想就用上了,會有什么問題呢?等到出了問題的時候,才發現上面哪個夠造方法的詳細說明中有這么一段:  
      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.  
       
      原來我們如果需要精確計算,非要用String來夠造BigDecimal不可!在《Effective   Java》一書中的例子是用String來夠造BigDecimal的,但是書上卻沒有強調這一點,這也許是一個小小的失誤吧。  
         
       
      解決方案  
      現在我們已經可以解決這個問題了,原則是使用BigDecimal并且一定要用String來夠造。  
      但是想像一下吧,如果我們要做一個加法運算,需要先將兩個浮點數轉為String,然后夠造成BigDecimal,在其中一個上調用add方法,傳入另 一個作為參數,然后把運算的結果(BigDecimal)再轉換為浮點數。你能夠忍受這么煩瑣的過程嗎?下面我們提供一個工具類Arith來簡化操作。它 提供以下靜態方法,包括加減乘除和四舍五入:  
      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的簡單類型不能夠精確的對浮點數進行運算,這個工具類提供精  
        *   確的浮點數運算,包括加減乘除和四舍五入。  
        */  
       
      public   class   Arith{  
       
              //默認除法運算精度  
              private   static   final   int   DEF_DIV_SCALE   =   10;  
       
       
              //這個類不能實例化  
              private   Arith(){  
              }  
       
         
              /**  
                *   提供精確的加法運算。  
                *   @param   v1   被加數  
                *   @param   v2   加數  
                *   @return   兩個參數的和  
                */  
       
              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();  
              }  
       
              /**  
                *   提供精確的減法運算。  
                *   @param   v1   被減數  
                *   @param   v2   減數  
                *   @return   兩個參數的差  
                */  
       
              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();  
              }    
       
              /**  
                *   提供精確的乘法運算。  
                *   @param   v1   被乘數  
                *   @param   v2   乘數  
                *   @return   兩個參數的積  
                */  
       
              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();  
              }  
       
         
       
              /**  
                *   提供(相對)精確的除法運算,當發生除不盡的情況時,精確到  
                *   小數點以后10位,以后的數字四舍五入。  
                *   @param   v1   被除數  
                *   @param   v2   除數  
                *   @return   兩個參數的商  
                */  
       
              public   static   double   div(double   v1,double   v2){  
                      return   div(v1,v2,DEF_DIV_SCALE);  
              }  
       
         
       
              /**  
                *   提供(相對)精確的除法運算。當發生除不盡的情況時,由scale參數指  
                *   定精度,以后的數字四舍五入。  
                *   @param   v1   被除數  
                *   @param   v2   除數  
                *   @param   scale   表示表示需要精確到小數點以后幾位。  
                *   @return   兩個參數的商  
                */  
       
              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();  
              }  
       
         
       
              /**  
                *   提供精確的小數位四舍五入處理。  
                *   @param   v   需要四舍五入的數字  
                *   @param   scale   小數點后保留幾位  
                *   @return   四舍五入后的結果  
                */  
       
              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 閱讀(462) | 評論 (0)編輯 收藏
     

    0
    推薦

    要學習ANT的使用,要先了解什么是ANT。
    什么是ant呢? ant是構建工具;那構建是又什么意思呢?形象來說,你要把代碼從某個地方拿來,編譯,再拷貝到某個地方去等等操作,當然不僅與此,但是主要用來干這個。
    知道這些,我們還要了解為什么要用ANT,呵呵,哦對,就像那位MM說的,當然是有好處的:
    A, 跨平臺  --因為ant是使用java實現的,所以它跨平臺
    B,使用簡單--與ant的兄弟make比起來
    C, 語法清晰--同樣是和make相比
    D,功能強大--ant能做的事情很多,可能你用了很久,你仍然不知道它能有多少功能。當你自己開發一些ant插件的時候,你會發現它更多的功能。

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

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

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

    可以從這2個表中查詢,
    user_constraints, user_cons_columns
    查詢的時候觀察下表的內容即明白.


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

    找到了,查一個單詞時,特別實用,這個功能Idea兩年前就有了)
    Ctrl+Shift+J 反向增量查找(和上條相同,只不過是從后往前查)
    Ctrl+Shift+F4 關閉所有打開的Editer
    Ctrl+Shift+X 把當前選中的文本全部變味小寫
    Ctrl+Shift+Y 把當前選中的文本全部變為小寫
    Ctrl+Shift+F 格式化當前代碼
    Ctrl+Shift+P 定位到對于的匹配符(譬如{}) (從前面定位后面時,光標要在匹配符里面,后面到前面,則反之)

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

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

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

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

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

     
    搜索
    作用域 功能 快捷鍵
    全局 出現在文件中 Ctrl+Shift+U
    全局 打開搜索對話框 Ctrl+H
    全局 工作區中的聲明 Ctrl+G
    全局 工作區中的引用 Ctrl+Shift+G

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

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

     
    項目
    作用域 功能 快捷鍵
    全局 全部構建 Ctrl+B

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

     
    運行
    作用域 功能 快捷鍵
    全局 單步返回 F7
    全局 單步跳過 F6
    全局 單步跳入 F5
    全局 單步跳入選擇 Ctrl+F5
    全局 調試上次啟動 F11
    全局 繼續 F8
    全局 使用過濾器單步執行 Shift+F5
    全局 添加/去除斷點 Ctrl+Shift+B
    全局 顯示 Ctrl+D
    全局 運行上次啟動 Ctrl+F11
    全局 運行至行 Ctrl+R
    全局 執行 Ctrl+U

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

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

         以前,學校的學生只要考取一個認證就很容易開始自己的職業生涯,已經工作幾年的程序員更是成為公司搶奪的對象,而就在互聯網熱時,高級程序員更多想到的是 自己出去創業。現在一切都改變了,混亂的認證市場讓畢業的學生失去了一塊招牌,企業更注重其技能和做項目的經驗,而少有工作經驗的學生和企業需求之間形成 了無法彌補的裂痕。已經工作的程序員又面臨著學習軟件工程規范和技術更新換代的壓力,不明朗的軟件行業前景讓他們在走向三十的路途上遭遇困惑。對于已經具 備相當水平的資深技術專家或者技術領導者來說,風險投資對軟件項目的謹慎使得創業變得更加困難。即便如此,仍然有很多非軟件專業的人員源源不斷的加入到這 個大隊伍中,更為市場增加了很多競爭的對象。 與企業需求接軌是學生的職業規劃的第一步 很久以前,企業要承擔起學生的培訓工作,畢業的學生要在公司經過一段時間后,才能融入整個開發團隊。而現在,很少有公司愿意承擔這樣的培訓費用了,在激烈 的市場競爭下,發著工資卻無法帶來利潤的職員是大部分企業無法容忍的。

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

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

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

        有了一定的職業規劃,就需要補充自己缺乏的經驗,只有經歷過足夠的項目,才有可能不斷積累。對行業的判斷有一定的理解之后,對一般的企業適應起來是沒有問 題的,但高級的人才需要長時間的積累。 在中國,除了個人的基本技能,還需要具備一定的社會資源,行業資源和資本。學生要學會在提高智商的情況下,提高自己的情商。因為,在人和人交往中情商起很 大的作用。技術人員需要慢慢改變自己的一些思維方式。個人成長要有意識的積累社會資源,認識相關的人,了解相關的政策和行業發展的過程和規則,這些東西是 非技術的,非智商的,只要你關注就是可以得到的。我覺得最關鍵的就是多認識人,然后有意識的尋找合適的事情來做。情商也就需要有渠道,有多少人能夠幫助 你,否則成不了。 機遇和經歷對于職業的發展有相當的影響力。某些人或者某些事情都可能會影響到未來的發展。王洪超也認為成為微軟MVP是自己的一個轉折點,由于成為 MVP,便有機會接觸更多的技術朋友和微軟人,為自己的發展奠定了基礎。 總而言之,每個人至少三年要點評一下自己:是環境的原因,還是自己個人的原因,如果是環境的原因,可以考慮是否需要換地方,如果知道自己,可以調整自 己或者設的目標現實一些。從一個普通的程序員做起,3年時間至少能夠做到做獨立需求分析和設計的。

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

    要了解JNDI的作用,我們可以從“如果不用JNDI我們怎樣做?用了JNDI后我們又將怎樣做?”這個問題來探討。

    沒有JNDI的做法:
    程序員開發時,知道要開發訪問MySQL數據庫的應用,于是將一個對 MySQL JDBC 驅動程序類的引用進行了編碼,并通過使用適當的 JDBC URL 連接到數據庫。
    就像以下代碼這樣:
    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. }  


    這是傳統的做法,也是以前非Java程序員(如Delphi、VB等)常見的做法。這種做法一般在小規模的開發過程中不會產生問題,只要程序員熟悉Java語言、了解JDBC技術和MySQL,可以很快開發出相應的應用程序。

    沒有JNDI的做法存在的問題:
    1、數據庫服務器名稱MyDBServer 、用戶名和口令都可能需要改變,由此引發JDBC URL需要修改;
    2、數據庫可能改用別的產品,如改用DB2或者Oracle,引發JDBC驅動程序包和類名需要修改;
    3、隨著實際使用終端的增加,原配置的連接池參數可能需要調整;
    4、......

    解決辦法:
    程 序員應該不需要關心“具體的數據庫后臺是什么?JDBC驅動程序是什么?JDBC URL格式是什么?訪問數據庫的用戶名和口令是什么?”等等這些問題,程序員編寫的程序應該沒有對 JDBC 驅動程序的引用,沒有服務器名稱,沒有用戶名稱或口令 —— 甚至沒有數據庫池或連接管理。而是把這些問題交給J2EE容器來配置和管理,程序員只需要對這些配置和管理進行引用即可。

    由此,就有了JNDI。

    用了JNDI之后的做法:
    首先,在在J2EE容器中配置JNDI參數,定義一個數據源,也就是JDBC引用參數,給這個數據源設置一個名稱;然后,在程序中,通過數據源名稱引用數據源從而訪問后臺數據庫。
    具體操作如下(以JBoss為例):
    1、配置數據源
    在JBoss 的 D:\jboss420GA\docs\examples\jca 文件夾下面,有很多不同數據庫引用的數據源定義模板。將其中的 mysql-ds.xml 文件Copy到你使用的服務器下,如 D:\jboss420GA\server\default\deploy。
    修改 mysql-ds.xml 文件的內容,使之能通過JDBC正確訪問你的MySQL數據庫,如下:
    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>  

    這里,定義了一個名為MySqlDS的數據源,其參數包括JDBC的URL,驅動類名,用戶名及密碼等。

    2、在程序中引用數據源:
    1. Connection conn=null;  
    2. try {  
    3. Context ctx=new InitialContext();  
    4. Object datasourceRef=ctx.lookup("java:MySqlDS");   
    5. //引用數據源  
    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或者通過JNDI引用數據源的編程代碼量相差無幾,但是現在的程序可以不用關心具體JDBC參數了。
    在系統部署后,如果數據庫的相關參數變更,只需要重新配置 mysql-ds.xml 修改其中的JDBC參數,只要保證數據源的名稱不變,那么程序源代碼就無需修改。

    由此可見,JNDI避免了程序與數據庫之間的緊耦合,使應用更加易于配置、易于部署。

    JNDI的擴展:
    JNDI在滿足了數據源配置的要求的基礎上,還進一步擴充了作用:所有與系統外部的資源的引用,都可以通過JNDI定義和引用。

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

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


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

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

    使用腳本能比較穩定和安全的將數據導入導出.不會丟失.

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

    子查詢:

    用子查詢能解決的問題

    假想你想要寫一個查詢來找出掙錢比陸濤的薪水還多的人。為了解決這個問題,你需要兩個查詢:一

     

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

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

    內查詢或子查詢返回一個值給外查詢或主查詢。使用一個子查詢相當于執行兩個連續查詢并且用第一個

     

    查詢的結果作為第二個查詢的搜索值。

     

    子查詢語法:

    SELECT select_list

    FROM table

    WHERE expr operator

                  (SELECT select_list

                  FROM table);

    1.子查詢(內查詢) 在主查詢之前執行一次

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

    首先執行子查詢 (內查詢) 顯示子查詢返回的值,然后用內查詢返回的結果執行外查詢,最后,執行整個查詢 (包括子查詢),顯示相同的結果。

     

     

    子查詢可嵌套的位置:

    子查詢是一個SELECT 語句,它是嵌在

    另一個 SELECT 語句中的子句。

    使用子查詢你可以用簡單的語句構建功能強大的語句。當你需要從表中用依賴于表本身的數據選擇行時

     

    它們是非常有用的。

    也可以放在

    WHERE 子句 HAVING 子句 FROM 子句。

     

    在語法中:

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

    比較條件分為兩個種類:單行運算符 (>, =, >=, <, <>, <=) 和多行運算符 (IN, ANY, ALL)

    子查詢通常涉及一個嵌套的 SELECT、子-SELECT 或內 SELECT 語句。字查詢通常執行一次。并且它的輸出被用于完成主或外查詢的查詢條件。

     

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

     

    使用子查詢的原則:

    1.       子查詢放在圓括號中

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

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

    Oracle8i 以前的版本中,子查詢不包含 ORDER BY 子句。對一個 SELECT 語句只能用一個 ORDER BY 子句,并且如果指定了它就必須放在主 SELECT 語句的最后。從 Oracle8i 開始,ORDER BY 子句可以使用,并且在進行 Top-N 分析時是必須的。

    3.在單行子查詢中用單行運算符,在多行子查詢中用多行運算符,

    在子查詢中可以使用兩種比較條件:單行運算符和多行運算符。

    子查詢的個數:

    Oracle 服務器沒有強制限制子查詢的數目;限制只與查詢所需的緩沖區大小有關。

     

    子查詢的類型:

    1.    單行子查詢:從內 SELECT 語句只返回一行的查詢

    2.       多行子查詢:從內 SELECT 語句返回多行的查詢

    3.    還有多列子查詢:從內 SELECT 語句返回多列的查詢。

     

    單行子查詢

    單行子查詢是從內查詢返回一行的查詢。在該子查詢類型中用一個單行操作符

    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);

    該例子可以由三個查詢塊組成:外查詢和兩個內查詢。內查詢塊首先被執行,產生查詢結果分別為 ST_CLERK 2600。然后處理外查詢塊,并且使用內查詢的返回值來完成它的查詢條件。

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

    注:外和內查詢可以從不同的表中取得數據。

     

    在子查詢中使用組函數:

    SELECT  last_name,  job_id,  salary

    FROM  employees

    WHERE  salary =

    (SELECT  MIN(salary) FROM  employees);

    你可以從主查詢中顯示數據,該主查詢使用一個帶組函數的單行子查詢。子查詢放在圓括號中并且放在比較條件的后面。

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

     

    帶子查詢的HAVING 子句:

    1.Oracle 服務器首先執行子查詢

    2.Oracle 服務器返回結果到主查詢的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);

     

    子查詢錯誤

    使用子查詢的一個常見的錯誤是單行子查詢返回返回了多行。

    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

    子查詢包含一個 GROUP BY 子句,這就暗示該子查詢將返回多行,每個對應它所找到的一組,在這種情況下,子查詢的結果將是 4400600025004200700017000 8300

    外查詢得到子查詢的結果 (44006000250042007000170008300) 并且在它的 WHERE 子句中使用這些結果。WHERE 子句包含一個等號 (=) 運算符,這是一個單行比較運算符,只能使用一個值。 = 操作符不能接受來自子查詢的多個值,并且因此產生錯誤。

    為了糾正該錯誤,改變 = 操作為 IN

    子查詢的另一個常見問題是內查詢沒有返回行。

    ,子查詢包含一個 WHERE 子句,推測起來,其目的是找名字為 Haas 的雇員,該語句是正確的,但在執行時選擇無行返回。

    沒有名叫 Haas 的雇員,所以子查詢無返回行,外查詢得到子查詢的結果 (null) 并且在 WHERE 子句中使用該結果,外查詢找不到一個 job ID 等于 null 的雇員,所以也沒有行返回。如果一個 job 存在 null 值,也沒有返回行,因為比較兩個空值還是空,因此 WHERE 子句的條件不為 true

    多行子查詢:

    多行子查詢

    子查詢返回多行被稱為多行子查詢。對多行子查詢要使用多行運算符而不是單行運算符。多行運算符期待多個值。

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

    SELECT last_name, salary, department_id

    FROM employees

    WHERE salary IN (SELECT MIN(salary)

    FROM employees

    GROUP BY department_id);

    內查詢先被執行,產生一個查詢結果,然后主查詢塊處理和使用由內查詢返回的值完成它的搜索條件。事實上,在 Oracle 服務器看起來主查詢象是下面這樣:

    SELECT last_name, salary, department_id

    FROM employees

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

    在多行子查詢中使用ANY 運算符

    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 運算符 (和它的同義詞, SOME 運算符) 比較一個值與一個子查詢返回的每一個值。幻燈片中的例子顯示不是 IT 程序員的雇員,并且這些雇員的的薪水少于IT 程序員。掙錢最多的程序員的薪水是 $9,000

    <ANY

    posted @ 2009-07-21 10:15 redcoatjk 閱讀(2816) | 評論 (0)編輯 收藏
    僅列出標題
    共8頁: 上一頁 1 2 3 4 5 6 7 8 下一頁 
    CALENDER
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(3)

    隨筆分類(22)

    隨筆檔案(76)

    文章分類(12)

    文章檔案(17)

    搜索

    •  

    積分與排名

    • 積分 - 250517
    • 排名 - 227

    最新評論

    評論排行榜


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

    主站蜘蛛池模板: 亚洲jjzzjjzz在线观看| 永久看日本大片免费35分钟| 亚洲一区在线免费观看| 中文亚洲AV片在线观看不卡| 日本黄色免费观看| 一级毛片全部免费播放| fc2免费人成在线视频| 国产日本亚洲一区二区三区| 亚洲男人都懂得羞羞网站| 亚洲国产精品专区在线观看| 无码日韩人妻av一区免费| 99re热精品视频国产免费| 中国一级特黄高清免费的大片中国一级黄色片 | 亚洲男人天堂2020| 日韩精品视频免费网址| 2021国产精品成人免费视频| 久久精品乱子伦免费| 一级有奶水毛片免费看| 成年大片免费视频播放一级| 国产精品亚洲а∨无码播放不卡 | 99久久免费中文字幕精品| 中文在线免费视频| 一级A毛片免费观看久久精品| 久久久久久亚洲av无码蜜芽| 亚洲日韩精品国产3区| wwwxxx亚洲| 国产亚洲精品成人AA片| 亚洲kkk4444在线观看| 亚洲人成网站日本片| 亚洲天堂中文字幕在线观看| 亚洲黄色在线观看| 亚洲综合一区二区精品久久| 少妇中文字幕乱码亚洲影视| 亚洲视频在线观看| 亚洲精品美女在线观看| 亚洲精品国产成人| 亚洲五月综合缴情婷婷| 亚洲伊人久久大香线蕉影院| 亚洲剧场午夜在线观看| 在线亚洲高清揄拍自拍一品区| 学生妹亚洲一区二区|