PageHelper是一種常用的分頁工具,按照常規方法在mybatis的配置文件中整合它:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--全局環境參數--> <settings> ... </settings> <!--插件配置--> <plugins> <!--支持PageHelper插件--> <plugin interceptor="com.github.pagehelper.PageHelper"> ... </plugin> </plugins> </configuration>
在啟動服務的時候,卻拋出如下異常:
Cause: java.lang.ClassCastException: com.github.pagehelper.PageHelper cannot be cast to org.apache.ibatis.plugin.Interceptor
看字面意思是類型轉換異常,PageHelper不能轉換成org.apache.ibatis.plugin.Interceptor,於是點進PageHelper的源碼
/** * Mybatis - 通用分頁攔截器<br/> * 項目地址 : http://git.oschina.net/free/Mybatis_PageHelper * * @author liuzh/abel533/isea533 * @version 5.0.0 */ public class PageHelper extends PageMethod implements Dialect { ... }
確實沒有實現Interceptor接口,有丶謎,因為以前的項目也是這么配置的,為什么沒出這種問題?
找到老項目點進PageHelper源碼:
/** * Mybatis - 通用分頁攔截器 * * @author liuzh/abel533/isea533 * @version 3.3.0 * 項目地址 : http://git.oschina.net/free/Mybatis_PageHelper */ @SuppressWarnings("rawtypes") @Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})) public class PageHelper implements Interceptor { ... }
原因找到了:
PageHelper3、4版本實現了Interceptor接口,PageHelper5不再實現。
那么問題來了,如果使用PageHelper5版本,怎么在mybatis中繼承這個插件?從PageHelper所在的com.github.pagehelper包中,發現了一個叫PageInterceptor的類,名字有丶像我們要找的東西,點進源碼一看,果然實現了Interceptor接口。

於是我們嘗試將這個類放入mybatis的配置文件中,刪除不存在的屬性,啟動服務正常。
結論:使用PageHelper版本3、4時,在mybatis配置文件中用PageHelper類集成,使用PageHelper版本5時,在mybatis配置文件中使用PageInterceptor類集成。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--全局環境參數--> <settings> ... </settings> <!--插件配置--> <plugins> <!--支持PageHelper插件--> <plugin interceptor="com.github.pagehelper.PageInterceptor"> </plugin> </plugins> </configuration>
