Terry.Li-彬

          虛其心,可解天下之問(wèn);專其心,可治天下之學(xué);靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評(píng)論 :: 0 Trackbacks
          Ibatis在項(xiàng)目開(kāi)發(fā)中,無(wú)論是企業(yè)管理還是電子商務(wù),Productivity作用都非常的大,淋漓盡致的體現(xiàn)了模板的好處,將sql的繁雜的語(yǔ)法和查詢條件參數(shù)數(shù)據(jù)清晰的剝離出來(lái),無(wú)論是開(kāi)發(fā)速度和代碼的易維護(hù)性上,都是無(wú)可比擬的。

            但是其中有一個(gè)重大的缺陷就是數(shù)據(jù)庫(kù)分頁(yè)查詢了,這個(gè)就不用多說(shuō)了,參見(jiàn) 由ibatis引起的框架設(shè)計(jì)思考

            喜歡Hibernate的人,可以先去看:Ibatis VS Hibernate,  我也喜歡Hibernate,但重要的是要解決項(xiàng)目問(wèn)題,而不是無(wú)休無(wú)止的爭(zhēng)論!

            不知道為什么,Ibatis對(duì)此無(wú)動(dòng)于衷,反而采取了回避的態(tài)度,只是將分頁(yè)的方法depreciated,草草了事。

            我對(duì)于ibatis的源碼進(jìn)行了改造,起名為XIbatis, 改造主要從一下幾個(gè)方面入手:
                
            1.提供與具體數(shù)據(jù)庫(kù)相關(guān)的分頁(yè)回調(diào)接口,調(diào)用者可以注入自己的分頁(yè)實(shí)現(xiàn),并注入到Ibatis中,在分頁(yè)時(shí)進(jìn)行回調(diào)。
                  

           1 public   interface  Paginator  {
           2      /**
           3      * 根據(jù)原始的sql和pageNo, pageSize生成分頁(yè)的sql.
           4      *  @param  sql
           5      *  @param  pageNo  當(dāng)前頁(yè)號(hào)
           6      *  @param  pageSize  每頁(yè)的數(shù)據(jù)條數(shù)
           7      *  @return  分頁(yè)sql
                           @author  http://www.aygfsteel.com/oneeyewolf

           8       */

           9      public  String getPaginatedSql(String sql,  int  pageNo,  int  pageSize);
          10     
          11 }

                XIbatis代碼內(nèi)內(nèi)置了Oracle 和 MySql分頁(yè)的兩種實(shí)現(xiàn):


          2.與spring進(jìn)行了集成,可以靈活的注入不同數(shù)據(jù)庫(kù)的分頁(yè)實(shí)現(xiàn)


            3 .由于在原有的接口中,新增了分頁(yè)查詢的方法,所以需要擴(kuò)展spring 對(duì)ibatis的SqlMapClientTemplate的封裝。
                同時(shí)XIbatis向后兼容,保留了Ibatis的原來(lái)的所有方法。

               

          4.在ibatis的接口中增加了新的分頁(yè)的方法, :
                 

           1   /**
           2    * 分頁(yè)查詢
           3    *  @param  id  The name of the statement to execute.
           4    *  @param  parameterObject  查詢條件對(duì)象
           5    *  @param  pageNo  當(dāng)前頁(yè)號(hào)
           6    *  @param  pageSize  每頁(yè)顯示的數(shù)據(jù)條數(shù)
           7    *  @return
           8    *  @throws  SQLException
                    * @author  http://www.aygfsteel.com/oneeyewolf
           9     */

          10   PageResult queryForPageResult(String id, Object parameterObject,  int  pageNo,  int  pageSize)  throws  SQLException;
          11


          5.最后的IbatisDao的實(shí)現(xiàn):

           1 public   class  DAOIbatisImpl  extends  CustomIbatisDaoSupport  {
           2
           3      /**
           4      * 分頁(yè)查詢
           5      *  @param  id
           6      *  @param  params  查詢參數(shù),里面必須要有一個(gè)pageNo的頁(yè)號(hào)參??
           7      *  @param  pageSize
           8      *  @return
           9       */

          10      public  PageResult queryByPagination(String id, Map params,  int  pageNo,  int  pageSize)  {
          11
          12          return  getSqlMapClientTemplate().queryForPageResult(id, params, pageNo, pageSize);
          13     }

          14     
          15      /**
          16      * 不分頁(yè)查詢
          17      *  @param  id  查詢ID
          18      *  @param  params  查詢參數(shù)
          19      *  @return
          20       */

          21      public  List queryForList(String id, Map params) {
          22          return   super .getSqlMapClientTemplate().queryForList(id, params);
          23     }

          24 }

          6.源代碼文件下載, 點(diǎn)擊這里>>
             包含:spring配置文件、example for Dao test、source code.
              
           7.RoadMap
              XIbatis未來(lái)將著手對(duì)于sql template語(yǔ)法進(jìn)行改造,已能夠適應(yīng)電子商務(wù)網(wǎng)站復(fù)雜、多樣查詢的要求。

              有改造需求的人,可以在這里提出來(lái)。

             
          20人合租600元/年

          posted on 2008-12-01 11:51 Speed 閱讀(1053) 評(píng)論(4)  編輯  收藏 所屬分類: 框架設(shè)計(jì) 、J2EE 、Hibernate & Ibatis

          評(píng)論

          # re: XIbatis 發(fā)布-對(duì)ibatis的分頁(yè)查詢進(jìn)行了擴(kuò)展和功能增強(qiáng) 2008-12-01 16:09 charlie's logic

          good job.  回復(fù)  更多評(píng)論   

          # re: XIbatis 發(fā)布-對(duì)ibatis的分頁(yè)查詢進(jìn)行了擴(kuò)展和功能增強(qiáng) 2008-12-01 17:10 tp

          有前途,如果列中帶有函數(shù)就不建議這么搞了。  回復(fù)  更多評(píng)論   

          # re: XIbatis 發(fā)布-對(duì)ibatis的分頁(yè)查詢進(jìn)行了擴(kuò)展和功能增強(qiáng) 2008-12-02 14:06 stone2083

          想法是好的,做法是不可取的。
          任何對(duì)第三方組件的擴(kuò)展,需要遵循開(kāi)放-封閉原則:只能尋找組件的擴(kuò)展點(diǎn)進(jìn)行功能擴(kuò)展,不允許直接修改源碼。

          試想一下,你修改了源代碼,以后如何解決與官方網(wǎng)站版本升級(jí)的同步問(wèn)題?
          沒(méi)有團(tuán)隊(duì)敢使用你的包。

          很早之間,我就有這個(gè)想法。但是發(fā)覺(jué)MappedStatement,SqlMapExecutorDelegate都是面向?qū)崿F(xiàn)編程;
          并且SqlMapClient也是通過(guò):
          public SqlMapConfiguration() {
          errorContext = new ErrorContext();
          delegate = new SqlMapExecutorDelegate();
          typeHandlerFactory = delegate.getTypeHandlerFactory();
          client = new SqlMapClientImpl(delegate);
          registerDefaultTypeAliases();
          }
          直接new出來(lái)的。
          所以,似乎找不到擴(kuò)展的地方來(lái)實(shí)現(xiàn)“分頁(yè)”的需求。

          不知道大家是否有更好的方案,歡迎討論。  回復(fù)  更多評(píng)論   

          # re: XIbatis 發(fā)布-對(duì)ibatis的分頁(yè)查詢進(jìn)行了擴(kuò)展和功能增強(qiáng) 2008-12-02 15:23 Speed

          @stone2083
          good point, actually you need to balance the pros and cons for your own team. cause it is open source, so if it do not fully match your way, just modify the code to facilitate your application.   回復(fù)  更多評(píng)論  
          posted on 2008-12-08 12:00 禮物 閱讀(1089) 評(píng)論(0)  編輯  收藏 所屬分類: ibatis
          主站蜘蛛池模板: 类乌齐县| 晋中市| 兴和县| 托克托县| 铜陵市| 江华| 文山县| 商水县| 辉县市| 英超| 郧西县| 镇宁| 灵寿县| 黑龙江省| 万盛区| 油尖旺区| 新干县| 秦安县| 社会| 灌云县| 随州市| 中西区| 淮北市| 化德县| 宜春市| 郎溪县| 滁州市| 香河县| 商洛市| 莆田市| 阿克苏市| 柞水县| 驻马店市| 太仆寺旗| 渑池县| 杭锦后旗| 盐源县| 蓝山县| 防城港市| 阿荣旗| 晋城|