对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);              }          }      }      ... }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值