告诉handleResults不分页(我们组装的sql已经使查询结果是分页后的结果了),此处引入了类似hibenate中的数据库方言接口Dialect,其代码如下:
package
com.aladdin.dao.dialect;
public
interface
Dialect {
public
boolean
supportsLimit();
public
String getLimitString(String sql,
boolean
hasOffset);
public
String getLimitString(String sql,
int
offset,
int
limit); }
下面为Dialect接口的MySQL实现:
package
com.aladdin.dao.dialect;
public
class
MySQLDialect
implements
Dialect {
protected
static
final
String SQL_END_DELIMITER
=
"
;
"
;
public
String getLimitString(String sql,
boolean
hasOffset) {
return
new
StringBuffer(sql.length()
+
20
).append(trim(sql)).append( hasOffset
?
"
limit ?,?
"
:
"
limit ?
"
) .append(SQL_END_DELIMITER).toString(); }
public
String getLimitString(String sql,
int
offset,
int
limit) { sql
=
trim(sql); StringBuffer sb
=
new
StringBuffer(sql.length()
+
20
); sb.append(sql);
if
(offset
>
0
) { sb.append(
"
limit
"
).append(offset).append(
'
,
'
).append(limit) .append(SQL_END_DELIMITER); }
else
{ sb.append(
"
limit
"
).append(limit).append(SQL_END_DELIMITER); }
return
sb.toString(); }
public
boolean
supportsLimit() {
return
true
; }
private
String trim(String sql) { sql
=
sql.trim();
if
(sql.endsWith(SQL_END_DELIMITER)) { sql
=
sql.substring(
0
, sql.length()
-
1
-
SQL_END_DELIMITER.length()); }
return
sql; } }
接下来的工作就是把LimitSqlExecutor注入ibatis中。我们是通过spring来使用ibatis的,所以在我们的dao基类中执行注入,代码如下:
package
com.aladdin.dao.ibatis;
import
java.io.Serializable;
import
java.util.List;
import
org.springframework.orm.ObjectRetrievalFailureException;
import
org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import
com.aladdin.dao.ibatis.ext.LimitSqlExecutor;
import
com.aladdin.domain.BaseObject;
import
com.aladdin.util.ReflectUtil;
import
com.ibatis.sqlmap.client.SqlMapClient;
import
com.ibatis.sqlmap.engine.execution.SqlExecutor;
import
com.ibatis.sqlmap.engine.impl.ExtendedSqlMapClient;
public
abstract
class
BaseDaoiBatis
extends
SqlMapClientDaoSupport {
private
SqlExecutor sqlExecutor;
public
SqlExecutor getSqlExecutor() {
return
sqlExecutor; }
public
void
setSqlExecutor(SqlExecutor sqlExecutor) {
this
.sqlExecutor
=
sqlExecutor; }
public
void
setEnableLimit(
boolean
enableLimit) {
if
(sqlExecutor
instanceof
LimitSqlExecutor) { ((LimitSqlExecutor) sqlExecutor).setEnableLimit(enableLimit); } }
public
void
initialize()
throws
Exception {
if
(sqlExecutor
!=
null
) { SqlMapClient sqlMapClient
=
getSqlMapClientTemplate() .getSqlMapClient();
if
(sqlMapClient
instanceof
ExtendedSqlMapClient) { ReflectUtil.setFieldValue(((ExtendedSqlMapClient) sqlMapClient) .getDelegate(),
"
sqlExecutor
"
, SqlExecutor.
class
, sqlExecutor); } } } ... }