(转载)XIbatis 发布-对ibatis的分页查询进行了扩展和功能增强

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

<script type="text/javascript"> // </script>

评论

#?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. ??回复??更多评论 ?
244987.html

礼物 2008-12-08 12:00 发表评论
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章