济南网页设计|自助建站济南网站建设|聊城网站建设济南网站制作|济南网站优化 http://www.mzwkj.com www.tuanqv.com

对ibatis分页功能的改进(2)

告诉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);              }          }      }      ... }

posted on 2008-06-23 14:25  路大侠  阅读(181)  评论(0)    收藏  举报

导航

济南户外拓展|企业户外拓展 http://www.tuanqv.com