Terry.Li-彬

虚其心,可解天下之问;专其心,可治天下之学;静其心,可悟天下之理;恒其心,可成天下之业。

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  143 随笔 :: 344 文章 :: 130 评论 :: 0 Trackbacks
Ibatis在项目开发中,无论是企业管理还是电子商务,Productivity作用都非常的大,淋漓尽致的体现了模板的好处,将sql的繁杂的语法和查询条件参数数据清晰的剥离出来,无论是开发速度和代码的易维护性上,都是无可比拟的。

  但是其中有一个重大的缺陷就是数据库分页查询了,这个就不用多说了,参见 由ibatis引起的框架设计思考

  喜欢Hibernate的人,可以先去看:Ibatis VS Hibernate,  我也喜欢Hibernate,但重要的是要解决项目问题,而不是无休无止的争论!

  不知道为什么,Ibatis对此无动于衷,反而采取了回避的态度,只是将分页的方法depreciated,草草了事。

  我对于ibatis的源码进行了改造,起名为XIbatis, 改造主要从一下几个方面入手:
      
  1.提供与具体数据库相关的分页回调接口,调用者可以注入自己的分页实现,并注入到Ibatis中,在分页时进行回调。
        

 1 public   interface  Paginator  {
 2      /**
 3      * 根据原始的sql和pageNo, pageSize生成分页的sql.
 4      *  @param  sql
 5      *  @param  pageNo  当前页号
 6      *  @param  pageSize  每页的数据条数
 7      *  @return  分页sql
                 @author  http://www.blogjava.net/oneeyewolf

 8       */

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

      XIbatis代码内内置了Oracle 和 MySql分页的两种实现:


2.与spring进行了集成,可以灵活的注入不同数据库的分页实现


  3 .由于在原有的接口中,新增了分页查询的方法,所以需要扩展spring 对ibatis的SqlMapClientTemplate的封装。
      同时XIbatis向后兼容,保留了Ibatis的原来的所有方法。

     

4.在ibatis的接口中增加了新的分页的方法, :
       

 1   /**
 2    * 分页查询
 3    *  @param  id  The name of the statement to execute.
 4    *  @param  parameterObject  查询条件对象
 5    *  @param  pageNo  当前页号
 6    *  @param  pageSize  每页显示的数据条数
 7    *  @return
 8    *  @throws  SQLException
          * @author  http://www.blogjava.net/oneeyewolf
 9     */

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


5.最后的IbatisDao的实现:

 1 public   class  DAOIbatisImpl  extends  CustomIbatisDaoSupport  {
 2
 3      /**
 4      * 分页查询
 5      *  @param  id
 6      *  @param  params  查询参数,里面必须要有一个pageNo的页号参�?
 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      * 不分页查询
17      *  @param  id  查询ID
18      *  @param  params  查询参数
19      *  @return
20       */

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

24 }

6.源代码文件下载, 点击这里>>
   包含:spring配置文件、example for Dao test、source code.
    
 7.RoadMap
    XIbatis未来将着手对于sql template语法进行改造,已能够适应电子商务网站复杂、多样查询的要求。

    有改造需求的人,可以在这里提出来。

   
20人合租600元/年

posted on 2008-12-01 11:51 Speed 阅读(1053) 评论(4)  编辑  收藏 所属分类: 框架设计J2EEHibernate & Ibatis

评论

# re: XIbatis 发布-对ibatis的分页查询进行了扩展和功能增强 2008-12-01 16:09 charlie's logic

good job.  回复  更多评论   

# re: XIbatis 发布-对ibatis的分页查询进行了扩展和功能增强 2008-12-01 17:10 tp

有前途,如果列中带有函数就不建议这么搞了。  回复  更多评论   

# re: XIbatis 发布-对ibatis的分页查询进行了扩展和功能增强 2008-12-02 14:06 stone2083

想法是好的,做法是不可取的。
任何对第三方组件的扩展,需要遵循开放-封闭原则:只能寻找组件的扩展点进行功能扩展,不允许直接修改源码。

试想一下,你修改了源代码,以后如何解决与官方网站版本升级的同步问题?
没有团队敢使用你的包。

很早之间,我就有这个想法。但是发觉MappedStatement,SqlMapExecutorDelegate都是面向实现编程;
并且SqlMapClient也是通过:
public SqlMapConfiguration() {
errorContext = new ErrorContext();
delegate = new SqlMapExecutorDelegate();
typeHandlerFactory = delegate.getTypeHandlerFactory();
client = new SqlMapClientImpl(delegate);
registerDefaultTypeAliases();
}
直接new出来的。
所以,似乎找不到扩展的地方来实现“分页”的需求。

不知道大家是否有更好的方案,欢迎讨论。  回复  更多评论   

# re: XIbatis 发布-对ibatis的分页查询进行了扩展和功能增强 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.   回复  更多评论  
posted on 2008-12-08 12:00 礼物 阅读(1084) 评论(0)  编辑  收藏 所属分类: ibatis