e代劍客——溫柔一刀

          生活就像海洋,只有意志堅強的人,才能到達(dá)彼岸

             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            76 隨筆 :: 7 文章 :: 215 評論 :: 0 Trackbacks
          開發(fā)采用spring+ibatis,數(shù)據(jù)庫用oracle,數(shù)據(jù)量有幾千萬以上,而且還要不斷的增多,用了三層子查詢實現(xiàn)分頁控制

          下面都只是舉的例子
          ?1 < sqlMap? namespace ="Y_wjlx" > ?
          ?2
          ?3 ???????? < resultMap? class ="com.ctgusec.model.Y_wjlx" ?id ="y_wjlx" > ?
          ?4 ???????????????? < result? property ="wjbh" ?column ="wjbh" ? /> ?
          ?5 ???????????????? < result? property ="wjmc" ?column ="wjmc" ? /> ?
          ?6 ???????? </ resultMap > ?
          ?7 ???????? < select? id ="getAllY_wjlx" ?resultMap ="y_wjlx" > ?
          ?8 ???????????????? <![CDATA[ ????????????????????????
          ?9 ????????????????SELECT?wjbh,wjmc?FROM?(SELECT?row_.*,?rownum?rownum_?FROM?(select?wjbh,wjmc,rownum?rn?from?y_wjlx)?row_?WHERE?rownum?<=?#end#)?WHERE?rownum_?>?#start#?
          10 ???????????????? ]]> ?
          11 ???????? </ select > ?
          12
          13 </ sqlMap > ?

          用了個模型基類存儲分頁參數(shù),模型類可以繼承此類
          public ? class ?BaseModel? {?

          ????????
          private ?Integer?start? = ? 0 ;?

          ????????
          private ?Integer?end? = ? 30 ;?

          ????????
          private ?Integer?size? = ? 30 ;?

          ????????
          private ?Integer?currentPage;?

          ????????
          private ?Integer?priviousPage;?

          ????????
          private ?Integer?nextPage;?

          ????????
          public ?BaseModel()? {?
          ????????????????
          ????????}
          ?
          ????????
          public ?BaseModel(Integer?currentPage)? {?
          ????????????????
          if ?(currentPage? > ? 0 )? {?
          ????????????????????????
          this .currentPage? = ?currentPage;?
          ????????????????????????
          this .priviousPage? = ?currentPage? - ? 1 ;?
          ????????????????????????
          this .nextPage? = ?currentPage? + ? 1 ;?
          ????????????????????????
          this .start? = ?priviousPage? * ?size;?
          ????????????????????????
          this .end? = ?currentPage? * ?size;?
          ????????????????}
          ?
          ????????}
          ?

          ????????
          // 省略geter、serter方法?
          }
          ?

          dao層:
          1public?class?SqlY_wjlxDao?extends?SqlMapClientDaoSupport?implements?IY_wjlxDao?{?
          2
          3????????public?List?getAllY_wjlx(Y_wjlx?y_wjlx)?{?
          4????????????????
          5????????????????return?this.getSqlMapClientTemplate().queryForList("getAllY_wjlx",?y_wjlx);????????????????
          6????????}
          ?
          7}
          ?
          8

          控制層:spring控制類實現(xiàn)分頁
          ?1 public ? class ?Y_wjlxListAllController? extends ?AbstractController? {?
          ?2
          ?3 ????????Integer?currentPage?;?
          ?4 ????????
          ?5 ???????? // y_wjlx類繼承BaseModel類?
          ?6 ????????Y_wjlx?y_wjlx;?
          ?7
          ?8 ????????@Override?
          ?9 ???????? protected ?ModelAndView?handleRequestInternal(HttpServletRequest?request,?
          10 ????????????????????????HttpServletResponse?response)? throws ?Exception? {?
          11 ????????????????String?page? = ?request.getParameter( " page " );?
          12 ???????????????? if ?(page? == ? null ? || ?page.equals( " head " ))? {?
          13 ????????????????????????currentPage = 1 ;?
          14 ????????????????????????y_wjlx? = ? new ?Y_wjlx(currentPage);?
          15 ????????????????????????request.getSession().setAttribute( " currentPage " ,?currentPage);?
          16 ????????????????}
          ?
          17 ???????????????? if ?( " privious " .equals(page))? {?
          18 ????????????????????????currentPage? = ?(Integer)?request.getSession().getAttribute( " currentPage " );?
          19 ???????????????????????? if (currentPage > 1 )?currentPage? -= ? 1 ;?
          20 ????????????????????????y_wjlx? = ? new ?Y_wjlx(currentPage);?
          21 ????????????????????????request.getSession().setAttribute( " currentPage " ,?currentPage);?
          22 ????????????????}
          ? else ? if ?( " next " .equals(page))? {?
          23 ????????????????????????currentPage? = ?(Integer)?request.getSession().getAttribute( " currentPage " );?
          24 ????????????????????????currentPage? += ? 1 ;?
          25 ????????????????????????y_wjlx? = ? new ?Y_wjlx(currentPage);?
          26 ????????????????????????request.getSession().setAttribute( " currentPage " ,?currentPage);?
          27 ????????????????}
          ?
          28 ????????????????List?list? = ? this .drv_Manager.getAllY_wjlx(y_wjlx);?
          29 ???????????????? return ? new ?ModelAndView( " y_wjlxList " ,? " list " ,?list);?
          30 ????????}
          ?
          31
          32 ???????? private ?IDrv_Manager?drv_Manager;?
          33
          34 ???????? public ? void ?setDrv_Manager(IDrv_Manager?drv_Manager)? {?
          35 ???????????????? this .drv_Manager? = ?drv_Manager;?
          36 ????????}
          ?
          37 }

          jsp頁面分頁調(diào)用
          1 < button? onclick ="location.href??=??'y_wjlxList.shtml?page=head'" > 首&&頁 </ button > ????
          2 &&?
          3 < button? onclick ="location.href??=??'y_wjlxList.shtml?page=privious'" > 上一頁 </ button > ????
          4 &&?
          5 < button??? onclick ="location.href='y_wjlxList.shtml?page=next'" > 下一頁 </ button >

          實現(xiàn)了分頁,而且前面的數(shù)據(jù)查詢翻頁效率很高,但是越到后面越慢(這個好象是沒有辦法的)

          現(xiàn)在的問題是:
          1、spring控制類太累贅,好象做了它不該做的事情,翻頁控制有沒有比較好的辦法抽到服務(wù)層?
          2、翻頁也只有:首頁、上頁、下頁;想把最后一頁也弄出來,但是擔(dān)心效率太低,首先要統(tǒng)計數(shù)據(jù)總數(shù),還有就是三層子查詢到了幾千萬數(shù)據(jù)后效率就慢了。
          有沒有比較好的解決辦法?

          posted on 2006-08-30 10:06 溫柔一刀 閱讀(6463) 評論(23)  編輯  收藏 所屬分類: 開源框架數(shù)據(jù)庫相關(guān)

          評論

          # re: spring、ibatis控制oracle分頁的問題 2006-08-30 11:25 Tendy
          --
          實現(xiàn)了分頁,而且前面的數(shù)據(jù)查詢翻頁效率很高,但是越到后面越慢(這個好象是沒有辦法的)
          --
          如果一個 table 有幾千萬數(shù)據(jù),誰去翻頁……搜索好了  回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2006-08-30 11:46 zeroblue
          看hibernate的源代碼,看丫是怎么翻頁的。
          我沒仔細(xì)看過,但相信會有提示。  回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2006-08-30 13:10 溫柔一刀
          @zeroblue
          hibernate調(diào)用到了最后也就是三層子查詢了
          SELECT wjbh,wjmc FROM (SELECT row_.*, rownum rownum_ FROM (select wjbh,wjmc,rownum rn from y_wjlx) row_ WHERE rownum <= #end#) WHERE rownum_ > #start#
            回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2006-08-30 13:11 溫柔一刀
          @Tendy
          您說的有道理
          但是客戶有要求
          人家是上帝啊  回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2006-08-30 14:05 boddi
          SELECT wjbh,wjmc FROM (SELECT row_.*, rownum rownum_ FROM (select wjbh,wjmc,rownum rn from y_wjlx) row_ WHERE rownum <= #end#) WHERE rownum_ > #start#
          中的select wjbh,wjmc,rownum rn from y_wjlx不會造成很大的效率問題嗎?  回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2006-08-30 14:18 why
          老大,你的代碼真是丑陋,看著真累  回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2006-08-30 14:26 溫柔一刀
          @why
          Sorry,影響了您的視覺,偶也知道很丑陋,想改進(jìn)它,謝謝您  回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2006-08-30 14:27 溫柔一刀
          @boddi
          這個應(yīng)該算效率比較高的查詢了  回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2006-08-31 18:21 boddi
          SELECT wjbh,wjmc FROM (SELECT row_.*, rownum rownum_ FROM (select wjbh,wjmc,rownum rn from y_wjlx) row_ WHERE rownum <= #end#) WHERE rownum_ > #start#
          在SQLSERVER中無法實現(xiàn)啊!請問SQLSERVER有何高招嗎?謝謝
            回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2006-08-31 19:09 溫柔一刀
          @boddi
          這個語句只能在oracle用
          SQLSERVER應(yīng)該也有類似的實現(xiàn)
          您可以google一把看看  回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2006-09-02 15:02 Jude Zhu
          <br>SELECT
          <br> wjbh,
          <br> wjmc
          <br>FROM (
          <br> SELECT
          <br> ROW_NUMBER (OVER wjbh ASC) AS ROWNUMBER
          <br> wjbh,
          <br> wjmc
          <br> FROM y_wjlx
          <br>)
          <br>WHERE ROWNUMBER < #end#
          <br> AND ROWNUMBER > #start#
            回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2006-09-04 12:20 kimsoft
          不錯,希望再寫一些spring+ibatis方面的blog  回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2006-09-04 13:23 黃奕福
          這樣簡單一些吧:
          select * from
          (
          select rownum rownum__, t.* from mytable t where rownum < #start#
          )
          where rownum__ > #end#;  回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2006-09-13 08:24 javarwx
          這個分頁和我們用ibatis開發(fā)的一個項目中分頁的寫法一樣,如果不需要對數(shù)據(jù)排序的話建議可以不要用三層嵌套,可以只用兩層嵌套查詢,這樣或許會提高些速度

          只是我現(xiàn)在一直不是很明白ibatis提供的SqlMapClientImpl SqlMapDaoTemplate SqlMapSessionImpl這三個類有什么不同,希望指教

          QQ:66116103  回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2006-09-13 10:18 溫柔一刀
          @javarwx
          看了下源碼,SqlMapClientImpl ,SqlMapSessionImpl實現(xiàn)了同一個父類,我也沒有搞清楚,慚愧,另外,好象沒有SqlMapDaoTemplate 這個類吧,待我在仔細(xì)研究下源碼,謝謝您的建議  回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2006-10-15 17:00 曲靜波
          @Tendy
          如果一個 table 有幾千萬數(shù)據(jù),誰去翻頁……搜索好了

          有道理.但如果要是可以選擇頁碼,鏈出末頁,效率顯然就低了~  回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2006-10-15 17:01 曲靜波
          應(yīng)該不會低很多,客戶應(yīng)該從易用性角度考慮.  回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2007-01-12 10:25 ♂蜜蜂㊣仔仔g(shù)z
          代碼不能重用,應(yīng)以復(fù)用未主要開發(fā)目的。分頁嵌套比較正常,效率不會降低多少,復(fù)用應(yīng)該是以參數(shù)形式傳入sql,動態(tài)字段實現(xiàn)select count(1) from table 總量計算,當(dāng)前頁面計算等工作,最好以標(biāo)簽形式嵌套頁面,免去維護(hù)問題。總的來說做的是不錯的。  回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2007-04-10 11:47 rjbj
          請問用mysql,該怎么寫?謝謝。  回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2008-04-21 20:28 soei
          蜜蜂㊣仔仔g(shù)z
          說的對,
          跟我現(xiàn)在做的一樣,花幾天時間debug ibatis的源碼,做出來效果不錯  回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2008-05-19 18:31 asd
          rdthert  回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 2008-05-19 18:32 asd
          aaaaaaaaaaaaaaaaa  回復(fù)  更多評論
            

          # re: spring、ibatis控制oracle分頁的問題 [未登錄] 2008-05-19 18:35 java愛好者
          您好!最近在學(xué)ibatis,想用spring+ibatis做個分頁,但我發(fā)現(xiàn)了個問題,就是
          SELECT wjbh,wjmc FROM (SELECT row_.*, rownum rownum_ FROM (select wjbh,wjmc,rownum rn from y_wjlx) row_ WHERE rownum <= #end#) WHERE rownum_ > #start#

          假如頁面上有很多的查詢條件,有的值用戶可以輸入,也可不輸入,你這里的sql語句不就不能在改變了,我覺得sql語句應(yīng)該是動態(tài)的才好!但這樣是不是就不能滿足動態(tài)變sql,我是Ibatis初學(xué)者,不知道有什么好的解決方案?請賜教
            回復(fù)  更多評論
            

          聯(lián)系偶 zhupanjava@gmail.com 溫柔一刀
          主站蜘蛛池模板: 楚雄市| 若羌县| 太原市| 浪卡子县| 长春市| 武城县| 庆安县| 清新县| 奉节县| 武宣县| 安吉县| 大同市| 萨嘎县| 县级市| 大冶市| 陆河县| 苏尼特右旗| 沅江市| 顺平县| 廉江市| 五峰| 松滋市| 麟游县| 启东市| 余庆县| 大埔区| 都昌县| 镇巴县| 井陉县| 苏尼特左旗| 福海县| 乌兰察布市| 巢湖市| 湖口县| 塔河县| 启东市| 新晃| 宜州市| 安阳市| 漠河县| 山丹县|