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元/年