michaelwang1978

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            10 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

          2005年10月6日 #

          其實,這個應用是個簡單得不能再簡單的JavaScript應用,只不過被冠以了AJAX這個今年2月份才誕生的名詞以后忽然熱了起來。AJAX這一個單詞,居然可以把一堆98年就開始用的技術推到前臺來,成為當今在特定的圈子里最熱的詞匯,倒是一個典型的tipping point(臨界點)的案例。就像99年Netcenter用的RSS終于在2002年開始被從blogger撿起來,并在2005年煥發了青春。

          這些用Javascript+XMLHTTPRequest的做法給我們提供了一個很廣闊的空間,可以有很多的想象。比如,在任何靜態的頁面里面,只要加入這段代碼也就可以擁有這個功能了。

          <script language=Javascript src="http://home.wangjianshuo.com/scripts/php/markit.php">
          </script>

          把鼠標放在上面還可以知道是從哪個IP在什么時間批注的。值得注意的是,這只是一個最簡單的SAJAX應用,如果把它應用于地圖,以及應用于多個網站之間的聯合,會有更讓人驚訝的結果出來。估計,以后客齊集的后臺的管理系統將會是最早使用這些簡單但是有效的思想的地方。

          注:那些紅線,只是在Word里面隨手畫的。
          注二:沒有經過測試,FireFox下面什么樣子不曉得,放在其他頁面怎么樣也不曉得。。

          posted @ 2005-10-21 23:05 Michael 閱讀(182) | 評論 (0)編輯 收藏

          我們期待自己成為一個優秀的軟件模型設計者,但是,要怎樣做,又從哪里開始呢? 

            將下列原則應用到你的軟件工程中,你會獲得立桿見影的成果。 

            1. 人遠比技術重要 

            你開發軟件是為了供別人使用,沒有人使用的軟件只是沒有意義的數據的集合而已。許多在軟件方面很有成就的行家在他們事業的初期卻表現平平,因為他們那時侯將主要精力都集中在技術上。顯然,構件(components),EJB(Enterprise Java Beans)和代理(agent)是很有趣的東西。但是對于用戶來說,如果你設計的軟件很難使用或者不能滿足他們的需求,后臺用再好的技術也于事無補。多花點時間到軟件需求和設計一個使用戶能很容易理解的界面上。 
           
            2. 理解你要實現的東西 

            好的軟件設計人員把大多數時間花費在建立系統模型上,偶爾寫一些源代碼,但那只不過是為了驗證設計過程中所遇到的問題。這將使他們的設計方案更加可行。 

            3. 謙虛是必須的品格 

            你不可能知道一切,你甚至要很努力才能獲得足夠用的知識。軟件開發是一項復雜而艱巨的工作,因為軟件開發所用到的工具和技術是在不斷更新的。而且,一個人也不可能了解軟件開發的所有過程。在日常生活中你每天接觸到的新鮮事物可能不會太多。但是對于從事軟件開發的人來說,每天可以學習很多新東西(如果愿意的話)。 

            4. 需求就是需求 

            如果你沒有任何需求,你就不要動手開發任何軟件。成功的軟件取決于時間(在用戶要求的時間內完成)、預算和是否滿足用戶的需求。如果你不能確切知道用戶需要的是什么,或者軟件的需求定義,那么你的工程注定會失敗。 

            5. 需求其實很少改變,改變的是你對需求的理解 

            Object ToolSmiths公司(www.objecttoolsmiths.com)的Doug Smith常喜歡說:“分析是一門科學,設計是一門藝術”。他的意思是說在眾多的“正確”分析模型中只存在一個最“正確”分析模型可以完全滿足解決某個具體問題的需要(我理解的意思是需求分析需要一絲不茍、精確的完成,而設計的時候反而可以發揮創造力和想象力 - 譯者注)。 

            如果需求經常改動,很可能是你沒有作好需求分析,并不是需求真的改變了。 

            你可以抱怨用戶不能告訴你他們想得到什么,但是不要忘記,收集需求信息是你工作。 

            你可以說是新來的開發人員把事情搞得一團糟,但是,你應該確定在工程的第一天就告訴他們應該做什么和怎樣去做。 

            如果你覺得公司不讓你與用戶充分接觸,那只能說明公司的管理層并不是真正支持你的項目。 

            你可以抱怨公司有關軟件工程的管理制度不合理,但你必須了解大多同行公司是怎么做的。 

            你可以借口說你們的競爭對手的成功是因為他們有了一個新的理念,但是為什么你沒先想到呢? 

            需求真正改變的情況很少,但是沒有做好需求分析工作的理由卻很多。 

            6. 經常閱讀 

            在這個每日都在發生變化的產業中,你不可能在已取得的成就上陶醉太久。 

            每個月至少讀2、3本專業雜志或者1本專業書籍。保持不落伍需要付出很多的時間和金錢,但會使你成為一個很有實力的競爭者。 

            7. 降低軟件模塊間的耦合度 

            高耦合度的系統是很難維護的。一處的修改引起另一處甚至更多處的變動。 

            你可以通過以下方法降低程序的耦合度:隱藏實現細節,強制構件接口定義,不使用公用數據結構,不讓應用程序直接操作數據庫(我的經驗法則是:當應用程序員在寫SQL代碼的時候,你的程序的耦合度就已經很高了)。 

            耦合度低的軟件可以很容易被重用、維護和擴充。 

            8. 提高軟件的內聚性 

            如果一個軟件的模塊只實現一個功能,那么該模塊具有高內聚性。高內聚性的軟件更容易維護和改進。 

            判斷一個模塊是否有高的內聚性,看一看你是否能夠用一個簡單的句子描述它的功能就行了。如果你用了一段話或者你需要使用類似“和”、“或”等連詞,則說明你需要將該模塊細化。 

            只有高內聚性的模塊才可能被重用。 

            9. 考慮軟件的移植性 

            移植是軟件開發中一項具體而又實際的工作,不要相信某些軟件工具的廣告宣傳(比如java 的宣傳口號write once run many ? 譯者注)。 

            即使僅僅對軟件進行常規升級,也要把這看得和向另一個操作系統或數據庫移植一樣重要。 

            記得從16位Windows移植到32位windows的“樂趣”嗎 ?當你使用了某個操作系統的特性,如它的進程間通信(IPC)策略,或用某數據庫專有語言寫了存儲過程。你的軟件和那個特定的產品結合度就已經很高了。 

            好的軟件設計者把那些特有的實現細節打包隱藏起來,所以,當那些特性該變的時候,你的僅僅需要更新那個包就可以了。 

            10. 接受變化 

            這是一句老話了:唯一不變的只有變化。 

            你應該將所有系統將可能發生的變化以及潛在需求記錄下來,以便將來能夠實現(參見“Architecting for Change”,Thinking Objectively, May 1999) 

            通過在建模期間考慮這些假設的情況,你就有可能開發出足夠強壯且容易維護的軟件。設計強壯的軟件是你最基本的目標。 

            11. 不要低估對軟件規模的需求 

            Internet 帶給我們的最大的教訓是你必須在軟件開發的最初階段就考慮軟件規模的可擴充性。 

            今天只有100人的部門使用的應用程序,明天可能會被有好幾萬人的組織使用,下月,通過因特網可能會有幾百萬人使用它。 

            在軟件設計的初期,根據在用例模型中定義的必須支持的基本事務處理,確定軟件的基本功能。然后,在建造系統的時候再逐步加入比較常用的功能。 

            在設計的開始考慮軟件的規模需求,避免在用戶群突然增大的情況下,重寫軟件。 

            12. 性能僅僅是很多設計因素之一 

            關注軟件設計中的一個重要因素--性能,這好象也是用戶最關心的事情。一個性能不佳的軟件將不可避免被重寫。 

            但是你的設計還必須具有可靠性,可用性,便攜性和可擴展性。你應該在工程開始就應該定義并區分好這些因素,以便在工作中恰當使用。性能可以是,也可以不是優先級最高的因素,我的觀點是,給每個設計因素應有的考慮。 

            13. 管理接口 

            “UML User Guide”(Grady Booch,Ivar Jacobson和Jim Rumbaugh ,Addison Wesley, 1999)中指出,你應該在開發階段的早期就定義軟件模塊之間的接口。 

            這有助于你的開發人員全面理解軟件的設計結構并取得一致意見,讓各模塊開發小組相對獨立的工作。一旦模塊的接口確定之后,模塊怎樣實現就不是很重要了。 

            從根本上說,如果你不能夠定義你的模塊“從外部看上去會是什么樣子”,你肯定也不清楚模塊內要實現什么。 

            14. 走近路需要更長的時間 

            在軟件開發中沒有捷徑可以走。 

            縮短你的在需求分析上花的時間,結果只能是開發出來的軟件不能滿足用戶的需求,必須被重寫。 

            在軟件建模上每節省一周,在將來的編碼階段可能會多花幾周時間,因為你在全面思考之前就動手寫程序。 

            你為了節省一天的測試時間而漏掉了一個bug,在將來的維護階段,可能需要花幾周甚至幾個月的時間去修復。與其如此,還不如重新安排一下項目計劃。 

            避免走捷徑,只做一次但要做對(do it once by doing it right)。 

            15. 別信賴任何人 

            產品和服務銷售公司不是你的朋友,你的大部分員工和高層管理人員也不是。 

            大部分產品供應商希望把你牢牢綁在他們的產品上,可能是操作系統,數據庫或者某個開發工具。 

            大部分的顧問和承包商只關心你的錢并不是你的工程(停止向他們付款,看一看他們會在周圍呆多長時間)。 

            大部分程序員認為他們自己比其他人更優秀,他們可能拋棄你設計的模型而用自己認為更好的。 

            只有良好的溝通才能解決這些問題。 

            要明確的是,不要只依靠一家產品或服務提供商,即使你的公司(或組織)已經在建模、文檔和過程等方面向那個公司投入了很多錢。 

            16. 證明你的設計在實踐中可行 

            在設計的時候應當先建立一個技術原型, 或者稱為“端到端”原型。以證明你的設計是能夠工作的。 

            你應該在開發工作的早期做這些事情,因為,如果軟件的設計方案是不可行的,在編碼實現階段無論采取什么措施都于事無補。技術原型將證明你的設計的可行性,從而,你的設計將更容易獲得支持。 

            17. 應用已知的模式 

            目前,我們有大量現成的分析和設計模式以及問題的解決方案可以使用。 

            一般來說,好的模型設計和開發人員,都會避免重新設計已經成熟的并被廣泛應用的東西。 
          http://www.ambysoft.com/processPatternsPage.html 收藏了許多開發模式的信息。 

            18. 研究每個模型的長處和弱點 

            目前有很多種類的模型可以使用,如下圖所示。用例捕獲的是系統行為需求,數據模型則描述支持一個系統運行所需要的數據構成。你可能會試圖在用例中加入實際數據描述,但是,這對開發者不是非常有用。同樣,數據模型對描述軟件需求來說是無用的。每個模型在你建模過程中有其相應的位置,但是,你需要明白在什么地方,什么時候使用它們。 

            19. 在現有任務中應用多個模型 

            當你收集需求的時候,考慮使用用例模型,用戶界面模型和領域級的類模型。 

            當你設計軟件的時候,應該考慮制作類模型,順序圖、狀態圖、協作圖和最終的軟件實際物理模型。 

            程序設計人員應該慢慢意識到,僅僅使用一個模型而實現的軟件要么不能夠很好地滿足用戶的需求,要么很難擴展。 

            20. 教育你的聽眾 

            你花了很大力氣建立一個很成熟的系統模型,而你的聽眾卻不能理解它們,甚至更糟-連為什么要先建立模型都不知道。那么你的工作是毫無意義的。 

            教給你開發人員基本的建模知識;否則,他們會只看看你畫的漂亮圖表,然后繼續編寫不規范的程序。 

            另外, 你還需要告訴你的用戶一些需求建模的基礎知識。給他們解釋你的用例(uses case)和用戶界面模型,以使他們能夠明白你要表達地東西。當每個人都能使用一個通用的設計語言的時候(比如UML-譯者注),你的團隊才能實現真正的合作。 

            21. 帶工具的傻瓜還是傻瓜 

            你給我CAD/CAM工具,請我設計一座橋。但是,如果那座橋建成的話,我肯定不想當第一個從橋上過的人,因為我對建筑一竅不通。 

            使用一個很優秀的CASE工具并不能使你成為一個建模專家,只能使你成為一個優秀CASE工具的使用者。成為一個優秀的建模專家需要多年的積累,不會是一周針對某個價值幾千美元工具的培訓。一個優秀的CASE工具是很重要,但你必須學習使用它,并能夠使用它設計它支持的模型。 

            22. 理解完整的過程 

            好的設計人員應該理解整個軟件過程,盡管他們可能不是精通全部實現細節。 

            軟件開發是一個很復雜的過程,還記得《object-oriented software process》第36頁的內容嗎?除了編程、建模、測試等你擅長工作外,還有很多工作要做。 

            好的設計者需要考慮全局。必須從長遠考慮如何使軟件滿足用戶需要,如何提供維護和技術支持等。 

            23. 常做測試,早做測試 

            如果測試對你的軟件來說是無所謂的,那么你的軟件多半也沒什么必要被開發出來。 

            建立一個技術原型供技術評審使用,以檢驗你的軟件模型。 

            在軟件生命周期中,越晚發現的錯誤越難修改,修改成本越昂貴。盡可能早的做測試是很值得的。 

            24. 把你的工作歸檔 

            不值得歸檔的工作往往也不值得做。歸檔你的設想,以及根據設想做出的決定;歸檔軟件模型中很重要但不很明顯的部分。 給每個模型一些概要描述以使別人很快明白模型所表達的內容。 

            25. 技術會變,基本原理不會 

            如果有人說“使用某種開發語言、某個工具或某某技術,我們就不需要再做需求分析,建模,編碼或測試”。不要相信,這只說明他還缺乏經驗。拋開技術和人的因素,實際上軟件開發的基本原理自20世紀70年代以來就沒有改變過。你必須還定義需求,建模,編碼,測試,配置,面對風險,發布產品,管理工作人員等等。 

            軟件建模技術是需要多年的實際工作才能完全掌握的。好在你可以從我的建議開始,完善你們自己的軟件開發經驗。 

            以雞湯開始,加入自己的蔬菜。然后,開始享受你自己的豐盛晚餐吧
          posted @ 2005-10-11 09:26 Michael 閱讀(158) | 評論 (0)編輯 收藏

          現在到eclipse網站可以下到中文包了!
              有兩個,分別是:NLpack1-eclipse-SDK-3.1.1a-win32.zip和NLpack1_FeatureOverlay-eclipse-SDK-3.1.1.zip。
              后者是前者的補充。
             
              在我的機子上,這兩個中文包只適合eclipse3.1.1版本,3.1版本都不適合,但網上有人說可以用,就不得而知了。eclipse3.1.1版本已經出了一段時日了,但一直都沒有使用過,今天是試用了一下,Lomboz還可以用,但de.strutsbox_20050804就不能用了。
              不過,裝上lomboz,NLpack1_FeatureOverlay-eclipse-SDK-3.1.1.zip就不怎么起作用了。

              myeclipseME-4.0GA_E3.1ManualInstall版在這個版本下面也不能使用。

              eclipse3.1.1在功能上與3.1版沒什么區別,但對插件兼容就不敢恭維了。

              eclipse3.1.1.jpg
          posted @ 2005-10-11 09:15 Michael 閱讀(1277) | 評論 (0)編輯 收藏

          開放源代碼協會通過Linux軟件開發公司Ximian開始了一個旨在將微軟.Net平臺移植到Linux上來的項目。這個叫做Mono工程的項目包括創建一個開發平臺允許人們為基于Linux和基于Windows系統的.Net開發應用程序。據Ximian公司的首席技術官員Miguel de Icaza說Mono項目的起因是GNOME社團特別是Ximain公司對于一個改進的開發工具的需要。

          但是Mono項目的影響確是更加深遠的,因為這些開發工具是基于CLI(通用語言架構)和微軟提交給歐洲計算機制造協會(ECMA)的C#實現標準的。如果Mono能夠完成基于這些標準創建一套Linux開發工具集的目標的話,開發者將能夠編寫同時在Windows和Linux上運行的.Net程序,這些程序甚至還可能在其它非Windows的操作系統上運行,比方Unix。

          除了實際的開發過程,Mono項目的工具必須在開放源代碼社團的內部完成而不能違反微軟的知識產權專利--這實際上意味著開發者們必須基于標準重新構造這些工具而不能查看微軟的任何源代碼。

          Mono項目包括三個核心的部分:一個C#語言的編譯器,一個CLI和一個類庫。 CLI是包含了類加載器的虛擬機,實時的編譯器,和一個運行時環境的垃圾收集器。CLI這個組件將允許用C#編寫的應用程序能夠在象Linux這樣的非Windows操作系統上運行。這與Java世界中Java虛擬機能夠讓一個應用程序在不同的操作系統上運行是類似的。

          Mono項目的類庫能夠讓應用程序完成核心的諸如XML處理,文件輸入輸出,和連接網絡之類的任務。它將會和微軟的CLI兼容(與微軟在.Net framework中發布的東西緊密的配套),還有一點就是將由開放源代碼團體編寫的額外的類庫也將和CLI兼容。

          Ximian公司的de Icaza希望在年底到達項目的一個里程碑,這時編譯器將能夠編譯類庫了。圖形用戶界面組件--創建GUI程序所需的類庫--將在明年中完成。

          “我們在這個方面工作的原因是希望升級我們的開發平臺來創建我們的Evolution桌面應用程序,”de Icazo說。Evolution是Ximian公司的電子郵件客戶端及個人和工作組信息管理程序。“當我們看見.Net framework的時候,我們覺得這些就是我們將用來開發我們下一代產品要使用的工具,”他說。

          Ximian并不將Mono和它自己看作是給Linux開發者一種途徑在可用的開發工具方面趕上Windows。其實,Linux開發者將更喜歡用他們目前使用的工具來編寫的編譯應用程序。Ximian 將另一個開放源代碼項目,SharpDevelop看作是用來提供與微軟Visual Studio .Net類似的集成開發環境的一種途徑。

          通過以開放源代碼的方式開發Mono,這個項目包含了許多對開發過程擁有廣泛興趣的人們。雖然Ximian可能希望找一些改進的開發工具來加速它的應用程序的開發過程,但其它的開發者可能是希望找到能夠讓他們在Windows上編寫程序然后在Linux系統上運行它們的開發工具。

          其中的一個大問題是如何避免微軟的知識產權保護?!拔覀儽苊庵R產權保護的方法是堅持非研究性的主題并使用現有的技術實現其功能,”de Icaza說。例如,Mono JIT編譯器沒有使用任何先進的JIT編譯器技術。相反Mono的版本是基于老的JIT技術的。

          De Icaza還聲稱Mono必須“著眼大處”還不僅僅是去年ECMA規定了些什么。也就是說,Ximian計劃參與標準的制定過程并創建類庫來提高.Net framework的薄弱之處,比方說電子郵件管理。

          據Giga Information Group的副分析師Stacey Quandt稱,微軟不太可能支持Mono因為其授權是與GNU 通用公眾證書為C#的授權和GNU 弱公眾證書為類庫和運行庫的授權聯系在一起的。

          但即使微軟不支持Mono,Mono的存在也證實了微軟對于.Net能夠移植到其它平臺的聲明是正確的。

          Quandt說面向更廣泛的開發團體是Mono面臨的另一個挑戰。例如IBM和Sun都在Java上花費了巨額的投資,自然也就很難容忍競爭行為。
          posted @ 2005-10-11 08:46 Michael 閱讀(196) | 評論 (0)編輯 收藏

          結合 JavaBean 和 JDBC,我們可以編寫出結構清晰,使用方便的數據庫應用程序。

          db 類封裝了數據庫操作,包括建立和關閉連接,以及執行SQL查詢操作。
          emp類使用db類并針對EMP 表完成了根據工號查詢員工資料的功能,并提供了員工姓名的getter方法。

          package db;

          import java.net.*;
          import java.sql.*;
          import java.io.*;


          public class db {
           Connection conn;
           Statement stmt;
           ResultSet rs;
           
           //數據庫連接
           public void getConnection(){
            try{
             Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
             conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=Hotel;User=sa;Password=sa");
            }
            catch (Exception e){
             System.out.println(e.getMessage());
             }
            }
           
           //關閉連接
           public void closeConnection(){
            try{
             if (conn != null){
              conn.close();
             }
            }
            catch(Exception e){
             System.out.println(e.getMessage());
            }
           }
           
           //對數據庫進行操作
           public ResultSet executeQuery(String sql){
            rs = null;
            try{
             getConnection();
             if (conn != null){
              stmt = conn.createStatement();
              rs = stmt.executeQuery(sql);
             }
            }
            catch (Exception e){
             System.out.println(e.getMessage());
            }
            return rs;
           }

          }

          package db;

          import java.sql.*;


          public class emp extends db {
           private String empno;
           private String ename;
           
           public emp(String em){
            empno = em;
           }
           
           //執行Sql語句 對屬性ename賦值
           public void query(){
            try{
             String sSql = "select * from emp where empno =" + empno;
             ResultSet rs = executeQuery(sSql);
             if (rs.next()){
              ename = rs.getString("ename");
             }
             
            }
            catch (Exception e){
             System.out.println(e.getMessage());
            }
           }
           
           //得到ename
           public String getEname(){
            return ename;
           }

          }


          package db;

          import java.io.*;
          import java.sql.*;


          public class TestBean {
           public static void main(String args[]){
            String empno;
            emp em;
            
            try{
             System.out.println("請輸入工號:");
             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
             empno = br.readLine();
             em = new em(empno);
             em.query();
             System.out.println("工號為" + empno + "的員工姓名是:" + em.getEname());
             em.closeConnection();
             
            }
            catch (Exception e){
             System.out.println(e.getMessage());
            }
            
           }

          }


          posted @ 2005-10-08 21:28 Michael 閱讀(397) | 評論 (0)編輯 收藏

          Java數據庫連接(JDBC)API是一系列能夠讓Java編程人員訪問數據庫的接口,各個開發商的接口并不完全相同。在使用多年的Oracle公司的JDBC后,我積累了許多技巧,這些技巧能夠使我們更好地發揮系統的性能和實現更多的功能。

            1、在客戶端軟件開發中使用Thin驅動程序

            在開發Java軟件方面,Oracle的數據庫提供了四種類型的驅動程序,二種用于應用軟件、applets、servlets等客戶端軟件,另外二種用于數據庫中的Java存儲過程等服務器端軟件。在客戶機端軟件的開發中,我們可以選擇OCI驅動程序或Thin驅動程序。OCI驅動程序利用Java本地化接口(JNI),通過Oracle客戶端軟件與數據庫進行通訊。Thin驅動程序是純Java驅動程序,它直接與數據庫進行通訊。為了獲得最高的性能,Oracle建議在客戶端軟件的開發中使用OCI驅動程序,這似乎是正確的。但我建議使用Thin驅動程序,因為通過多次測試發現,在通常情況下,Thin驅動程序的性能都超過了OCI驅動程序。

            2、關閉自動提交功能,提高系統性能

            在第一次建立與數據庫的連接時,在缺省情況下,連接是在自動提交模式下的。為了獲得更好的性能,可以通過調用帶布爾值false參數的Connection類的setAutoCommit()方法關閉自動提交功能,如下所示:

            conn.setAutoCommit(false);

            值得注意的是,一旦關閉了自動提交功能,我們就需要通過調用Connection類的commit()和rollback()方法來人工的方式對事務進行管理。

            3、在動態SQL或有時間限制的命令中使用Statement對象

            在執行SQL命令時,我們有二種選擇:可以使用PreparedStatement對象,也可以使用Statement對象。無論多少次地使用同一個SQL命令,PreparedStatement都只對它解析和編譯一次。當使用Statement對象時,每次執行一個SQL命令時,都會對它進行解析和編譯。這可能會使你認為,使用PreparedStatement對象比使用Statement對象的速度更快。然而,我進行的測試表明,在客戶端軟件中,情況并非如此。因此,在有時間限制的SQL操作中,除非成批地處理SQL命令,我們應當考慮使用Statement對象。

            此外,使用Statement對象也使得編寫動態SQL命令更加簡單,因為我們可以將字符串連接在一起,建立一個有效的SQL命令。因此,我認為,Statement對象可以使動態SQL命令的創建和執行變得更加簡單。

            4、利用helper函數對動態SQL命令進行格式化

            在創建使用Statement對象執行的動態SQL命令時,我們需要處理一些格式化方面的問題。例如,如果我們想創建一個將名字O'Reilly插入表中的SQL命令,則必須使用二個相連的“''”號替換O'Reilly中的“'”號。完成這些工作的最好的方法是創建一個完成替換操作的helper方法,然后在連接字符串心服用公式表達一個SQL命令時,使用創建的helper方法。與此類似的是,我們可以讓helper方法接受一個Date型的值,然后讓它輸出基于Oracle的to_date()函數的字符串表達式。

            5、利用PreparedStatement對象提高數據庫的總體效率

            在使用PreparedStatement對象執行SQL命令時,命令被數據庫進行解析和編譯,然后被放到命令緩沖區。然后,每當執行同一個PreparedStatement對象時,它就會被再解析一次,但不會被再次編譯。在緩沖區中可以發現預編譯的命令,并且可以重新使用。在有大量用戶的企業級應用軟件中,經常會重復執行相同的SQL命令,使用PreparedStatement對象帶來的編譯次數的減少能夠提高數據庫的總體性能。如果不是在客戶端創建、預備、執行PreparedStatement任務需要的時間長于Statement任務,我會建議在除動態SQL命令之外的所有情況下使用PreparedStatement對象。

            6、在成批處理重復的插入或更新操作中使用PreparedStatement對象

            如果成批地處理插入和更新操作,就能夠顯著地減少它們所需要的時間。Oracle提供的Statement和 CallableStatement并不真正地支持批處理,只有PreparedStatement對象才真正地支持批處理。我們可以使用addBatch()和executeBatch()方法選擇標準的JDBC批處理,或者通過利用PreparedStatement對象的setExecuteBatch()方法和標準的executeUpdate()方法選擇速度更快的Oracle專有的方法。要使用Oracle專有的批處理機制,可以以如下所示的方式調用setExecuteBatch():
          PreparedStatement pstmt3D null;
          try {
          ((OraclePreparedStatement)
          pstmt).setExecuteBatch(30);
          ...
          pstmt.executeUpdate();
          }


            調用setExecuteBatch()時指定的值是一個上限,當達到該值時,就會自動地引發SQL命令執行,標準的executeUpdate()方法就會被作為批處理送到數據庫中。我們可以通過調用PreparedStatement類的sendBatch()方法隨時傳輸批處理任務。

            7、使用Oracle locator方法插入、更新大對象(LOB)

            Oracle的PreparedStatement類不完全支持BLOB和CLOB等大對象的處理,尤其是Thin驅動程序不支持利用PreparedStatement對象的setObject()和setBinaryStream()方法設置BLOB的值,也不支持利用setCharacterStream()方法設置CLOB的值。只有locator本身中的方法才能夠從數據庫中獲取LOB類型的值。可以使用PreparedStatement對象插入或更新LOB,但需要使用locator才能獲取LOB的值。由于存在這二個問題,因此,我建議使用locator的方法來插入、更新或獲取LOB的值。

            8、使用SQL92語法調用存儲過程

            在調用存儲過程時,我們可以使用SQL92或Oracle PL/SQL,由于使用Oracle PL/SQL并沒有什么實際的好處,而且會給以后維護你的應用程序的開發人員帶來麻煩,因此,我建議在調用存儲過程時使用SQL92。

            9、使用Object SQL將對象模式轉移到數據庫中

            既然可以將Oracle的數據庫作為一種面向對象的數據庫來使用,就可以考慮將應用程序中的面向對象模式轉到數據庫中。目前的方法是創建Java bean作為偽裝的數據庫對象,將它們的屬性映射到關系表中,然后在這些bean中添加方法。盡管這樣作在Java中沒有什么問題,但由于操作都是在數據庫之外進行的,因此其他訪問數據庫的應用軟件無法利用對象模式。如果利用Oracle的面向對象的技術,可以通過創建一個新的數據庫對象類型在數據庫中模仿其數據和操作,然后使用JPublisher等工具生成自己的Java bean類。如果使用這種方式,不但Java應用程序可以使用應用軟件的對象模式,其他需要共享你的應用中的數據和操作的應用軟件也可以使用應用軟件中的對象模式。

            10、利用SQL完成數據庫內的操作

            我要向大家介紹的最重要的經驗是充分利用SQL的面向集合的方法來解決數據庫處理需求,而不是使用Java等過程化的編程語言。

            如果編程人員要在一個表中查找許多行,結果中的每個行都會查找其他表中的數據,最后,編程人員創建了獨立的UPDATE命令來成批地更新第一個表中的數據。與此類似的任務可以通過在set子句中使用多列子查詢而在一個UPDATE命令中完成。當能夠在單一的SQL命令中完成任務,何必要讓數據在網上流來流去的?我建議用戶認真學習如何最大限度地發揮SQL的功能。
          posted @ 2005-10-08 18:25 Michael 閱讀(209) | 評論 (0)編輯 收藏

          第一,談談final, finally, finalize的區別。

              第二,Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)?

              第三,Static Nested Class 和 Inner Class的不同,說得越多越好(面試題有的很籠統)。

              第四,&和&&的區別。

              第五,HashMap和Hashtable的區別。

              第六,Collection 和 Collections的區別。

              第七,什么時候用assert.

              第八,GC是什么? 為什么要有GC?

              第九,String s = new String("xyz");創建了幾個String Object?

              第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

              第十一,short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 += 1;有什么錯?

              第十二,sleep() 和 wait() 有什么區別?

              第十三,Java有沒有goto?

              第十四,數組有沒有length()這個方法? String有沒有length()這個方法?

              第十五,Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?

              第十六,Set里的元素是不能重復的,那么用什么方法來區分重復與否呢? 是用==還是equals()? 它們有何區別?

              第十七,給我一個你最常見到的runtime exception.

              第十八,error和exception有什么區別?

              第十九,List, Set, Map是否繼承自Collection接口?

              第二十,abstract class和interface有什么區別?

              第二十一,abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?

              第二十二,接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?

              第二十三,啟動一個線程是用run()還是start()?

              第二十四,構造器Constructor是否可被override?

              第二十五,是否可以繼承String類?

              第二十六,當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?

              第二十七,try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后?

              第二十八,編程題: 用最有效率的方法算出2乘以8等於幾?

              第二十九,兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?

              第三十,當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞?

              第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

              第三十二,編程題: 寫一個Singleton出來。


          以下是答案

              第一,談談final, finally, finalize的區別。

              final?修飾符(關鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載
          finally?再異常處理時提供 finally 塊來執行任何清除操作。如果拋出一個異常,那么相匹配的 catch 子句就會執行,然后控制就會進入 finally 塊(如果有的話)。

              finalize?方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調用的。

              第二,Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)?

              匿名的內部類是沒有名字的內部類。不能extends(繼承) 其它類,但一個內部類可以作為一個接口,由另一個內部類實現。

              第三,Static Nested Class 和 Inner Class的不同,說得越多越好(面試題有的很籠統)。

              Nested Class (一般是C++的說法),Inner Class (一般是JAVA的說法)。Java內部類與C++嵌套類最大的不同就在于是否有指向外部的引用上。具體可見http: //www.frontfree.net/articles/services/view.asp?id=704&page=1

              注: 靜態內部類(Inner Class)意味著1創建一個static內部類的對象,不需要一個外部類對象,2不能從一個static內部類的一個對象訪問一個外部類對象

              第四,&和&&的區別。

              &是位運算符。&&是布爾邏輯運算符。

              第五,HashMap和Hashtable的區別。

              都屬于Map接口的類,實現了將惟一鍵映射到特定的值上。

              HashMap 類沒有分類或者排序。它允許一個 null 鍵和多個 null 值。

              Hashtable 類似于 HashMap,但是不允許 null 鍵和 null 值。它也比 HashMap 慢,因為它是同步的。

              第六,Collection 和 Collections的區別。

              Collections是個java.util下的類,它包含有各種有關集合操作的靜態方法。

              Collection是個java.util下的接口,它是各種集合結構的父接口。

          第七,什么時候用assert。 

            斷言是一個包含布爾表達式的語句,在執行這個語句時假定該表達式為 true。如果表達式計算為 false,那么系統會報告一個 AssertionError。它用于調試目的: 

          assert(a > 0); // throws an AssertionError if a <= 0 

            斷言可以有兩種形式: 

            assert Expression1 ; 
            assert Expression1 : Expression2 ; 

            Expression1 應該總是產生一個布爾值。 
            Expression2 可以是得出一個值的任意表達式。這個值用于生成顯示更多調試信息的 String 消息。 
          斷言在默認情況下是禁用的。要在編譯時啟用斷言,需要使用 source 1.4 標記: 

            javac -source 1.4 Test.java 

            要在運行時啟用斷言,可使用 -enableassertions 或者 -ea 標記。 
            要在運行時選擇禁用斷言,可使用 -da 或者 -disableassertions 標記。 
            要系統類中啟用斷言,可使用 -esa 或者 -dsa 標記。還可以在包的基礎上啟用或者禁用斷言。 

            可以在預計正常情況下不會到達的任何位置上放置斷言。斷言可以用于驗證傳遞給私有方法的參數。不過,斷言不應該用于驗證傳遞給公有方法的參數,因為不管是否啟用了斷言,公有方法都必須檢查其參數。不過,既可以在公有方法中,也可以在非公有方法中利用斷言測試后置條件。另外,斷言不應該以任何方式改變程序的狀態。 


            第八,GC是什么? 為什么要有GC? (基礎)。 

            GC是垃圾收集器。Java 程序員不用擔心內存管理,因為垃圾收集器會自動進行管理。要請求垃圾收集,可以調用下面的方法之一: 

            System.gc() 
            Runtime.getRuntime().gc() 

            第九,String s = new String("xyz");創建了幾個String Object? 

            兩個對象,一個是“xyx”,一個是指向“xyx”的引用對象s。 

            第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 

            Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11; 

            第十一,short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 += 1;有什么錯? 

            short s1 = 1; s1 = s1 + 1;有錯,s1是short型,s1+1是int型,不能顯式轉化為short型??尚薷臑閟1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正確。 

            第十二,sleep() 和 wait() 有什么區別? 搞線程的最愛 

            sleep()方法是使線程停止一段時間的方法。在sleep 時間間隔期滿后,線程不一定立即恢復執行。這是因為在那個時刻,其它線程可能正在運行而且沒有被調度為放棄執行,除非(a)“醒來”的線程具有更高的優先級,(b)正在運行的線程因為其它原因而阻塞。 

            wait()是線程交互時,如果線程對一個同步對象x 發出一個wait()調用,該線程會暫停執行,被調對象進入等待狀態,直到被喚醒或等待時間到。 

            第十三,Java有沒有goto? 

            Goto?java中的保留字,現在沒有在java中使用。 

            第十四,數組有沒有length()這個方法? String有沒有length()這個方法? 

            數組沒有length()這個方法,有length的屬性。 
            String有有length()這個方法。 

            第十五,Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型? 

            方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。 

            第十六,Set里的元素是不能重復的,那么用什么方法來區分重復與否呢? 是用==還是equals()? 它們有何區別? 

            Set里的元素是不能重復的,那么用iterator()方法來區分重復與否。equals()是判讀兩個Set是否相等。 

            equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值。 

            第十七,給我一個你最常見到的runtime exception。 

            ArithmeticException,
          ArrayStoreException,
          BufferOverflowException,
          BufferUnderflowException, 
          CannotRedoException,   
          CannotUndoException, 
          ClassCastException,
          CMMException,  
          ConcurrentModificationException,  
          DOMException,
          EmptyStackException,
          IllegalArgumentException, 
          IllegalMonitorStateException,  
          IllegalPathStateException, 
          IllegalStateException,  
          ImagingOpException,  
          IndexOutOfBoundsException, 
          MissingResourceException, 
          NegativeArraySizeException, 
          NoSuchElementException,  
          NullPointerException, 
          ProfileDataException,
          ProviderException, 
           RasterFormatException, 
          SecurityException,
          SystemException,
          UndeclaredThrowableException,  
          UnmodifiableSetException, 
          UnsupportedOperationException  

            第十八,error和exception有什么區別? 

            error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。

            exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況。 


            第十九,List, Set, Map是否繼承自Collection接口? 

            List,Set是 

            Map不是 

            第二十,abstract class和interface有什么區別? 

            聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用于要創建一個體現某些基本行為的類,并為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變量,其類型是一個抽象類,并讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。 

            接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義static final成員變量。接口的實現與子類相似,除了該實現類不能從接口定義中繼承行為。當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實現了該接口的類的任何對象上調用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從接口類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了接口。 

            第二十一,abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized? 

            都不能 

            第二十二,接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)? 

            接口可以繼承接口。抽象類可以實現(implements)接口,抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函數。 

            第二十三,啟動一個線程是用run()還是start()? 

            啟動一個線程是調用start()方法,使線程所代表的虛擬處理機處于可運行狀態,這意味著它可以由JVM調度并執行。這并不意味著線程就會立即運行。run()方法可以產生必須退出的標志來停止一個線程。 

           

            第二十四,構造器Constructor是否可被override? 

            構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。 

            第二十五,是否可以繼承String類? 

            String類是final類故不可以繼承。 

            第二十六,當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法? 

            不能,一個對象的一個synchronized方法只能由一個線程訪問。 

            第二十七,try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后? 

            會執行,在return前執行。 

            第二十八,編程題: 用最有效率的方法算出2乘以8等於幾? 

            有C背景的程序員特別喜歡問這種問題。 

            2 << 3 

            第二十九,兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對? 

            不對,有相同的hash code。 

            第三十,當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞? 

            是值傳遞。Java 編程語言只由值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的。 


            第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上? 

            switch(expr1)中,expr1是一個整數表達式。因此傳遞給 switch 和 case 語句的參數應該是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。 

            第三十二,編程題: 寫一個Singleton出來。

            Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。 

            一般Singleton模式通常有幾種種形式: 

            第一種形式: 定義一個類,它的構造函數為private的,它有一個static的private的該類變量,在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調用其中的方法。 

          public class Singleton { 
            private Singleton(){} 
            //在自己內部定義自己一個實例,是不是很奇怪? 
            //注意這是private 只供內部調用 
            private static Singleton instance = new Singleton(); 
            //這里提供了一個供外部訪問本class的靜態方法,可以直接訪問   
            public static Singleton getInstance() { 
              return instance;    
             } 

            第二種形式: 

          public class Singleton { 
            private static Singleton instance = null; 
            public static synchronized Singleton getInstance() { 
            //這個方法比上面有所改進,不用每次都進行生成對象,只是第一次      
            //使用時生成實例,提高了效率! 
            if (instance==null) 
              instance=new Singleton(); 
          return instance;   } 

            其他形式: 

            定義一個類,它的構造函數為private的,所有方法為static的。 

            一般認為第一種形式要更加安全些 

            第三十三 Hashtable和HashMap 

            Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現 

            HashMap允許將null作為一個entry的key或者value,而Hashtable不允許 

            還有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。 

            最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap就必須為之提供外同步。 

            Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。 

          版權聲明  本篇文章對您是否有幫助?  投票: 是    否     投票結果:     24       0
           
           
           
          作者其它文章:
          Java多線程程序設計
          前車之覆,后車之鑒 --開源項目經驗談
          Resin服務器的使用
          用Java的加密機制來保護你的數據
          使用XML封裝數據庫操作語句的實現
          作者全部文章     查看作者的Blog 
           
           
            評論人:onefox    參與分: 40162    專家分: 965  發表時間: 2005-03-21 21:21 
          很有自信的能回答的,大概就 30%題目。

          其他很多涉及的問題平時都用自己的一套過濾掉了。

          沒有仔細研究過 
           
            評論人:javasleepless    參與分: 312    專家分: 10  發表時間: 2005-03-25 19:27 
          8錯,可以借此機會弄清那些混淆的概念 
           
            評論人:andersonmao    參與分: 94    專家分: 0  發表時間: 2005-05-12 10:51 
          關于26,沒有說詳細。
          =============================================
            第二十六,當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法? 
            不能,一個對象的一個synchronized方法只能由一個線程訪問。 
          =============================================關于26,沒有說詳細。
          =============================================
              第二十六,當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法? 
              不能,一個對象的一個synchronized方法只能由一個線程訪問。 
          =============================================
              一個對象的所有synchronized方法在同一個時間只能由一個線程訪問。這個對象的其它不是synchronized方法不受這個限制。就是說

          當一個線程正在執行這個對象的一個synchronized時。這個對象的所有synchronized方法都不能被其它線程訪問,但是這個對象的不是

          synchronized的方法可以被其它線程訪問。
              例子:
          SynObject.java
          ====
          public class SynObject{   
              public synchronized void SynMethod(int index){
                  System.out.println("Thread Index="+index+" In SynMethod - Begin");
                  try{
                      Thread.sleep(100);
                  }catch(Exception e){
                  }
                  System.out.println("Thread Index="+index+" In SynMethod - End");
              }
              public void NoneSynMethod(int index){
                  System.out.println("Thread Index="+index+" In NoneSynMethod");
              }
          }
          ====
          ThreadTest.java
          ====
          public class ThreadTest extends Thread{
              int threadNo;
              static SynObject obj=new SynObject();
              public void run(){
                  System.out.println("Thread No="+threadNo+" Begin run");
                  for(int i=0;i<3;i++){
                      obj.SynMethod(threadNo);
                      obj.NoneSynMethod(threadNo);
                  }
              }
              public ThreadTest(int No){
                  threadNo=No;
              }
              public static void main(String[] a){
                  Thread th1=new ThreadTest(1);
                  Thread th2=new ThreadTest(2);
                  th1.start();
                  th2.start();
              }   
          }
          ====
          運行 java ThreadTest
          可能的結果為(因為線程相關,結果可能不一樣):
          Thread No=1 Begin run
          Thread Index=1 In SynMethod - Begin
          Thread No=2 Begin run
          Thread Index=1 In SynMethod - End
          Thread Index=2 In SynMethod - Begin
          Thread Index=1 In NoneSynMethod            //在Thread 2 執行SynMethod() 過程中,Thread 1 執行了 NoneSynMethod()
          Thread Index=2 In SynMethod - End
          Thread Index=2 In NoneSynMethod
          Thread Index=1 In SynMethod - Begin
          Thread Index=1 In SynMethod - End
          Thread Index=2 In SynMethod - Begin
          Thread Index=1 In NoneSynMethod
          Thread Index=2 In SynMethod - End
          Thread Index=1 In SynMethod - Begin
          Thread Index=2 In NoneSynMethod
          Thread Index=1 In SynMethod - End
          Thread Index=1 In NoneSynMethod
          Thread Index=2 In SynMethod - Begin
          Thread Index=2 In SynMethod - End
          Thread Index=2 In NoneSynMethod


          1. 使類盡可能短小精悍,而且只解決一個特定的問題。下面是對類設計的一些建議:

            一個復雜的開關語句:考慮采用"多形"機制;
            數量眾多的方法涉及到類型差別極大的操作:考慮用幾個類來分別實現;
            許多成員變量在特征上有很大的差別:考慮使用幾個類.


          2. 在多線程環境中,隱私是特別重要的一個因素--只有private字段才能在非同步使用的情況下受到保護。

          3. 任何時候只要發現類與類之間結合得非常緊密,就需要考慮是否采用內部類,從而改善編碼及維護工作(參見第14章14.1.2小節的"用內部類改進代碼")。
           
           
           


            

          posted @ 2005-10-06 12:05 Michael 閱讀(266) | 評論 (0)編輯 收藏

          Hibernate 提供了比較好的分頁查詢api極大地方便了使用者。以下是我在項目中寫的一個Hibernate 分頁查詢的代碼:
          //根據Message 對象所封裝的查詢條件分頁查詢Message對象,S
          public List getPageinMessage(Message message,int startRow,int rows) throws DAOException {       
                  StringBuffer queryString=new StringBuffer(" from Message as message where ");
                  //ActionExceptionHandler actionHandler=new ActionExceptionHandler();
                  if(message.getSource()!=null){
                      queryString.append("message.source.id="+message.getSource().getId());
                      queryString.append(" and senderDelFlag=0");
                  }else if(message.getTarget()!=null){
                      //if message's target is not null query message base on target's id
                      logger.debug("query inbox==================");
                      queryString.append("message.target.id="+message.getTarget().getId());
                      queryString.append(" and receiverDelFlag=0");
                  } else{
                      throw new BusinessException("未選定消息發送者或接受者"); 
                  }
                  queryString.append(" order by message.creatDate DESC");
                  Query query=null;
                  List messageList=null;
                  Session session=this.getSession();       
                  try {
                      query=session.createQuery(queryString.toString());
                      query.setFirstResult(startRow);
                      query.setMaxResults(rows);
                      logger.debug("first row===="+startRow+"===row amount==="+rows);
                      messageList=query.list();
                      if(messageList.size()>0){
                          Message message2=(Message)messageList.get(0);              
                          logger.debug("messageList's length==="+message2);           
                          logger.debug("messageList's length==="+messageList.size());
                      }
                  } catch (HibernateException e) {
                      // TODO Auto-generated catch block          
                      e.printStackTrace();
                      throw new BusinessException("讀取頁面數據發生錯誤"); 
                  }finally{
                      if(session!=null&&session.isOpen()){
                          try {
                              session.close();
                          } catch (HibernateException e1) {
                              e1.printStackTrace();
                              throw new BusinessException("會話關閉異常");                   
                          }
                      }
                  }          
                  return messageList;       
              }
          posted @ 2005-10-06 11:05 Michael 閱讀(244) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 万年县| 海晏县| 太保市| 会昌县| 张家口市| 武强县| 禹州市| 绥芬河市| 双流县| 安远县| 合江县| 新巴尔虎左旗| 桂平市| 贵南县| 卓尼县| 高台县| 客服| 唐山市| 黄骅市| 姜堰市| 静安区| 滦南县| 拉孜县| 本溪| 隆子县| 湖南省| 灌南县| 新和县| 加查县| 怀集县| 土默特右旗| 常山县| 清水县| 张家港市| 凤城市| 潮安县| 英吉沙县| 瓦房店市| 日照市| 平舆县| 泸水县|