PageHelper使用以及PageInfo中分頁對象的轉化

在使用Mybatis查詢數據庫展示到前端的過程中不可避免的要考慮到分頁問題,這時就引入了Mybatis的PageHelper插件,這個插件對分頁功能進行了強有力的封裝,只需要將查詢出來的數據List集合放入到它指定的對象中,就完成了分頁,下面簡單的對分頁過程介紹一下。

分頁代碼

public PageInfo<Po> pageList(Integer pageNum, Integer pageSize){
	// 開啓分頁
    PageHelper.startPage(pageNum, pageSize);
    List<Po> poList = poMapper.selectXxx();
    // 封裝list到PageInfo對象中自動分頁
    PageInfo<Po> poPageInfo = new PageInfo<>(poList);
    return poPageInfo;
}
  • Po是數據庫對應的實體類對象;
  • PageInfo是需要返回的對象類型,裏面封裝了包含Po數據的List集合;
  • pageNum:指定了查詢第幾頁數據;
  • pageSize:指定每一頁顯示多少條數據;

但一般使用PageHelper,要完成以下步驟:

1. 導入依賴包

這裏使用的是maven管理。

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>3.7.5</version>
</dependency>

2. 配置插件

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 配置插件 -->
    <property name="plugins">
        <array>
            <!-- 分頁插件 -->
            <bean class="com.github.pagehelper.PageHelper">
                <property name="properties">
                    <props>
                        <!-- 配置數據庫方言 -->
                        <prop key="dialect">mysql</prop>

                        <!-- 配置自動修正頁碼 -->
                        <!-- pageNo的有效範圍:1~總頁數 -->
                        <prop key="reasonable">true</prop>
                    </props>
                </property>
            </bean>
        </array>
    </property>
</bean>

PageInfo<>對象泛型的轉化

既然這樣就完成了分頁,那麼今天討論的問題到底是幹嘛的呢?

是這樣的,正常情況下PageInfo中的泛型必須是數據庫的實體類對象,即PO對象。正常開發中不可避免的要使用到其他的包括DTO,VO等對象,在對VO等對象分頁時,如果直接返回VO泛型的PageInfo對象,該對象中則沒有數據,所以要進一步對PageInfo對象進行封裝,轉換其泛型。

即要對非數據庫對應的實體類集合分頁時,直接傳入list是不生效的,必須對PageInfo進行進一步的處理。

泛型轉換

這裏定義了一個靜態的工具方法,用於將PageInfo中的泛型Po對象轉換爲Vo對象,其他對象類似,只需要傳入對應的泛型。

public class PageUtils{
    /**
         * 將PageInfo對象泛型中的Po對象轉化爲Vo對象
         * @param pageInfoPo PageInfo<Po>對象</>
         * @param <P> Po類型
         * @param <V> Vo類型
         * @return
     */
     public static <P, V> PageInfo<V> PageInfo2PageInfoVo(PageInfo<P> pageInfoPo) {
         // 創建Page對象,實際上是一個ArrayList類型的集合
         Page<V> page = new Page<>(pageInfoPo.getPageNum(), pageInfoPo.getPageSize());
         page.setTotal(pageInfoPo.getTotal());
         return new PageInfo<>(page);
     }
}
  • 泛型P:Po對象類型;
  • 泛型V:Vo或其他需要分頁的數據類型;
  • Page對象是保存list數據集合,實際上是ArrayList類型;

轉換泛型的實質就是給新的PageInfo<Vo>對象中的page對象添加pageNum、pageSize、Total等屬性。

在得到PageInfo對象後可以使用getList()方法獲取存儲數據的List集合,進而給PageInfo對象保存需要分頁的數據。

舉例🌰

先定義兩個對象;

UserPo.java

public class UserPo{
	private Integer id;
    private String userName;
    private String userPassword;
    private Integer addressId;
}

UserVo.java

public class UserVo{
	private Integer id;
    private String userName;
    private String addressName;
}

分頁邏輯實現:

UserServiceImpl.java

public class UserServiceImpl implements UserService{
	public pageInfo<UserVo> pageUserVoList(Integer pageNum, Integer pageSize){
    	// 1. 開啓分頁
        PageHelper.startPage(pageNum, pageSize);
        // 2. 從數據庫中查詢出
        List<UserPo> UserPoList = UserPoMapper.selectXxx();
        // 3. 封裝list到PageInfo對象中自動分頁
        PageInfo<Po> userPoPageInfo = new PageInfo<>(UserPoList);
        
        // 4. 轉換爲UserVo類型的PageInfo對象
        PageInfo<UserVo> UserVoPageInfo = PageUtils.PageInfo2PageInfoVo(userPoPageInfo);
        // 5. 創建需要分頁的UserVoList
        List<UserVo> userVoList = new ArrayList<>();
        // 6. 遍歷UserPo給UserVoList初始化
        for(UserPo userpo : UserPoList){
        	UserVo uservo = new UserVo();
            // 6.1 將與Po對象相同屬性的值賦值到Vo對象中
            BeanUtils.copyProperties(userpo, uservo);
            String addressName = userPoMapper.selectAddressById(userpo.AdrressId).getAddressName();
            uservo.setAddressName(addressName);
            userVoList.add(uservo);
        }
        for (UserVo uservo : userVoList) {
    		userVoPageInfo.getList().add(articleVo);
		}
    	return userVoPageInfo;
    }
}

這裏主要處理了UserVo與UserPo中不同的數據,真正處理分頁的邏輯代碼非常簡單。只要能夠獲得需要分頁Vo對象的集合,存入到VoPageInfo的List中即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章