springboot +mybatis分頁插件PageHelper


1.問題描述

JAVA界ORM的兩位大佬Hibernate和Mybatis,hb自帶分頁(上手挺快,以前用了好幾年hb,后期運維及優化快瘋了),mybatis沒有分頁功能,需要借助第三方插件來完成,比較流行的三方框架:PageHelper,今天結合springboot做下介紹,直接貼線上配置,保證可用(如有遺漏,朋友們可以指正下)。

2. 解決方案

2.1 配置項目pom.xml

        <!--分頁-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.8</version>
        </dependency>

2.2 配置PageHelper參數

方式比有很多,這里只介紹使用過的兩種吧。

方式一,使用標簽Configuration:


public class PageHelperConfig {

​    @Bean

​    public PageHelper getPageHelper(){

​        PageHelper pageHelper=new PageHelper();

​        Properties properties=new Properties();

​        properties.setProperty("helperDialect","mysql");

​        properties.setProperty("reasonable","true");

​        properties.setProperty("supportMethodsArguments","true");

​        properties.setProperty("params","count=countSql");

​        pageHelper.setProperties(properties);

​        return pageHelper;

​    }

}

方式二,因為我們當時mybatis插件自動生成了一個xml,就直接放xml里了。跟sp的無配置文件概念是不是有點沖突? 這里簡單啰嗦一句,其實軟件的過程有點三十年河東三十年河西的味道,以前是要配置集中化,都由幾個中心配置文件管理;現在是去中心化,全部通過標簽來定義;看個人習慣吧,我們項目中除了application.yml也還有兩個配置文件,一個是數據庫和事務aop那個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>
    <!--設置-->
    <settings>
        <!-- 全局映射器啟用緩存 -->
        <setting name="cacheEnabled" value="false"/>
        <!-- 查詢時,關閉關聯對象即時加載以提高性能 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 設置關聯對象加載的形態,此處為按需加載字段(加載字段由SQL指定),不會加載關聯表的所有字段,以提高性能 -->
        <setting name="aggressiveLazyLoading" value="false"/>
        <!-- 對於未知的SQL查詢,允許返回不同的結果集以達到通用的效果 -->
        <setting name="multipleResultSetsEnabled" value="true"/>
        <!-- 允許使用列標簽代替列名 -->
        <setting name="useColumnLabel" value="true"/>
        <!-- 允許使用自定義的主鍵值(比如由程序生成的UUID 32位編碼作為鍵值),數據表的PK生成策略將被覆蓋 -->
        <setting name="useGeneratedKeys" value="true"/>
        <!-- 給予被嵌套的resultMap以字段-屬性的映射支持 -->
        <setting name="autoMappingBehavior" value="FULL"/>
        <!-- 對於批量更新操作緩存SQL以提高性能  但是返回id有問題-->
        <setting name="defaultExecutorType" value="SIMPLE"/>
        <!-- 數據庫超過36000秒仍未響應則超時 -->
        <setting name="defaultStatementTimeout" value="36000"/>
        <!-- 日志使用logback實現 -->
        <!--<setting name="logImpl" value="LOGBACK"/>-->
        <!--是否開啟自動駝峰命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射。 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>

    </settings>
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">

            <property name="offsetAsPageNum" value="false"/>
            <property name="rowBoundsWithCount" value="false"/>
            <property name="pageSizeZero" value="true"/>
            <property name="reasonable" value="false"/>
            <property name="supportMethodsArguments" value="false"/>
            <property name="returnPageInfo" value="none"/>
        </plugin>
    </plugins>
</configuration>

2.3 項目中使用

使用示例:

public Object getAppUsers(ShareAppsVO shareAppsVO) {
//分頁就這一行就可以了兩個參數,一是當前頁,一是每頁顯示的條數
        PageHelper.startPage(shareAppsVO.getCurrentPage(), shareAppsVO.getPageSize());  
           List<DmaAppUser> dmaAppUsers = dmaAppUserMapper.getAppUsers(shareAppsVO);
        PageInfo<DmaAppUser> pageInfo = new PageInfo<DmaAppUser>(dmaAppUsers);

        Page page = new Page();
        page.setData(dmaAppUsers);
        //這里注意下,正常情況下,只需要上一頁下一頁的話,就不用PageInfo,info主要用於獲取總頁數了。PageHelper自帶的類
        page.setTotal(pageInfo.getTotal()); 
        return page;
    }

注意: PageHelper.startPage(shareAppsVO.getCurrentPage(), shareAppsVO.getPageSize()); 需要放到執行mybatis代碼前一頁,否則會有問題,網上也有解決該問題的方案,該場景沒碰到就不測試了。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM