• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    J2EE綜合--淺析Java程序員的存儲過程

    發布: 2008-4-22 13:51 | 作者: 不詳 | 來源: 不詳 | 查看: 39次 | 進入軟件測試論壇討論

    領測軟件測試網

     

    下面是調用該存儲過程的Java方法,將結果輸出到PrintWriter:
    PrintWriter:

    static void sendEarlyDeaths(PrintWriter out) 

        Connection con = null; 
        CallableStatement toesUp = null; 
        try 
        { 
            con = ConnectionPool.getConnection(); 

            // PostgreSQL needs a transaction to do this... 
            con.setAutoCommit(false); 

            // Setup the call. 
            CallableStatement toesUp 
                = connection.prepareCall("{ ? = call list_early_deaths () }"); 
            toesUp.registerOutParameter(1, Types.OTHER); 
            getResults.execute(); 

            ResultSet rs = (ResultSet) getResults.getObject(1); 
            while (rs.next()) 
            { 
                String name = rs.getString(1); 
                int age = rs.getInt(2); 
                out.println(name + " was " + age + " years old."); 
            } 
            rs.close(); 
        } 
        catch (SQLException e) 
        { 
            // We should protect these calls. 
            toesUp.close(); 
            con.close(); 
        } 


    因為JDBC并不直接支持從存儲過程中返回游標,我們使用Types.OTHER來指示存儲過程的返回類型,然后調用getObject()方法并對返回值進行強制類型轉換。
    這個調用存儲過程的Java方法是mapping的一個好例子。Mapping是對一個集上的操作進行抽象的方法。不是在這個過程上返回一個集,我們可以把操作傳送進去執行。本例中,操作就是把ResultSet打印到一個輸出流。這是一個值得舉例的很常用的例子,下面是調用同一個存儲過程的另外一個方法實現:

    public class ProcessPoetDeaths 

        public abstract void sendDeath(String name, int age); 


    static void mapEarlyDeaths(ProcessPoetDeaths mapper) 

        Connection con = null; 
        CallableStatement toesUp = null; 
        try 
        { 
            con = ConnectionPool.getConnection(); 
            con.setAutoCommit(false); 

            CallableStatement toesUp 
                = connection.prepareCall("{ ? = call list_early_deaths () }"); 
            toesUp.registerOutParameter(1, Types.OTHER); 
            getResults.execute(); 

            ResultSet rs = (ResultSet) getResults.getObject(1); 
            while (rs.next()) 
            { 
                String name = rs.getString(1); 
                int age = rs.getInt(2); 
                mapper.sendDeath(name, age); 
            } 
            rs.close(); 
        } 
        catch (SQLException e) 
        { 
            // We should protect these calls. 
            toesUp.close(); 
            con.close(); 
        } 


    這允許在ResultSet數據上執行任意的處理,而不需要改變或者復制獲取ResultSet的方法:

    static void sendEarlyDeaths(final PrintWriter out) 

        ProcessPoetDeaths myMapper = new ProcessPoetDeaths() 
        { 
            public void sendDeath(String name, int age) 
            { 
                out.println(name + " was " + age + " years old."); 
            } 
        }; 
        mapEarlyDeaths(myMapper); 


    這個方法使用ProcessPoetDeaths的一個匿名實例調用mapEarlyDeaths。該實例擁有sendDeath方法的一個實現,和我們上面的例子一樣的方式把結果寫入到輸出流。當然,這個技巧并不是存儲過程特有的,但是和存儲過程中返回的ResultSet結合使用,是一個非常強大的工具。

    結論

    存儲過程可以幫助你在代碼中分離邏輯,這基本上總是有益的。這個分離的好處有:
    • 快速創建應用,使用和應用一起改變和改善的數據庫模式。 
    • 數據庫模式可以在以后改變而不影響Java對象,當我們完成應用后,可以重新設計更好的模式。
    • 存儲過程通過更好的SQL嵌入使得復雜的SQL更容易理解。
    • 編寫存儲過程比在Java中編寫嵌入的SQL擁有更好的工具--大部分編輯器都提供語法高亮!
    • 存儲過程可以在任何SQL命令行中測試,這使得調試更加容易。

    并不是所有的數據庫都支持存儲過程,但是存在許多很棒的實現,包括免費/開源的和非免費的,所以移植并不是一個問題。Oracle、PostgreSQL和DB2都有類似的存儲過程語言,并且有在線的社區很好地支持。
    存儲過程工具很多,有像TOAD或TORA這樣的編輯器、調試器和IDE,提供了編寫、維護PL/SQL或pl/pgsql的強大的環境。
    存儲過程確實增加了你的代碼的開銷,但是它們和大多數的應用服務器相比,開銷小得多。如果你的代碼復雜到需要使用DBMS,我建議整個采用存儲過程的方式。

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    44/4<1234

    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>