posts - 15, comments - 20, trackbacks - 0, articles - 6
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          2009年9月1日

                 剛開始使用new HSSFWorkbook(new FileInputStream(excelFile))來(lái)讀取Workbook,對(duì)Excel2003以前(包括2003)的版本沒(méi)有問(wèn)題,但讀取Excel2007時(shí)發(fā)生如下異常:
          org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)

                  該錯(cuò)誤意思是說(shuō),文件中的數(shù)據(jù)是用Office2007+XML保存的,而現(xiàn)在卻調(diào)用OLE2 Office文檔處理,應(yīng)該使用POI不同的部分來(lái)處理這些數(shù)據(jù),比如使用XSSF來(lái)代替HSSF。

                  于是按提示使用XSSF代替HSSF,用new XSSFWorkbook(excelFile)來(lái)讀取Workbook,對(duì)Excel2007沒(méi)有問(wèn)題了,可是在讀取Excel2003以前(包括2003)的版本時(shí)卻發(fā)生了如下新異常(真是太悲劇了):
          org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: '*.xls'
                  該錯(cuò)誤是說(shuō),操作無(wú)效,不能打開指定的xls文件。

                  下載POI的源碼后進(jìn)行單步調(diào)試,發(fā)現(xiàn)剛開始的時(shí)候還是對(duì)的,但到ZipFile類后就找不到文件了,到網(wǎng)上查了下,原來(lái)是XSSF不能讀取Excel2003以前(包括2003)的版本,這樣的話,就需要在讀取前判斷文件是2003前的版本還是2007的版本,然后對(duì)應(yīng)調(diào)用HSSF或XSSF來(lái)讀取。
                  這是初步的想法,但這種做法比較麻煩,看了下API,發(fā)現(xiàn)XSSF和HSSF雖然在不同的包里,但卻引用了同一接口Workbook,于是想到了這樣的讀取方法:
                  Workbook book = null;
                  try {
                      book = new XSSFWorkbook(excelFile);
                  } catch (Exception ex) {
                      book = new HSSFWorkbook(new FileInputStream(excelFile));
                  }
                  在各版本的Excel中測(cè)試,沒(méi)有發(fā)生異常,問(wèn)題解決。

          posted @ 2011-03-16 16:17 spinage 閱讀(12728) | 評(píng)論 (1)編輯 收藏

             最近遇到了request.getRemoteAddr()獲取的值為0:0:0:0:0:0:0:1,這是為什么呢,照道理講,應(yīng)該是127.0.0.1才對(duì),為什么這個(gè)獲取的值變成了ipv6了呢,而且我發(fā)現(xiàn)這種情況只有在服務(wù)器和客戶端都在同一臺(tái)電腦上才會(huì)出現(xiàn)(例如用localhost訪問(wèn)的時(shí)候才會(huì)出現(xiàn),用127.0.0.1不會(huì)出現(xiàn)),后來(lái)上網(wǎng)查了查原因,原來(lái)是/etc/hosts這個(gè)東西作怪(在windows上應(yīng)該是C:\Windows\system32\drivers\etc\ hosts這個(gè)文件),只需要注釋掉文件中的 # ::1 localhost 這一行即可解決問(wèn)題。另外localhost這個(gè)文件很有用,這里你可以添加自己的條目,例如添加 192.168.0.111 buyer.com這樣子,在瀏覽器中原來(lái)只能使用192.168.0.111來(lái)訪問(wèn)的,并可以使用 buyer.com來(lái)進(jìn)行替換。

          posted @ 2011-03-16 16:08 spinage 閱讀(940) | 評(píng)論 (1)編輯 收藏

          假設(shè)當(dāng)前已執(zhí)行:select * from tab;

             (a)ppend 添加文本到緩沖區(qū)當(dāng)前行尾

                 例: SQL>a  order by tname

            結(jié)果:select * from tab order by tname;

            (注:a后面跟2個(gè)空格)

            (c)hange/old/new 在當(dāng)前行用新的文本替換舊的文本

            例:SQL>c/*/tname

            結(jié)果:select tname from tab;

            (c)hange/text 從當(dāng)前行刪除文本

            例:SQL>c/tab

            結(jié)果:select tname from ;

             del 刪除當(dāng)前行

              del n 刪除第n行 

            (i)nput 文本 在當(dāng)前行之后添加一行 

            (l)ist 顯示緩沖區(qū)中所有行 

            (l)ist n 顯示緩沖區(qū)中第 n 行 

            (l)ist m n 顯示緩沖區(qū)中 m 到 n 行

            (r)un 執(zhí)行當(dāng)前緩沖區(qū)的命令

            /  執(zhí)行當(dāng)前緩沖區(qū)的命令

            @文件名 運(yùn)行調(diào)入內(nèi)存的sql文件

               例:SQL> edit s<回車>

            如果當(dāng)前目錄下不存在s.sql文件,則系統(tǒng)自動(dòng)生成s.sql文件,

            在其中輸入“select * from tab;”,存盤退出。

            SQL> @s<回車>

              系統(tǒng)會(huì)自動(dòng)查詢當(dāng)前用戶下的所有表、視圖、同義詞。

                @@文件名 在.sql文件中調(diào)用另一個(gè).sql文件時(shí)使用

                例:SQL>edit test<回車>

                     在其中輸入"@s",存盤退出。(這里s為上例中創(chuàng)建的sql文件)

                     SQL>@@test<回車>

                     結(jié)果就是執(zhí)行了文件s.sql中的語(yǔ)法:自動(dòng)查詢當(dāng)前用戶下的所有表、視圖、同義詞。

            save 文件名             將緩沖區(qū)的命令以文件方式存盤,缺省文件擴(kuò)展名為.sql

            get 文件名           調(diào)入存盤的sql文件

            start 文件名         運(yùn)行調(diào)入內(nèi)存的sql文件

            spool 文件名        把這之后的各種操作及執(zhí)行結(jié)果“假脫機(jī)”即存盤到磁盤文件上,默認(rèn)文件擴(kuò)展名為.lst

              spool                 顯示當(dāng)前的“假脫機(jī)”狀態(tài)

              spool off            停止輸出

            例:

            SQL> spool a

            SQL> spool

            正假脫機(jī)到 A.LST

            SQL> spool off

            SQL> spool

            當(dāng)前無(wú)假脫機(jī)

            exit             退出SQL*PLUS

            desc 表名     顯示表的結(jié)構(gòu)

            show user     顯示當(dāng)前連接用戶

            show error    顯示錯(cuò)誤

            show all       顯示所有68個(gè)系統(tǒng)變量值

            edit                打開默認(rèn)編輯器,Windows系統(tǒng)中默認(rèn)是notepad.exe,把緩沖區(qū)中最后一條SQL語(yǔ)句調(diào)入afiedt.buf文件中進(jìn)行編輯

              edit 文件名   把當(dāng)前目錄中指定的.sql文件調(diào)入編輯器進(jìn)行編輯

             clear screen   清空當(dāng)前屏幕顯示

          posted @ 2010-04-06 16:04 spinage 閱讀(327) | 評(píng)論 (0)編輯 收藏

          關(guān)于在MyEclipseWEB工程里面的JS/JSP經(jīng)常會(huì)有語(yǔ)法錯(cuò)誤提示,這是由于MyEclipse對(duì)其語(yǔ)法要求相當(dāng)嚴(yán)格所造成的,而這些文件本身是可以運(yùn)行并沒(méi)有什么錯(cuò)誤的,在你實(shí)際應(yīng)用部署中并無(wú)影響.

          此問(wèn)題解決辦法有兩種:

          一、就是您不用去管它提示,直接部署到你的WEB容器上運(yùn)行是可以的,但此方法欠妥當(dāng)。

          二、選擇你的工程右擊菜單——>點(diǎn)擊MyEclipse菜單項(xiàng)的Exclude From Validation,如果你的工程里還有其它需要它檢驗(yàn)其合法性建議可以針對(duì)某一文件夾或具體文件進(jìn)行此項(xiàng)操作,這樣可以只針對(duì)WEB工程里的某一個(gè)文件夾里面的JSP/JS文件來(lái)進(jìn)行驗(yàn)證排除,這樣就不會(huì)對(duì)這些被排除的文件或文件夾進(jìn)行驗(yàn)證了,不過(guò)再你打開這些文件時(shí),文件里面是有錯(cuò)誤提示的,但工程是不會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤提示的。這樣不僅解決了工程總提示語(yǔ)法信息錯(cuò)誤的煩惱,對(duì)于一些確實(shí)存在問(wèn)題的文件也可以查看其錯(cuò)誤問(wèn)題所在,可謂一舉兩得。

          另外還可以通過(guò)使用Remove All Validation Markers此菜單項(xiàng)進(jìn)移除所有的驗(yàn)證語(yǔ)法錯(cuò)誤提示信息。

          posted @ 2010-04-06 13:29 spinage 閱讀(2357) | 評(píng)論 (2)編輯 收藏

          Tomcat:
          IOException while loading persisted sessions: java.io.EOFException解決

          嚴(yán)重: IOException while loading persisted sessions: java.io.EOFException
          嚴(yán)重: Exception loading sessions from persistent storage

          原因是tomcat對(duì)硬盤的session讀取失敗,徹底解決辦法一下:將work下面的文件清空,主要是*.ser文件,或者只是刪除掉session.ser即可以解決。

          posted @ 2010-03-24 09:57 spinage 閱讀(246) | 評(píng)論 (0)編輯 收藏

          eclipse 無(wú)法啟動(dòng) JVM terminated. Exit code=-1
          eclipse.ini中內(nèi)存設(shè)置過(guò)大的問(wèn)題,以前我修改過(guò)內(nèi)存設(shè)置,一直都好好的,之前eclipse.ini的配置如下:

           

          -showsplash
          com.genuitec.myeclipse.product
          --launcher.XXMaxPermSize
          512m
          -vmargs
          -Xms256m
          -Xmx512m
          -Duser.language=en
          -XX:PermSize=256M
          -XX:MaxPermSize=512M

          現(xiàn)在修改了一下,-Xms256m改成-Xms128m,把Xmx512m  改為 Xmx256m,結(jié)果還真的好了,沒(méi)想到居然是這樣的小問(wèn)題引起來(lái)的。

          ====================================================================================

          第二個(gè),我們的項(xiàng)目采用svn管理,查找.svn,把所有.svn的文件刪除

          第三個(gè),查看項(xiàng)目根文件夾下的.metadata,發(fā)現(xiàn).metadata下面差很多插件,把現(xiàn)有項(xiàng)目的.metadate覆蓋進(jìn)去即可

           

          posted @ 2010-01-26 09:12 spinage 閱讀(348) | 評(píng)論 (0)編輯 收藏

           

          1、建立組合索引,但查詢謂詞并未使用組合索引的第一列,此處有一個(gè)INDEX SKIP SCAN概念。
          2、在包含有null值的table列上建立索引,當(dāng)時(shí)使用select count(*) from table時(shí)不會(huì)使用索引。
          3、在索引列上使用函數(shù)時(shí)不會(huì)使用索引,如果一定要使用索引只能建立函數(shù)索引。
          4、當(dāng)被索引的列進(jìn)行隱式的類型轉(zhuǎn)換時(shí)不會(huì)使用索引。如:select * from t where indexed_column = 5,而indexed_column列建立索引但類型是字符型,這時(shí)Oracle會(huì)產(chǎn)生
          隱式的類型轉(zhuǎn)換,轉(zhuǎn)換后的語(yǔ)句類似于select * from t where to_number(indexed_column) = 5,此時(shí)不走索引的情況類似于case3。日期轉(zhuǎn)換也有類似問(wèn)題,如:
          select * from t where trunc(date_col) = trunc(sysdate)其中date_col為索引列,這樣寫不會(huì)走索引,可改寫成select * from t where date_col >= trunc(sysdate)
          and date_col < trunc(sysdate+1),此查詢會(huì)走索引。
          5、并不是所有情況使用索引都會(huì)加快查詢速度,full scan table 有時(shí)會(huì)更快,尤其是當(dāng)查詢的數(shù)據(jù)量占整個(gè)表的比重較大時(shí),因?yàn)閒ull scan table采用的是多塊讀,
          當(dāng)Oracle優(yōu)化器沒(méi)有選擇使用索引時(shí)不要立即強(qiáng)制使用,要充分證明使用索引確實(shí)查詢更快時(shí)再使用強(qiáng)制索引。

          6、<>

          7、like’%dd’百分號(hào)在前

          8、not in ,not exist. 

          posted @ 2010-01-14 15:16 spinage 閱讀(2042) | 評(píng)論 (0)編輯 收藏

          利用pinyin4j開源的一個(gè)小項(xiàng)目取中文首字母
           
          public static String getAllFirstLetter(String str) {
            String convert = "";
            for (int j = 0; j < str.length(); j++) {
             char word = str.charAt(j);
             String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
             if (pinyinArray != null) {
              convert += pinyinArray[0].charAt(0);
             } else {
              convert += word;
             }
            }
            return convert;
           }

          posted @ 2009-11-27 10:30 spinage 閱讀(878) | 評(píng)論 (0)編輯 收藏

           在許多開源的框架中都充分的利用了設(shè)計(jì)模式這一概念,Struts典型的MVC模式的化身,Spring是工廠模式和單例模式的充分體現(xiàn)。在項(xiàng)目開發(fā)中,能充分利用設(shè)計(jì)模式的思想來(lái)考慮問(wèn)題,來(lái)解決問(wèn)題,來(lái)通過(guò)代碼去實(shí)現(xiàn)。不但可以提高代碼的質(zhì)量,對(duì)程序的擴(kuò)展,重用帶來(lái)很大方便。其實(shí)我們項(xiàng)目中用設(shè)計(jì)模式編程就是加了一個(gè)封裝層,減少客戶必須處理的對(duì)象的數(shù)量。

           在設(shè)計(jì)模式中一般都遵循這樣的原則:
                (1)按接口編程。
                (2)盡量用聚合代替繼承。
                (3)找出變化并封裝之。
               上面主要講了一些設(shè)計(jì)模式的作用和原則。接下來(lái)是我對(duì)門面模式的一個(gè)簡(jiǎn)單理解。Facade(門面模式)是美國(guó)著名的四人幫(GOF)寫的23種模式之一。
                 簡(jiǎn)單的理解:我們需要用一種比原有的方法更簡(jiǎn)單的方法與系統(tǒng)交互,或者說(shuō),我們需要以一種特殊的方式使用系統(tǒng)。主要是為子系統(tǒng)中的一組接口提供一個(gè)統(tǒng)一的接口。Facade模式定義了一個(gè)更高的接口,使子系統(tǒng)更加容易使用。它的意圖要求一個(gè)一致的高層接口。

          posted @ 2009-11-27 10:25 spinage 閱讀(310) | 評(píng)論 (0)編輯 收藏

          序列化機(jī)制只保存對(duì)象的類型信息,屬性的類型信息和屬性值,和方法沒(méi)有什么關(guān)系,你就是給這個(gè)類增加10000個(gè)方法,序列化內(nèi)容也不會(huì)增加任何東西。

          posted @ 2009-11-24 11:01 spinage 閱讀(206) | 評(píng)論 (0)編輯 收藏

          1.寫一個(gè)方法,用一個(gè)for循環(huán)打印九九乘法表
          Java code   
              /**
               * 打印九九乘法口訣表
               */
              public void nineNineMulitTable(){
                  for (int i = 1,j = 1; j <= 9; i++) {
                        System.out.print(i+"*"+j+"="+i*j+" ");
                        if(i==j){
                            i=0;
                            j++;
                            System.out.println();
                        }
                    }
              }

           

          2.給定一個(gè)java.util.Date對(duì)象,如何轉(zhuǎn)化為”2007-3-22 20:23:22”格式的字符串
            Java code
              /**
               * 將某個(gè)日期以固定格式轉(zhuǎn)化成字符串
               * @param date
              * @return str
              */
              public String date2FormatStr(Date date)
              {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String str = sdf.format(date);
                return str;
              }

          3.寫一個(gè)方法,能夠判斷任意一個(gè)整數(shù)是否素?cái)?shù)
           
              /**
              * 判斷任意一個(gè)整數(shù)是否素?cái)?shù)
              * @param num
              * @return boolean
              */
              public boolean isPrimeNumber(int num)
              {
                for (int i = 2; i <= Math.sqrt(num); i++) {
                    if(num%i==0)
                    {
                        return false;
                    }
                }
                return true;
              }
          4.寫一個(gè)方法,輸入任意一個(gè)整數(shù),返回它的階乘
          Java code    
               /**
                *獲得任意一個(gè)整數(shù)的階乘
                *@param n
                *@returnn!
                */
                public int factorial(int num)
                {
                  //遞歸
                  if(num == 1)
                  {
                      return 1;
                  }
                  return num*factorial(num-1);
                }

          5.寫一個(gè)方法,用二分查找法判斷任意整數(shù)在任意整數(shù)數(shù)組里面是否存在,若存在就返回它在數(shù)組中的索引位置,不存在返回-1
          Java code    
                /**
                 *二分查找特定整數(shù)在整型數(shù)組中的位置(遞歸)
                 *@param dataset
                 *@param data
                 *@param beginIndex
                 *@param endIndex
                 *@return index
                 */
                 public int binarySearch(int[] dataset,int data,int beginIndex,int endIndex){
                   int midIndex = (beginIndex+endIndex)/2;
                   //如果查找的數(shù)要比開始索引的數(shù)據(jù)要小或者是比結(jié)束索引的書要大,或者開始查找的索引值大于結(jié)束的索引值返回-1沒(méi)有查到
                   if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex){
                       return -1;
                   }
                   if(data <dataset[midIndex]){ 
                       return binarySearch(dataset,data,beginIndex,midIndex-1);
                   }else if(data>dataset[midIndex])
                   {
                       return binarySearch(dataset,data,midIndex+1,endIndex);
                   }else {
                       return midIndex;
                   }
                 }
                
                 /**
                  *二分查找特定整數(shù)在整型數(shù)組中的位置(非遞歸)
                  *@param dataset
                  *@param data
                  *@return index
                  */
                  public int binarySearch(int[] dataset ,int data)
                  {
                    int beginIndex = 0; 
                    int endIndex = dataset.length - 1; 
                    int midIndex = -1;
                    if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex){
                        return -1;
                    }
                    while(beginIndex <= endIndex) {
                        midIndex = (beginIndex+endIndex)/2;
                        if(data <dataset[midIndex]) { 
                           endIndex = midIndex-1; 
                        } else if(data>dataset[midIndex]) { 
                          beginIndex = midIndex+1; 
                        }else {
                          return midIndex;
                        }
                    }
                    return -1;
                  }

          posted @ 2009-10-27 17:46 spinage 閱讀(209) | 評(píng)論 (0)編輯 收藏

          1.一道SQL語(yǔ)句面試題,關(guān)于group by
          表內(nèi)容:
          2005-05-09 勝
          2005-05-09 勝
          2005-05-09 負(fù)
          2005-05-09 負(fù)
          2005-05-10 勝
          2005-05-10 負(fù)
          2005-05-10 負(fù)

          如果要生成下列結(jié)果, 該如何寫sql語(yǔ)句?

                      勝 負(fù)
          2005-05-09 2 2
          2005-05-10 1 2
          ------------------------------------------
          create table #tmp(rq varchar(10),shengfu nchar(1))

          insert into #tmp values('2005-05-09','勝')
          insert into #tmp values('2005-05-09','勝')
          insert into #tmp values('2005-05-09','負(fù)')
          insert into #tmp values('2005-05-09','負(fù)')
          insert into #tmp values('2005-05-10','勝')
          insert into #tmp values('2005-05-10','負(fù)')
          insert into #tmp values('2005-05-10','負(fù)')

          1)select rq, sum(case when shengfu='勝' then 1 else 0 end)'勝',sum(case when shengfu='負(fù)' then 1 else 0 end)'負(fù)' from #tmp group by rq
          2) select N.rq,N.勝,M.負(fù) from (
          select rq,勝=count(*) from #tmp where shengfu='勝'group by rq)N inner join
          (select rq,負(fù)=count(*) from #tmp where shengfu='負(fù)'group by rq)M on N.rq=M.rq
          3)select a.col001,a.a1 勝,b.b1 負(fù) from
          (select col001,count(col001) a1 from temp1 where col002='勝' group by col001) a,
          (select col001,count(col001) b1 from temp1 where col002='負(fù)' group by col001) b
          where a.col001=b.col001

          2.請(qǐng)教一個(gè)面試中遇到的SQL語(yǔ)句的查詢問(wèn)題
          表中有A B C三列,用SQL語(yǔ)句實(shí)現(xiàn):當(dāng)A列大于B列時(shí)選擇A列否則選擇B列,當(dāng)B列大于C列時(shí)選擇B列否則選擇C列。
          ------------------------------------------
          select (case when a>b then a else b end ),
          (case when b>c then b esle c end)
          from table_name

          3.面試題:一個(gè)日期判斷的sql語(yǔ)句?
          請(qǐng)取出tb_send表中日期(SendTime字段)為當(dāng)天的所有記錄?(SendTime字段為datetime型,包含日期與時(shí)間)
          ------------------------------------------
          select * from tb where datediff(dd,SendTime,getdate())=0

          4.有一張表,里面有3個(gè)字段:語(yǔ)文,數(shù)學(xué),英語(yǔ)。其中有3條記錄分別表示語(yǔ)文70分,數(shù)學(xué)80分,英語(yǔ)58分,請(qǐng)用一條sql語(yǔ)句查詢出這三條記錄并按以下條件顯示出來(lái)(并寫出您的思路):  
             大于或等于80表示優(yōu)秀,大于或等于60表示及格,小于60分表示不及格。  
                 顯示格式:  
                 語(yǔ)文              數(shù)學(xué)                英語(yǔ)  
                 及格              優(yōu)秀                不及格    
          ------------------------------------------
          select
          (case when 語(yǔ)文>=80 then '優(yōu)秀'
                  when 語(yǔ)文>=60 then '及格'
          else '不及格' end) as 語(yǔ)文,
          (case when 數(shù)學(xué)>=80 then '優(yōu)秀'
                  when 數(shù)學(xué)>=60 then '及格'
          else '不及格' end) as 數(shù)學(xué),
          (case when 英語(yǔ)>=80 then '優(yōu)秀'
                  when 英語(yǔ)>=60 then '及格'
          else '不及格' end) as 英語(yǔ)
          from table

          5.在sqlserver2000中請(qǐng)用sql創(chuàng)建一張用戶臨時(shí)表和系統(tǒng)臨時(shí)表,里面包含兩個(gè)字段ID和IDValues,類型都是int型,并解釋下兩者的區(qū)別?
          ------------------------------------------
          用戶臨時(shí)表:create table #xx(ID int, IDValues int)
          系統(tǒng)臨時(shí)表:create table ##xx(ID int, IDValues int)

          區(qū)別:
          用戶臨時(shí)表只對(duì)創(chuàng)建這個(gè)表的用戶的Session可見(jiàn),對(duì)其他進(jìn)程是不可見(jiàn)的.
          當(dāng)創(chuàng)建它的進(jìn)程消失時(shí)這個(gè)臨時(shí)表就自動(dòng)刪除.

          全局臨時(shí)表對(duì)整個(gè)SQL Server實(shí)例都可見(jiàn),但是所有訪問(wèn)它的Session都消失的時(shí)候,它也自動(dòng)刪除.

          6.sqlserver2000是一種大型數(shù)據(jù)庫(kù),他的存儲(chǔ)容量只受存儲(chǔ)介質(zhì)的限制,請(qǐng)問(wèn)它是通過(guò)什么方式實(shí)現(xiàn)這種無(wú)限容量機(jī)制的。
          ------------------------------------------
          它的所有數(shù)據(jù)都存儲(chǔ)在數(shù)據(jù)文件中(*.dbf),所以只要文件夠大,SQL    Server的存儲(chǔ)容量是可以擴(kuò)大的.

          SQL Server 2000 數(shù)據(jù)庫(kù)有三種類型的文件:

          主要數(shù)據(jù)文件
          主要數(shù)據(jù)文件是數(shù)據(jù)庫(kù)的起點(diǎn),指向數(shù)據(jù)庫(kù)中文件的其它部分。每個(gè)數(shù)據(jù)庫(kù)都有一個(gè)主要數(shù)據(jù)文件。主要數(shù)據(jù)文件的推薦文件擴(kuò)展名是 .mdf。

          次要數(shù)據(jù)文件
          次要數(shù)據(jù)文件包含除主要數(shù)據(jù)文件外的所有數(shù)據(jù)文件。有些數(shù)據(jù)庫(kù)可能沒(méi)有次要數(shù)據(jù)文件,而有些數(shù)據(jù)庫(kù)則有多個(gè)次要數(shù)據(jù)文件。次要數(shù)據(jù)文件的推薦文件擴(kuò)展名是 .ndf。

          日志文件
          日志文件包含恢復(fù)數(shù)據(jù)庫(kù)所需的所有日志信息。每個(gè)數(shù)據(jù)庫(kù)必須至少有一個(gè)日志文件,但可以不止一個(gè)。日志文件的推薦文件擴(kuò)展名是 .ldf。

          7.請(qǐng)用一個(gè)sql語(yǔ)句得出結(jié)果
          從table1,table2中取出如table3所列格式數(shù)據(jù),注意提供的數(shù)據(jù)及結(jié)果不準(zhǔn)確,只是作為一個(gè)格式向大家請(qǐng)教。
          如使用存儲(chǔ)過(guò)程也可以。

          table1

          月份mon 部門dep 業(yè)績(jī)yj
          -------------------------------
          一月份      01      10
          一月份      02      10
          一月份      03      5
          二月份      02      8
          二月份      04      9
          三月份      03      8

          table2

          部門dep      部門名稱dname
          --------------------------------
                01      國(guó)內(nèi)業(yè)務(wù)一部
                02      國(guó)內(nèi)業(yè)務(wù)二部
                03      國(guó)內(nèi)業(yè)務(wù)三部
                04      國(guó)際業(yè)務(wù)部

          table3 (result)

          部門dep 一月份      二月份      三月份
          --------------------------------------
                01      10        null      null
                02      10         8        null
                03      null       5        8
                04      null      null      9

          ------------------------------------------
          1)
          select a.部門名稱dname,b.業(yè)績(jī)yj as '一月份',c.業(yè)績(jī)yj as '二月份',d.業(yè)績(jī)yj as '三月份'
          from table1 a,table2 b,table2 c,table2 d
          where a.部門dep = b.部門dep and b.月份mon = '一月份' and
          a.部門dep = c.部門dep and c.月份mon = '二月份' and
          a.部門dep = d.部門dep and d.月份mon = '三月份' and
          2)
          select a.dep,
          sum(case when b.mon=1 then b.yj else 0 end) as '一月份',
          sum(case when b.mon=2 then b.yj else 0 end) as '二月份',
          sum(case when b.mon=3 then b.yj else 0 end) as '三月份',
          sum(case when b.mon=4 then b.yj else 0 end) as '四月份',
          sum(case when b.mon=5 then b.yj else 0 end) as '五月份',
          sum(case when b.mon=6 then b.yj else 0 end) as '六月份',
          sum(case when b.mon=7 then b.yj else 0 end) as '七月份',
          sum(case when b.mon=8 then b.yj else 0 end) as '八月份',
          sum(case when b.mon=9 then b.yj else 0 end) as '九月份',
          sum(case when b.mon=10 then b.yj else 0 end) as '十月份',
          sum(case when b.mon=11 then b.yj else 0 end) as '十一月份',
          sum(case when b.mon=12 then b.yj else 0 end) as '十二月份',
          from table2 a left join table1 b on a.dep=b.dep

          8.華為一道面試題
          一個(gè)表中的Id有多個(gè)記錄,把所有這個(gè)id的記錄查出來(lái),并顯示共有多少條記錄數(shù)。
          ------------------------------------------
          select id, Count(*) from tb group by id having count(*)>1
          select * from(select count(ID) as count from table group by ID)T where T.count>1

          posted @ 2009-10-27 13:05 spinage 閱讀(571) | 評(píng)論 (2)編輯 收藏

          拼音排序
          拼音有好幾種方式,其中最主要的是中華人民共和國(guó)的漢語(yǔ)拼音 Chinese Phonetic。對(duì)漢字的排序有兩種:一種是寬松的,能夠按拼音排序最常用的漢字,另一種是嚴(yán)格的,能夠按拼音排序絕大部分大部分漢字。

          寬松的拼音排序法
          原理:漢字最早是GB2312編碼,收錄了六千多個(gè)漢字,是按拼音排序的,編碼是連續(xù)的。 后來(lái)出現(xiàn)了GBK編碼,對(duì)GB2312進(jìn)行了擴(kuò)展,到了兩萬(wàn)多漢字,并且兼容GB2312,也就是說(shuō)GB2312中的漢字編碼是原封不動(dòng)搬到GBK中的(在GBK編碼中[B0-D7]區(qū)中)。

          如果我們只關(guān)心這6000多個(gè)漢字的順序,就可以用下面的方法實(shí)現(xiàn)漢字寬松排序。

          /**
          * @author shaob
          *
          * Copyright (c)
          */

          package chinese.utility;

          import java.text.Collator;
          import java.util.Comparator;
          import java.util.Locale;

          public class PinyinSimpleComparator implements Comparator<String> {
              public int compare(String o1, String o2) {
                  return Collator.getInstance(Locale.CHINESE).compare(o1, o2);
              }
          }

          在對(duì)[孫, 孟, 宋, 尹, 廖, 張, 徐, 昆, 曹, 曾,怡]這幾個(gè)漢字排序,結(jié)果是:[曹, 昆, 廖, 孟, 宋, 孫, 徐, 尹, 曾, 張, 怡]。最后一個(gè) 怡 有問(wèn)題,不該排在最后的。

          注意:這個(gè)程序有兩個(gè)不足

          由于gb2312中的漢字編碼是連續(xù)的,因此新增加的漢字不可能再按照拼音順序插入到已有的gb2312編碼中,所以新增加的漢字不是按拼音順序排的。
          同音字比較的結(jié)果不等于0 。
          下面的測(cè)試代碼可以證明

          /**
          * @author shaob
          *
          * Copyright (c)

          /**
          * 非常用字(怡)
          */
          @Test
          public void testNoneCommon() {
              Assert.assertTrue(comparator.compare("怡", "張") > 0);
          }

          /**
          * 同音字
          */
          @Test
          public void testSameSound() {
              Assert.assertTrue(comparator.compare("怕", "帕") != 0);
          }

          嚴(yán)格的拼音排序法
          為了解決寬松的拼音的兩點(diǎn)不足,可以通過(guò)實(shí)現(xiàn)漢語(yǔ)拼音的函數(shù)來(lái)解決。goolge下看到sf上有個(gè)pinyin4j的項(xiàng)目,可以解決這個(gè)問(wèn)題,pinyin4j的項(xiàng)目地址是:http://pinyin4j.sourceforge.net/。

          實(shí)現(xiàn)代碼:

          /**
            * @author shaob
            *
            * Copyright (c)
            */
          package chinese.utility;

          import java.util.Comparator;
          import net.sourceforge.pinyin4j.PinyinHelper;

          public class PinyinComparator implements Comparator<String> {

              public int compare(String o1, String o2) {

                  for (int i = 0; i < o1.length() && i < o2.length(); i++) {

                      int codePoint1 = o1.charAt(i);
                      int codePoint2 = o2.charAt(i);

                      if (Character.isSupplementaryCodePoint(codePoint1)
                              || Character.isSupplementaryCodePoint(codePoint2)) {
                          i++;
                      }

                      if (codePoint1 != codePoint2) {
                          if (Character.isSupplementaryCodePoint(codePoint1)
                                  || Character.isSupplementaryCodePoint(codePoint2)) {
                              return codePoint1 - codePoint2;
                          }

                          String pinyin1 = pinyin((char) codePoint1);
                          String pinyin2 = pinyin((char) codePoint2);

                          if (pinyin1 != null && pinyin2 != null) { // 兩個(gè)字符都是漢字
                              if (!pinyin1.equals(pinyin2)) {
                                  return pinyin1.compareTo(pinyin2);
                              }
                          } else {
                              return codePoint1 - codePoint2;
                          }
                      }
                  }
                  return o1.length() - o2.length();
              }

              /**
               * 字符的拼音,多音字就得到第一個(gè)拼音。不是漢字,就return null。
               */
              private String pinyin(char c) {
                  String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c);
                  if (pinyins == null) {
                      return null;
                  }
                  return pinyins[0];
              }
          }

           

          posted @ 2009-10-15 16:01 spinage 閱讀(4997) | 評(píng)論 (0)編輯 收藏

          在全局?jǐn)?shù)據(jù)庫(kù)ORCL下創(chuàng)建一個(gè)用戶
          首先在開始--》運(yùn)行——》sqlplus,然后輸入 sys/change_on_install as sysdba
          以sys權(quán)限登陸進(jìn)去
          然后可以進(jìn)行操作:
          創(chuàng)建用戶 create user test indentified by test;
          這樣就創(chuàng)建了一個(gè)用戶名密碼都為test的用戶
          但這個(gè)時(shí)候test還是不能登陸成功的,我們需要賦予相應(yīng)的權(quán)限
          首先賦予create session的權(quán)限
          grant create session to test;
          這樣test用戶就能成功登陸進(jìn)去
          但是此時(shí)用戶還是不能創(chuàng)建表 我們需要賦予用戶創(chuàng)建表的權(quán)限:
          grant create table to test;
          但是用戶此時(shí)還不能創(chuàng)建表 因?yàn)樾枰惺褂帽砜臻g的權(quán)限(相當(dāng)于 用戶有了進(jìn)房間的鑰匙 但是沒(méi)有進(jìn)大門的鑰匙)
          所以也應(yīng)該賦予相應(yīng)的權(quán)限
          grant unlimited tablespace to test;
          這個(gè)時(shí)候用戶就擁有了創(chuàng)建表的權(quán)限 由于表是用戶test的 相應(yīng)的他就擁有了對(duì)創(chuàng)建的表的增刪查改的權(quán)限了
          我們要查看用戶擁有什么權(quán)限可以通過(guò)查詢一個(gè)系統(tǒng)的視圖(數(shù)字字典)
          select * from user_sys_privs;
          這樣就可以知道當(dāng)前用戶的權(quán)限

          撤銷權(quán)限 revoke create table from test;

          場(chǎng)景:
          用戶test   用戶test1
          test1的用戶創(chuàng)建了個(gè)表mytab 并且插入了一些數(shù)據(jù)
          那么 test用戶是否可以訪問(wèn)到test1的mytab怎么訪問(wèn)?
          答:不可以,必須先授權(quán)
          test1必須授權(quán)給test :grant select on mytab to test;
          那么這個(gè)時(shí)候test可以通過(guò) select * from test1.mytab;來(lái)訪問(wèn)mytab中的數(shù)據(jù)
          如果想把某個(gè)表(對(duì)象)的所有權(quán)限都賦予給test那么可以:
          grant all on mytab to test;
          撤銷所有權(quán)限
          revoke all on mytab to test;


          總結(jié)
          對(duì)于系統(tǒng)權(quán)限由sys來(lái)做
          對(duì)于對(duì)象權(quán)限由 誰(shuí)擁有誰(shuí)授權(quán)
          系統(tǒng)權(quán)限:
             grant create session to test;
             grant create table to test;
             grant unlimited tablespace to test;

             revoke create session from test;
             revoke create table from test;
             revoke unlimited tablespase from test;

             grant create session to public;  //表示把創(chuàng)建表的權(quán)限賦予所有人

             select * from user_sys_privs;  //返回當(dāng)前用戶的所有系統(tǒng)權(quán)限

             grant select on mytab to test;
             grant all on mytab to test;

             revoke select on mytab from test;
             revoke all on mytab from test;

             
             對(duì)象權(quán)限可以控制到列 (更新和插入操作)
             grant update(name) on mytab to test;
             grant insert(id) on mytab to test;

             select * from user_col_privs;
             注意:查詢和刪除不能控制到列   
             需要有commit的 insert update insert

            權(quán)限的傳遞
            系統(tǒng)權(quán)限的傳遞:
            grant alter table to A with admin option;
            那么A可以通過(guò)把該權(quán)限傳遞給B,如果想B也可以傳遞下去那么可以也帶上with admin option
            grant alter table to B;
            對(duì)象權(quán)限的傳遞:
            grant select on mytab to A with grant option;
            那么A可以把在表mytab的select權(quán)限賦予給B,如果B想也能傳遞該select權(quán)限也可以帶上with grant option
            grant select on mytab to B;

          ----------------------------------------------------------------------------------------------------------

          --創(chuàng)建用戶
          create user keeltest identified by keeltest;
          --分配權(quán)限
          grant create session,create table,create view ,create any index to keeltest;
          grant unlimited tablespace to keeltest;

           

          posted @ 2009-09-28 09:41 spinage 閱讀(628) | 評(píng)論 (0)編輯 收藏

          1、需要在你本機(jī)安裝oracle客戶端和pl/sql
          2、配置你本機(jī)的tnsname文件 (E:\oracle\product\10.1.0\db_1\NETWORK\ADMIN)
          在該文件中加入:
          數(shù)據(jù)庫(kù)名=
            (DESCRIPTION =
              (ADDRESS_LIST =
                (ADDRESS = (PROTOCOL = TCP)(HOST = IP )(PORT = 1521))
              )
              (CONNECT_DATA =
                (SERVICE_NAME = 數(shù)據(jù)庫(kù)名)
              )
            )
          3、pl/sql連接 數(shù)據(jù)庫(kù)名,輸入 用戶名密碼

          posted @ 2009-09-24 13:25 spinage 閱讀(657) | 評(píng)論 (0)編輯 收藏

          兩種辦法:

          一、將 @author 屬性寫死 。

          通過(guò)菜單 Window->Preference 打開參數(shù)設(shè)置面板,然后選擇:
          1.Java -> Code Style -> Code Templates
          2.在右側(cè)選擇Comments,將其中的Types項(xiàng),然后選右邊的"Edit",進(jìn)入編輯模式,將 @author ${user} 中的${user}改成你自己的名字即可。

          二、修改用戶名
          控制面板-->計(jì)算機(jī)管理-->本地用戶和組-->用戶
          使用管理員賬戶登陸 可以任意修改用戶名 ,然后重啟電腦,OK 。
          PS:XP HOME EDITION 不保證其可用。

          posted @ 2009-09-22 10:11 spinage 閱讀(459) | 評(píng)論 (0)編輯 收藏

          由于在svn的界面中并沒(méi)有為我們提供直接更換用戶名密碼的地方,所以一旦我們需要更換用戶名的就需要自己想一些辦法。

              解決方案如下:

          在Eclipse使用SVN的過(guò)程中大多數(shù)人往往習(xí)慣把訪問(wèn)SVN的用戶名密碼自動(dòng)保存起來(lái)
          以便下次自動(dòng)使用,不要再次手工輸入,但是有些時(shí)候需要變更密碼或者用戶名,
          這時(shí)候怎么辦?在網(wǎng)上查找后發(fā)現(xiàn)如下方法:

          1. 查看你的Eclipse中使用的是什么SVN Interface
          windows > preference > Team > SVN #SVN Interface

          2. 如果是用的JavaHL, 找到以下目錄并刪除auth目錄下的文件.
          C:"Documents and Settings"[YourUserName]"Application Data"Subversion"

          3. 如果你用的SVNKit, 找到以下目錄并刪除.keyring文件.
          [eclipse]"configuration"org.eclipse.core.runtime

              主要有兩種方法,一種是刪除SVN客戶端的賬號(hào)配置文件;另外一種就是去SVN服務(wù)端將賬號(hào)設(shè)置成不可用。

              具體步驟:

              1、通過(guò)刪除SVN客戶端的賬號(hào)配置文件

              (1)找到我們使用的客戶端配置文件,在window xp下面他們的位置在系統(tǒng)盤的 Documents and Settings\alex\Application Data\Subversion\auth\文件夾中,把里面的所有文件刪除。

              (2)使用SVN更新或提交,使得客戶端與服務(wù)端進(jìn)行通訊,這樣就會(huì)SVN客戶端就要求我們輸入新的用戶名密碼,輸入我們的用戶名密碼就可以替換掉舊的用戶名密碼。

              2、通過(guò)修改SVN服務(wù)端賬號(hào)配置文件,這部分需要SVN的管理員配合

              (1)找到服務(wù)端賬號(hào)配置文件,這個(gè)文件位于SVN服務(wù)器的安裝路徑 config文件夾,打開并編輯passwd文件,刪除或注釋需要被替換的賬號(hào)

              (2)在客戶端使用SVN更新或提交,使得客戶端與服務(wù)端進(jìn)行通訊,這樣就會(huì)SVN客戶端就要求我們輸入新的用戶名密碼,輸入我們的用戶名密碼就可以替換掉舊的用戶名密碼。

          posted @ 2009-09-22 10:08 spinage 閱讀(81816) | 評(píng)論 (15)編輯 收藏

          1.我所知道的aop 
              初看aop,上來(lái)就是一大堆術(shù)語(yǔ),而且還有個(gè)拉風(fēng)的名字,面向切面編程,都說(shuō)是OOP的一種有益補(bǔ)充等等。一下子讓你不知所措,心想著:怪不得很多人都和我說(shuō)aop多難多難。當(dāng)我看進(jìn)去以后,我才發(fā)現(xiàn):它就是一些java基礎(chǔ)上的樸實(shí)無(wú)華的應(yīng)用,包括ioc,包括許許多多這樣的名詞,都是萬(wàn)變不離其宗而已。
          2.為什么用aop 
              1就是為了方便,看一個(gè)國(guó)外很有名的大師說(shuō),編程的人都是“懶人”,因?yàn)樗炎约鹤龅氖虑槎甲尦绦蜃隽恕S昧薬op能讓你少寫很多代碼,這點(diǎn)就夠充分了吧
              2就是為了更清晰的邏輯,可以讓你的業(yè)務(wù)邏輯去關(guān)注自己本身的業(yè)務(wù),而不去想一些其他的事情,這些其他的事情包括:安全,事物,日志等。 
          3.那些aop的術(shù)語(yǔ) 
              初看這么多術(shù)語(yǔ),一下子都不好接受,慢慢來(lái),很快就會(huì)搞懂。
              1.通知(Advice)
              就是你想要的功能,也就是上面說(shuō)的 安全,事物,日志等。你給先定義好把,然后在想用的地方用一下。
              2.連接點(diǎn)(JoinPoint)
              這個(gè)更好解釋了,就是spring允許你使用通知的地方,那可真就多了,基本每個(gè)方法的前,后(兩者都有也行),或拋出異常時(shí)都可以是連接點(diǎn),spring只支持方法連接點(diǎn).其他如aspectJ還可以讓你在構(gòu)造器或?qū)傩宰⑷霑r(shí)都行,不過(guò)那不是咱關(guān)注的,只要記住,和方法有關(guān)的前前后后(拋出異常),都是連接點(diǎn)。
              3.切入點(diǎn)(Pointcut)
              上面說(shuō)的連接點(diǎn)的基礎(chǔ)上,來(lái)定義切入點(diǎn),你的一個(gè)類里,有15個(gè)方法,那就有幾十個(gè)連接點(diǎn)了對(duì)把,但是你并不想在所有方法附近都使用通知(使用叫織入,以后再說(shuō)),你只想讓其中的幾個(gè),在調(diào)用這幾個(gè)方法之前,之后或者拋出異常時(shí)干點(diǎn)什么,那么就用切點(diǎn)來(lái)定義這幾個(gè)方法,讓切點(diǎn)來(lái)篩選連接點(diǎn),選中那幾個(gè)你想要的方法。
              4.切面(Aspect)
              切面是通知和切入點(diǎn)的結(jié)合。現(xiàn)在發(fā)現(xiàn)了吧,沒(méi)連接點(diǎn)什么事情,連接點(diǎn)就是為了讓你好理解切點(diǎn),搞出來(lái)的,明白這個(gè)概念就行了。通知說(shuō)明了干什么和什么時(shí)候干(什么時(shí)候通過(guò)方法名中的before,after,around等就能知道),而切入點(diǎn)說(shuō)明了在哪干(指定到底是哪個(gè)方法),這就是一個(gè)完整的切面定義。
              5.引入(introduction)
              允許我們向現(xiàn)有的類添加新方法屬性。這不就是把切面(也就是新方法屬性:通知定義的)用到目標(biāo)類中嗎
              6.目標(biāo)(target)
              引入中所提到的目標(biāo)類,也就是要被通知的對(duì)象,也就是真正的業(yè)務(wù)邏輯,他可以在毫不知情的情況下,被咱們織入切面。而自己專注于業(yè)務(wù)本身的邏輯。
              7.代理(proxy)
              怎么實(shí)現(xiàn)整套aop機(jī)制的,都是通過(guò)代理,這個(gè)一會(huì)給細(xì)說(shuō)。
              8.織入(weaving)
              把切面應(yīng)用到目標(biāo)對(duì)象來(lái)創(chuàng)建新的代理對(duì)象的過(guò)程。有3種方式,spring采用的是運(yùn)行時(shí),為什么是運(yùn)行時(shí),后面解釋。
          關(guān)鍵就是:切點(diǎn)定義了哪些連接點(diǎn)會(huì)得到通知 

           4.我所理解的aop原理 
              spring用代理類包裹切面,把他們織入到Spring管理的bean中。也就是說(shuō)代理類偽裝成目標(biāo)類,它會(huì)截取對(duì)目標(biāo)類中方法的調(diào)用,讓調(diào)用者對(duì)目標(biāo)類的調(diào)用都先變成調(diào)用偽裝類,偽裝類中就先執(zhí)行了切面,再把調(diào)用轉(zhuǎn)發(fā)給真正的目標(biāo)bean。
              現(xiàn)在可以自己想一想,怎么搞出來(lái)這個(gè)偽裝類,才不會(huì)被調(diào)用者發(fā)現(xiàn)(過(guò)JVM的檢查,JAVA是強(qiáng)類型檢查,哪里都要檢查類型)。
              1.實(shí)現(xiàn)和目標(biāo)類相同的接口,我也實(shí)現(xiàn)和你一樣的接口,反正上層都是接口級(jí)別的調(diào)用,這樣我就偽裝成了和目標(biāo)類一樣的類(實(shí)現(xiàn)了同一接口,咱是兄弟了),也就逃過(guò)了類型檢查,到j(luò)ava運(yùn)行期的時(shí)候,利用多態(tài)的后期綁定(所以spring采用運(yùn)行時(shí)),偽裝類(代理類)就變成了接口的真正實(shí)現(xiàn),而他里面包裹了真實(shí)的那個(gè)目標(biāo)類,最后實(shí)現(xiàn)具體功能的還是目標(biāo)類,只不過(guò)偽裝類在之前干了點(diǎn)事情(寫日志,安全檢查,事物等)。
              這就好比,一個(gè)人讓你辦件事,每次這個(gè)時(shí)候,你弟弟就會(huì)先出來(lái),當(dāng)然他分不出來(lái)了,以為是你,你這個(gè)弟弟雖然辦不了這事,但是他知道你能辦,所以就答應(yīng)下來(lái)了,并且收了點(diǎn)禮物(寫日志),收完禮物了,給把事給人家辦了啊,所以你弟弟又找你這個(gè)哥哥來(lái)了,最后把這是辦了的還是你自己。但是你自己并不知道你弟弟已經(jīng)收禮物了,你只是專心把這件事情做好。
             
              順著這個(gè)思路想,要是本身這個(gè)類就沒(méi)實(shí)現(xiàn)一個(gè)接口呢,你怎么偽裝我,我就壓根沒(méi)有機(jī)會(huì)讓你搞出這個(gè)雙胞胎的弟弟,那么就用第2種代理方式,創(chuàng)建一個(gè)目標(biāo)類的子類,生個(gè)兒子,讓兒子偽裝我

              2.生成子類調(diào)用,這次用子類來(lái)做為偽裝類,當(dāng)然這樣也能逃過(guò)JVM的強(qiáng)類型檢查,我繼承的嗎,當(dāng)然查不出來(lái)了,子類重寫了目標(biāo)類的所有方法,當(dāng)然在這些重寫的方法中,不僅實(shí)現(xiàn)了目標(biāo)類的功能,還在這些功能之前,實(shí)現(xiàn)了一些其他的(寫日志,安全檢查,事物等)。
             這次的對(duì)比就是,兒子先從爸爸那把本事都學(xué)會(huì)了,所有人都找兒子辦事情,但是兒子每次辦和爸爸同樣的事之前,都要收點(diǎn)小禮物(寫日志),然后才去辦真正的事。當(dāng)然爸爸是不知道兒子這么干的了。 這里就有件事情要說(shuō),某些本事是爸爸獨(dú)有的(final的),兒子學(xué)不了,學(xué)不了就辦不了這件事,辦不了這個(gè)事情,自然就不能收人家禮了。

             前一種兄弟模式,spring會(huì)使用JDK的java.lang.reflect.Proxy類,它允許Spring動(dòng)態(tài)生成一個(gè)新類來(lái)實(shí)現(xiàn)必要的接口,織入通知,并且把對(duì)這些接口的任何調(diào)用都轉(zhuǎn)發(fā)到目標(biāo)類。

              后一種父子模式,spring使用CGLIB庫(kù)生成目標(biāo)類的一個(gè)子類,在創(chuàng)建這個(gè)子類的時(shí)候,spring織入通知,并且把對(duì)這個(gè)子類的調(diào)用委托到目標(biāo)類。
              相比之下,還是兄弟模式好些,他能更好的實(shí)現(xiàn)松耦合,尤其在今天都高喊著面向接口編程的情況下,父子模式只是在沒(méi)有實(shí)現(xiàn)接口的時(shí)候,也能織入通知,應(yīng)當(dāng)做一種例外。
          初學(xué)aop對(duì)aop術(shù)語(yǔ)和原理上的一些總結(jié)

          posted @ 2009-09-01 10:58 spinage 閱讀(138) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 英德市| 商丘市| 正安县| 广灵县| 革吉县| 项城市| 车致| 新绛县| 梧州市| 潜江市| 福贡县| 揭阳市| 武城县| 竹溪县| 铜鼓县| 铁力市| 漾濞| 锡林郭勒盟| 玉山县| 都安| 玛沁县| 松潘县| 左云县| 兴文县| 阳城县| 阜康市| 中牟县| 迭部县| 永定县| 兴安县| 宜兰县| 霍邱县| 宁津县| 剑阁县| 霸州市| 榆树市| 襄汾县| 安福县| 仪征市| 肥乡县| 鸡泽县|