1. 程式人生 > >使用mybatis分頁外掛PageHelper5.0.0遇到的問題總結

使用mybatis分頁外掛PageHelper5.0.0遇到的問題總結

最近在學習一個專案,就是網上流傳的taotao-shop,學到使用分頁外掛的時候,突然卡主了,異常,我的天,要知道這種整合專案中出現異常,要不就是jar包衝突,要不就是配置檔案哪個地方不對,這樣找起來,沒有頭緒,簡直就是折騰,最開始我的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>
  <!-- 配置分頁外掛 PageHelper -->
   <plugins>
     <plugin interceptor="com.github.pagehelper.PageHelper">    
     </plugin>  
   </plugins>
</configuration>

執行taotao-manager出現以下異常:


後面還有一行關鍵描述:

Cause: java.lang.ClassCastException: com.github.pagehelper.PageHelper cannot be cast to org.apache.ibatis.plugin.Interceptor

意思就是說這個分頁外掛的Interceptor沒有被實現


來看一下我的,PageHelper版本,以及com.github.pagehelper.PageHelper類

pageHelper是如何在mybatis中工作呢,是通過mybatis的pulgin實現了Interceptor介面,從而獲得要執行的sql語句實現分頁技術,而我們的PageHelper5.0.0版本中的這個類,並沒有出現implements Interceptor,我們再來看下pagehelper這個包下的其他類,我們發現,有個類很像我們要的,我們進去一看,果然是它:


因此,我們修改我們的mybatis全域性配置檔案SqlMapConfig.xml如下:

<?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>
  <!-- 配置分頁外掛 PageHelper -->
   <plugins>
     <plugin interceptor="com.github.pagehelper.PageInterceptor">    
     </plugin>  
   </plugins>
</configuration>
我們再次,執行taotao-manager如下:

正常執行,然後,我們需要設定分頁外掛的方言dialect的value,我們使用的是mysql資料庫,因此value=mysql,我們再次改下配置檔案:

<?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>
  <!-- 配置分頁外掛 PageHelper -->
   <plugins>
     <plugin interceptor="com.github.pagehelper.PageInterceptor">
     <property name="dialect" value="mysql"/>    
     </plugin>  
   </plugins>
</configuration>

我們再次啟動我們的專案:


我去,這個會話工程"sqlSessionFactory"怎麼又出來了,我們往後翻,發現有個關鍵描述:

Error parsing SQL Mapper Configuration. Cause: com.github.pagehelper.PageException: java.lang.ClassNotFoundException: mysql

沒有發現mysql這個類,太折騰了,我也不想檢查其他jar包是否版本不對了,這個後面有時間再去研究,網上說,PageHelper外掛4.0.0以後的版本支援自動識別使用的資料庫,可以不用配置 <property name="dialect" value="mysql"/>    這,抱著僥倖的心理,我再一次試了試:

ok,沒問題了,專案正常跑起來了(對於初學者來說,出現這種怪異的問題,真是沒轍,要麼網上查,查不到就自己蒙,都不行了,從頭來),我們最後看下分頁外掛的使用部分(主要就是測試部分,外掛都配置不對,測試部分就是擺設):

package com.taotao.pageHelper;

import java.util.List;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.taotao.mapper.TbItemMapper;
import com.taotao.pojo.TbItem;
import com.taotao.pojo.TbItemExample;

public class TestPageHelper {

/**
 * @throws Exception
 * 2017年8月17日12:00:57
 */
@Test	
public void testPageHelper() throws Exception{
	
	   //1、獲得mapper代理物件
	   //初始化一個spring容器	 
	   ApplicationContext   applicationContext = null;
	   try{
		 //獲得spring上下文物件
	     applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml");
	   }
	   catch (Exception ex) {
		ex.printStackTrace();
	   }
	  
	   //拿到一個代理物件  我們要操作的商品資訊 在mapper對映類中,我們通過上下文物件拿到這個類的代理
       TbItemMapper bean = applicationContext.getBean(TbItemMapper.class);
	   //2、設定分頁處理
       PageHelper.startPage(1, 20);//每頁顯示20條 相當於  SELECT * FROM taotao.tb_item limit 0,20;
	   //3、執行查詢
       TbItemExample example = new TbItemExample();
       //Criteria criteria = example.createCriteria();
       //criteria.andIdEqualTo(value) //這個是根據某個條件查 比如主鍵商品ID
       List<TbItem> list = bean.selectByExample(example);//example不設定 表示無條件 這個時候bean已經將分頁效果(sql語句)作用在example上了
       
       if(list != null & list.size()>0){
    	   int i = 0;
    	   for(TbItem item : list){
    		   System.out.println(item.getTitle()+","+(i+1));//輸出商品的標題,一頁20行
    		   i++;
    	   }
       }   
	   //4、取分頁後的結果
	   //包裝list     
       PageInfo<TbItem> pageInfo = new PageInfo<>(list);
	   long total = pageInfo.getTotal();//總記錄數
	   System.out.println("total:"+total);
	   int pages = pageInfo.getPages();
	   System.out.println("pages:"+pages);//總頁數
	   int pageSize= pageInfo.getPageSize();
	   System.out.println("pageSize:"+pageSize);//每頁的展示數
	  
   }
	
}

run as JUnit Test 輸出內容如下:


我們再看下我們的mysql資料庫裡面的Item商品表是不是總過有3096條資料: