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

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

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

    當柳上原的風吹向天際的時候...

    真正的快樂來源于創造

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks

     

     

     

     

     

     

    Teambiz中分頁之后臺處理

     

     

     

     

     

     

     

    作者:何楊

    撰寫日期:2012年2月25日

    版本:1.00

    更新日期:  

     

     

    第一部分:功能說明

    分頁是Web程序的常見功能之一,此文主要講述后臺對分頁功能的處理。

    第二部分:核心組件

    名稱

    路徑

    說明

    BaseService

    teambiz\src\com\ibm\heyang\service\base\BaseService.java

    此抽象類是諸Service類的基類,它提供了專用于分頁的函數pagedSearch,用戶只需傳入相應的SQL語句,RequestParamMap實例和dao實例即可完成分頁功能,實際上后兩者一個是在AjaxAction中自動生成的,一個是Sping中配置的,因此,用戶只需書寫正確的查詢SQL語句即可。

    由于DB2數據庫分頁操作的特殊性,它需要分頁時加入排序項,因此若數據源是DB2,那么請換用功能相似的pagedSearch4DB2函數。

    JdbcDao

    teambiz\src\com\ibm\heyang\dao\base\JdbcDao.java

    此抽象類是諸Dao類的基類,它提供了getSqlCount,pageSearchList兩個函數以實現分頁功能,前者用于得到結果集的總數,后者用于取得某一頁的結果集。

    若數據庫是DB2,請換用功能相似的pageSearchList4DB2。

     

    第三部分:關鍵代碼說明

    1. BaseService中的pagedSearch函數:

    public String pagedSearch(String sql,RequestParamMap paramMap,JdbcDao dao) throws Exception{

                int currentPage=Integer.parseInt(paramMap.getParamValue("start"));

                int pageSize=Integer.parseInt(paramMap.getParamValue("pageSize"));

               

                StringBuilder sb=new StringBuilder();

                sb.append("<currentPage>"+currentPage+"</currentPage>");

               

                // 取得總記錄數

                long recordCount=dao.getSqlCount(sql);

                sb.append("<recordCount>"+recordCount+"</recordCount>");

               

                // 得到總頁數

                long pageCount=0;

                if((recordCount % pageSize)==0){

                            pageCount=recordCount/pageSize;

                }

                else{

                            pageCount=recordCount/pageSize+1;

                }          

                sb.append("<pageCount>"+pageCount+"</pageCount>");

               

                NameValueList nvList=dao.pageSearchList(sql,currentPage*pageSize, (currentPage+1)*pageSize);

                sb.append(nvList.asXML());

               

                return sb.toString();

    }

    這個函數對數據庫進行了兩次查詢,一次是取出SQL語句能得到的記錄總數,一次是取出當前頁的數據,另外從paramMap中取出了當前頁和一頁可以容納的記錄數等數據,有了這些數據,進行一點計算,就能獲得前臺頁面需要的當前頁,總記錄數,頁數和當前頁記錄等數據,最后此函數將所有數據都變換為XML格式的字符串。

     

    2. JdbcDao的getSqlCount函數

    public int getSqlCount(String sql) throws Exception{

                RecordCounter rc=new RecordCounter(sql,this.getJdbcTemplate());

                return rc.getCount();

    }

    這個類利用RecordCounter類對SQL語句進行了一定程序的處理,然后取出這個SQL語句能查詢出的記錄總數量,RecordCounter類代碼如下:

    public class RecordCounter{

                private String sql;

               

                private JdbcTemplate jdbcTemplate;

               

                /**

                 * 構造函數

                 * @param sql

                 * @param jdbcTemplate

                 */

                public RecordCounter(String sql,JdbcTemplate jdbcTemplate){

                            this.sql=sql;

                            this.jdbcTemplate=jdbcTemplate;

                }

               

                /**

                 * 得到SQL語句查詢到的記錄數,對外的關鍵語句

                 * @author: 何楊(heyanghy@cn.ibm.com)

                 * @date : Apr 23, 2011

                 * @time : 11:09:35 AM

                 * @return

                 */

                public int getCount() throws Exception{

                            StringBuilder sb=new StringBuilder();

                            sb.append("    select ");

                            sb.append("        count(*) as recordCount ");

                            sb.append("    from ("+sql+") t ");

                            String sql=sb.toString();

     

                            List<?> ls = jdbcTemplate.query(sql, (new IntegerRowMapper()));

                            Integer i=(Integer)ls.get(0);

                           

                            return i.intValue();

                }

    }

    以上代碼路徑:teambiz\src\com\ibm\heyang\dao\rowmapper\RecordCounter.java

     

    3. JdbcDao類的fetchPageRecords和fetchPageRecords4DB2函數。

    下面兩個函數用于取出分頁的數據,按照數據庫的不同使用不同的部分或是換用不同的函數。

    /**

     * 查詢分頁數據,如果是Oracle則放開上面一段,如果是MySql則放開下面一段

     * @author: 何楊(heyanghy@cn.ibm.com)

     * @date : Mar 29, 2011

     * @time : 3:34:44 PM

     * @param start

     * @param end

     * @param sql

     * @param mapper

     * @return

     */

    protected final List<?> fetchPageRecords(int start,int end,String sql,RowMapper mapper){

                StringBuilder sb=new StringBuilder();

               

                // Oracle

                /*sb.append(" Select                              ");

                sb.append("        *                            ");

                sb.append(" from                                ");

                sb.append("        (                            ");

                sb.append("         Select                      ");

                sb.append("                t01.*,               ");

                sb.append("                rownum as newRowNum ");

                sb.append("         from                        ");

                sb.append("                (                    ");

                sb.append(sql);

                sb.append("                ) t01                ");

                sb.append("         where                       ");

                sb.append("                rownum<='"+end+"'    ");

                sb.append("        )                            ");

                sb.append(" where                               ");

                sb.append("        newRowNum>'"+start+"'        ");*/

               

                // MySql

                sb.append(sql+" limit "+start+","+(end-start));

                String sql2=sb.toString();

               

                return this.getJdbcTemplate().query(sql2,mapper);

    }

     

    /**

     * 專門為DB2制作的查詢分頁數據,特殊的地方是比上面的函數多了一個Order by

     * @param start

     * @param end

     * @param sql

     * @param orderBy

     * @param mapper

     * @return

     */

    protected final List<?> fetchPageRecords4DB2(int start,int end,String sql,String orderBy,RowMapper mapper){

                StringBuilder sb=new StringBuilder();

               

                // Db2

                sb.append(" Select                              ");

                sb.append("        *                            ");

                sb.append(" from                                ");

                sb.append("        (                            ");

                sb.append("         Select                      ");

                sb.append("                table01.*,               ");

                sb.append("                ROW_NUMBER() OVER(ORDER BY "+orderBy+" ) AS ROWNUM ");

                sb.append("         from                        ");

                sb.append("                (                    ");

                sb.append(sql);

                sb.append("                ) table01 )               ");

                sb.append("         where                       ");

                sb.append("                ROWNUM >"+start+" and ");

                sb.append("                ROWNUM <="+end+" ");

     

                String sql2=sb.toString();

                return this.getJdbcTemplate().query(sql2,mapper);

    }

     

    第四部分:使用步驟

    步驟

    說明

    參照

    Dao類中編寫需要進行分頁查詢的SQL語句,并用函數進行包裝。

    建議對SQL進行良好的整形。

    teambiz\src\com\ibm\heyang\dao\RelationDao.java中的getSentRelationSql函數。

    Service類中撰寫調用dao中的分頁查詢函數

    teambiz\src\com\ibm\heyang\service\RelationService.java中的pagedSearchMySentRelation函數。

    Action中調用Service中的分頁查詢函數

    如果需要在paramMap中增加新的參數,可以使用com.ibm.heyang.action.base.RequestParamMap類的addParam函數

    teambiz\src\com\ibm\heyang\action\relation\SearchSentRealationAction.java類

     

    第五部分:小結

    后臺的分頁處理,實際上需要程序員動腦筋的地方就是SQL語句的編寫,其它都是固定模式的操作,TeamBiz通過BaseService和JDBCdao兩個類中相應函數的幫助,固化了這些固定的部分,程序員只要正確調用即可,這在一定程度上減輕了程序員的工作量,降低了人為出錯的可能。

     

    通過不同分頁SQL語句的采用,TeamBiz能適應三種數據庫,Oracle,MySQL和Db2,如果要增添更多數據庫的支持,對分頁SQL進行改寫即可。

     

    posted on 2012-02-29 10:35 何楊 閱讀(278) 評論(0)  編輯  收藏 所屬分類: Teambiz
    主站蜘蛛池模板: 日本免费一区二区三区最新| 久久午夜免费视频| 亚洲色中文字幕无码AV| 久久精品无码免费不卡| 亚洲综合无码精品一区二区三区| 免费无遮挡无码视频在线观看| 成年女人永久免费观看片| 亚洲暴爽av人人爽日日碰| 国产大片91精品免费观看男同 | 免费成人av电影| 国产精品亚洲综合天堂夜夜| 免费国产a国产片高清网站| 美女被艹免费视频| 亚洲精品无码久久一线| 免费人妻无码不卡中文字幕系| 亚洲日产2021三区在线| 在线看片无码永久免费视频 | 久青草视频97国内免费影视| 亚洲午夜未满十八勿入网站2| 免费国产午夜高清在线视频| 亚洲视频一区在线| 午夜高清免费在线观看| 一级做a爰黑人又硬又粗免费看51社区国产精品视 | 亚洲GV天堂GV无码男同| 国产偷国产偷亚洲高清日韩| 日韩精品无码免费一区二区三区| 亚洲无mate20pro麻豆| 亚洲AV无码一区二区三区国产| 免费网站看av片| 亚洲日日做天天做日日谢| 亚洲国产精品无码久久青草| 一级做a爰全过程免费视频| 亚洲一卡2卡3卡4卡乱码 在线| 亚洲一区二区三区无码影院| 最近2022中文字幕免费视频| 亚洲AV无码成人精品区狼人影院| 亚洲精品国产品国语在线| 青苹果乐园免费高清在线| 一个人看的免费高清视频日本| 亚洲精品亚洲人成在线观看麻豆| 四虎永久在线精品视频免费观看|