posts - 15, comments - 20, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          2009年9月28日

                 剛開始使用new HSSFWorkbook(new FileInputStream(excelFile))來讀取Workbook,對Excel2003以前(包括2003)的版本沒有問題,但讀取Excel2007時發生如下異常:
          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)

                  該錯誤意思是說,文件中的數據是用Office2007+XML保存的,而現在卻調用OLE2 Office文檔處理,應該使用POI不同的部分來處理這些數據,比如使用XSSF來代替HSSF。

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

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

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

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

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

          假設當前已執行:select * from tab;

             (a)ppend 添加文本到緩沖區當前行尾

                 例: SQL>a  order by tname

            結果:select * from tab order by tname;

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

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

            例:SQL>c/*/tname

            結果:select tname from tab;

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

            例:SQL>c/tab

            結果:select tname from ;

             del 刪除當前行

              del n 刪除第n行 

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

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

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

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

            (r)un 執行當前緩沖區的命令

            /  執行當前緩沖區的命令

            @文件名 運行調入內存的sql文件

               例:SQL> edit s<回車>

            如果當前目錄下不存在s.sql文件,則系統自動生成s.sql文件,

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

            SQL> @s<回車>

              系統會自動查詢當前用戶下的所有表、視圖、同義詞。

                @@文件名 在.sql文件中調用另一個.sql文件時使用

                例:SQL>edit test<回車>

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

                     SQL>@@test<回車>

                     結果就是執行了文件s.sql中的語法:自動查詢當前用戶下的所有表、視圖、同義詞。

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

            get 文件名           調入存盤的sql文件

            start 文件名         運行調入內存的sql文件

            spool 文件名        把這之后的各種操作及執行結果“假脫機”即存盤到磁盤文件上,默認文件擴展名為.lst

              spool                 顯示當前的“假脫機”狀態

              spool off            停止輸出

            例:

            SQL> spool a

            SQL> spool

            正假脫機到 A.LST

            SQL> spool off

            SQL> spool

            當前無假脫機

            exit             退出SQL*PLUS

            desc 表名     顯示表的結構

            show user     顯示當前連接用戶

            show error    顯示錯誤

            show all       顯示所有68個系統變量值

            edit                打開默認編輯器,Windows系統中默認是notepad.exe,把緩沖區中最后一條SQL語句調入afiedt.buf文件中進行編輯

              edit 文件名   把當前目錄中指定的.sql文件調入編輯器進行編輯

             clear screen   清空當前屏幕顯示

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

          關于在MyEclipseWEB工程里面的JS/JSP經常會有語法錯誤提示,這是由于MyEclipse對其語法要求相當嚴格所造成的,而這些文件本身是可以運行并沒有什么錯誤的,在你實際應用部署中并無影響.

          此問題解決辦法有兩種:

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

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

          另外還可以通過使用Remove All Validation Markers此菜單項進移除所有的驗證語法錯誤提示信息。

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

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

          嚴重: IOException while loading persisted sessions: java.io.EOFException
          嚴重: Exception loading sessions from persistent storage

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

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

          eclipse 無法啟動 JVM terminated. Exit code=-1
          eclipse.ini中內存設置過大的問題,以前我修改過內存設置,一直都好好的,之前eclipse.ini的配置如下:

           

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

          現在修改了一下,-Xms256m改成-Xms128m,把Xmx512m  改為 Xmx256m,結果還真的好了,沒想到居然是這樣的小問題引起來的。

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

          第二個,我們的項目采用svn管理,查找.svn,把所有.svn的文件刪除

          第三個,查看項目根文件夾下的.metadata,發現.metadata下面差很多插件,把現有項目的.metadate覆蓋進去即可

           

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

           

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

          6、<>

          7、like’%dd’百分號在前

          8、not in ,not exist. 

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

          利用pinyin4j開源的一個小項目取中文首字母
           
          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) | 評論 (0)編輯 收藏

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

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

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

          序列化機制只保存對象的類型信息,屬性的類型信息和屬性值,和方法沒有什么關系,你就是給這個類增加10000個方法,序列化內容也不會增加任何東西。

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

          1.寫一個方法,用一個for循環打印九九乘法表
          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.給定一個java.util.Date對象,如何轉化為”2007-3-22 20:23:22”格式的字符串
            Java code
              /**
               * 將某個日期以固定格式轉化成字符串
               * @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.寫一個方法,能夠判斷任意一個整數是否素數
           
              /**
              * 判斷任意一個整數是否素數
              * @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.寫一個方法,輸入任意一個整數,返回它的階乘
          Java code    
               /**
                *獲得任意一個整數的階乘
                *@param n
                *@returnn!
                */
                public int factorial(int num)
                {
                  //遞歸
                  if(num == 1)
                  {
                      return 1;
                  }
                  return num*factorial(num-1);
                }

          5.寫一個方法,用二分查找法判斷任意整數在任意整數數組里面是否存在,若存在就返回它在數組中的索引位置,不存在返回-1
          Java code    
                /**
                 *二分查找特定整數在整型數組中的位置(遞歸)
                 *@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;
                   //如果查找的數要比開始索引的數據要小或者是比結束索引的書要大,或者開始查找的索引值大于結束的索引值返回-1沒有查到
                   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;
                   }
                 }
                
                 /**
                  *二分查找特定整數在整型數組中的位置(非遞歸)
                  *@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) | 評論 (0)編輯 收藏

          1.一道SQL語句面試題,關于group by
          表內容:
          2005-05-09 勝
          2005-05-09 勝
          2005-05-09 負
          2005-05-09 負
          2005-05-10 勝
          2005-05-10 負
          2005-05-10 負

          如果要生成下列結果, 該如何寫sql語句?

                      勝 負
          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','負')
          insert into #tmp values('2005-05-09','負')
          insert into #tmp values('2005-05-10','勝')
          insert into #tmp values('2005-05-10','負')
          insert into #tmp values('2005-05-10','負')

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

          2.請教一個面試中遇到的SQL語句的查詢問題
          表中有A B C三列,用SQL語句實現:當A列大于B列時選擇A列否則選擇B列,當B列大于C列時選擇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.面試題:一個日期判斷的sql語句?
          請取出tb_send表中日期(SendTime字段)為當天的所有記錄?(SendTime字段為datetime型,包含日期與時間)
          ------------------------------------------
          select * from tb where datediff(dd,SendTime,getdate())=0

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

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

          區別:
          用戶臨時表只對創建這個表的用戶的Session可見,對其他進程是不可見的.
          當創建它的進程消失時這個臨時表就自動刪除.

          全局臨時表對整個SQL Server實例都可見,但是所有訪問它的Session都消失的時候,它也自動刪除.

          6.sqlserver2000是一種大型數據庫,他的存儲容量只受存儲介質的限制,請問它是通過什么方式實現這種無限容量機制的。
          ------------------------------------------
          它的所有數據都存儲在數據文件中(*.dbf),所以只要文件夠大,SQL    Server的存儲容量是可以擴大的.

          SQL Server 2000 數據庫有三種類型的文件:

          主要數據文件
          主要數據文件是數據庫的起點,指向數據庫中文件的其它部分。每個數據庫都有一個主要數據文件。主要數據文件的推薦文件擴展名是 .mdf。

          次要數據文件
          次要數據文件包含除主要數據文件外的所有數據文件。有些數據庫可能沒有次要數據文件,而有些數據庫則有多個次要數據文件。次要數據文件的推薦文件擴展名是 .ndf。

          日志文件
          日志文件包含恢復數據庫所需的所有日志信息。每個數據庫必須至少有一個日志文件,但可以不止一個。日志文件的推薦文件擴展名是 .ldf。

          7.請用一個sql語句得出結果
          從table1,table2中取出如table3所列格式數據,注意提供的數據及結果不準確,只是作為一個格式向大家請教。
          如使用存儲過程也可以。

          table1

          月份mon 部門dep 業績yj
          -------------------------------
          一月份      01      10
          一月份      02      10
          一月份      03      5
          二月份      02      8
          二月份      04      9
          三月份      03      8

          table2

          部門dep      部門名稱dname
          --------------------------------
                01      國內業務一部
                02      國內業務二部
                03      國內業務三部
                04      國際業務部

          table3 (result)

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

          ------------------------------------------
          1)
          select a.部門名稱dname,b.業績yj as '一月份',c.業績yj as '二月份',d.業績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.華為一道面試題
          一個表中的Id有多個記錄,把所有這個id的記錄查出來,并顯示共有多少條記錄數。
          ------------------------------------------
          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) | 評論 (2)編輯 收藏

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

          寬松的拼音排序法
          原理:漢字最早是GB2312編碼,收錄了六千多個漢字,是按拼音排序的,編碼是連續的。 后來出現了GBK編碼,對GB2312進行了擴展,到了兩萬多漢字,并且兼容GB2312,也就是說GB2312中的漢字編碼是原封不動搬到GBK中的(在GBK編碼中[B0-D7]區中)。

          如果我們只關心這6000多個漢字的順序,就可以用下面的方法實現漢字寬松排序。

          /**
          * @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);
              }
          }

          在對[孫, 孟, 宋, 尹, 廖, 張, 徐, 昆, 曹, 曾,怡]這幾個漢字排序,結果是:[曹, 昆, 廖, 孟, 宋, 孫, 徐, 尹, 曾, 張, 怡]。最后一個 怡 有問題,不該排在最后的。

          注意:這個程序有兩個不足

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

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

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

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

          嚴格的拼音排序法
          為了解決寬松的拼音的兩點不足,可以通過實現漢語拼音的函數來解決。goolge下看到sf上有個pinyin4j的項目,可以解決這個問題,pinyin4j的項目地址是:http://pinyin4j.sourceforge.net/。

          實現代碼:

          /**
            * @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) { // 兩個字符都是漢字
                              if (!pinyin1.equals(pinyin2)) {
                                  return pinyin1.compareTo(pinyin2);
                              }
                          } else {
                              return codePoint1 - codePoint2;
                          }
                      }
                  }
                  return o1.length() - o2.length();
              }

              /**
               * 字符的拼音,多音字就得到第一個拼音。不是漢字,就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) | 評論 (0)編輯 收藏

          在全局數據庫ORCL下創建一個用戶
          首先在開始--》運行——》sqlplus,然后輸入 sys/change_on_install as sysdba
          以sys權限登陸進去
          然后可以進行操作:
          創建用戶 create user test indentified by test;
          這樣就創建了一個用戶名密碼都為test的用戶
          但這個時候test還是不能登陸成功的,我們需要賦予相應的權限
          首先賦予create session的權限
          grant create session to test;
          這樣test用戶就能成功登陸進去
          但是此時用戶還是不能創建表 我們需要賦予用戶創建表的權限:
          grant create table to test;
          但是用戶此時還不能創建表 因為需要有使用表空間的權限(相當于 用戶有了進房間的鑰匙 但是沒有進大門的鑰匙)
          所以也應該賦予相應的權限
          grant unlimited tablespace to test;
          這個時候用戶就擁有了創建表的權限 由于表是用戶test的 相應的他就擁有了對創建的表的增刪查改的權限了
          我們要查看用戶擁有什么權限可以通過查詢一個系統的視圖(數字字典)
          select * from user_sys_privs;
          這樣就可以知道當前用戶的權限

          撤銷權限 revoke create table from test;

          場景:
          用戶test   用戶test1
          test1的用戶創建了個表mytab 并且插入了一些數據
          那么 test用戶是否可以訪問到test1的mytab怎么訪問?
          答:不可以,必須先授權
          test1必須授權給test :grant select on mytab to test;
          那么這個時候test可以通過 select * from test1.mytab;來訪問mytab中的數據
          如果想把某個表(對象)的所有權限都賦予給test那么可以:
          grant all on mytab to test;
          撤銷所有權限
          revoke all on mytab to test;


          總結
          對于系統權限由sys來做
          對于對象權限由 誰擁有誰授權
          系統權限:
             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;  //表示把創建表的權限賦予所有人

             select * from user_sys_privs;  //返回當前用戶的所有系統權限

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

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

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

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

            權限的傳遞
            系統權限的傳遞:
            grant alter table to A with admin option;
            那么A可以通過把該權限傳遞給B,如果想B也可以傳遞下去那么可以也帶上with admin option
            grant alter table to B;
            對象權限的傳遞:
            grant select on mytab to A with grant option;
            那么A可以把在表mytab的select權限賦予給B,如果B想也能傳遞該select權限也可以帶上with grant option
            grant select on mytab to B;

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

          --創建用戶
          create user keeltest identified by keeltest;
          --分配權限
          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) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 花莲市| 张北县| 平顶山市| 石台县| 含山县| 行唐县| 平武县| 寿阳县| 曲麻莱县| 双牌县| 莫力| 涞源县| 讷河市| 嵊泗县| 曲阜市| 邵阳市| 阿瓦提县| 绩溪县| 永年县| 读书| 班戈县| 商城县| 饶河县| 平凉市| 开平市| 磴口县| 南岸区| 通州市| 聂荣县| 尚志市| 棋牌| 宁化县| 靖远县| 齐齐哈尔市| 融水| 开原市| 漠河县| 金山区| 饶平县| 富平县| 比如县|