1. 程式人生 > >專案中PageHelper分頁外掛的使用例項(SSM)

專案中PageHelper分頁外掛的使用例項(SSM)

分頁(英語:Paging),是一種作業系統儲存器管理的一種技術,可以使計算機的主存可以使用儲存在輔助儲存器中的資料。作業系統會將輔助儲存器(通常是磁碟)中的資料分割槽成固定大小的區塊,稱為“頁”(pages)。當不需要時,將分頁由主存(通常是記憶體)移到輔助儲存器;當需要時,再將資料取回,載入主存中。相對於分段,分頁允許儲存器儲存於不連續的區塊以維持檔案系統的整齊。[1]分頁是磁碟和記憶體間傳輸資料塊的最小單位。

分頁/虛擬記憶體能有助“大大地”降低整體及額外非必要的 I/O 次數,提高系統整體運作效能。因為這能有助提高 RAM 的讀取命中率,也透過其內部的高效率演算法來達到 I/O 資料流的預快取工作,通過與之相關的等等手段也能很好地提高了 CPU 的使用效率,而擁有大實體記憶體的使用者更可能考慮利用如

RamdiskSupercacheSoftPerfect RAM Disk等模擬出硬碟分割槽來同時將虛擬記憶體/系統臨時檔案等設定其上以進一步加強系統性能,及達至保障硬碟的措施。分頁是虛擬記憶體技術中的重要部分。

1 .分頁原理

這裡寫圖片描述

使用原理:

pageHelper會使用ThreadLocal獲取到同一執行緒中的變數資訊,各個執行緒之間的Threadlocal不會相互干擾,也就是Thread1中的ThreadLocal1之後獲取到Tread1中的變數的資訊,不會獲取到Thread2中的資訊

所以在多執行緒環境下,各個Threadlocal之間相互隔離,可以實現,不同thread使用不同的資料來源或不同的Thread中執行不同的SQL語句

所以,PageHelper利用這一點通過攔截器獲取到同一執行緒中的預編譯好的SQL語句之後將SQL語句包裝成具有分頁功能的SQL語句,並將其再次賦值給下一步操作,所以實際執行的SQL語句就是有了分頁功能的SQL語句

2 .專案中引入分頁外掛

外掛叫做PageHelper,如果你也在用Mybatis,建議嘗試該分頁外掛,這個一定是最方便使用的分頁外掛。  該外掛目前支援Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六種資料庫分頁。

第一步:引入maven依賴

//放置在dao層pom.xml配置中
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>4.0.0</version>
</dependency>

 第二步:在spring-jdbc.xml檔案中進行配置(資料來源配置xml檔案),引入外掛

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSourceEbooking"/>
    <property name="typeAliasesPackage" value="相應包路勁,多個用逗號隔開"/>
    <property name="mapperLocations"
              value="classpath*:/com/jd/**/mapper/**/*Mapper.xml"></property>
    <!--在sqlSessionFactory中引入該外掛-->
    <property name="plugins">
        <array>
            <bean class="com.github.pagehelper.PageInterceptor">
                <property name="properties">
                    <value>
                        helperDialect=mysql
                    </value>
                </property>
            </bean>
        </array>
    </property>
</bean>

第三步:獲取分頁引數和資料 

//pageNum展示哪一頁,pageSize每一頁展示的條數
public PageInfo<DemoDO> getALLHotelInfo(int pageNum,int pageSize) {
        //使用時,先執行PageHelper.startPage(pageNum,pageSize)
        PageHelper.startPage(pageNum,pageSize);
        List<HotelStaticDO> lists = hotelStaticDAO.getALLHotelInfo();
        //將獲取的資料封裝為 PageInfo物件即可
        PageInfo<DemoDO> pageInfo = new PageInfo<>(lists);

        return pageInfo;
    }

 第四步:前端展示

//自定義一個分頁引數物件,用於接收分頁引數資料
public class BasePageResult implements Serializable {
    //條數
    private int pageSize;
    //頁數
    private int pages;
    //符合要求的資料條數
    private int total;
    //當前頁,例如第一頁,第二頁。。。
    private int pageNum;

    public BasePageResult() {
    }

    public int getPageSize() {
        return this.pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getPages() {
        return this.pages;
    }

    public void setPages(int pages) {
        this.pages = pages;
    }

    public int getTotal() {
        return this.total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    public int getPageNum() {
        return this.pageNum;
    }

    public void setPageNum(int pageNum) {
        this.pageNum = pageNum;
    }
}

 資料轉換,引數接收:

//使用lombook註解Data代替set和get
@Data
public class DemoVO extends BasePageResult implements Serializable {
    //資料集合
    private List<DemoItemVO> demoItemVOList;

}

實戰:

測試類:

/**
 * @description: 測試類
 * @author: fengze
 * @create: 2018-09-14 14:45
 **/
public class DemoServiceTest extends BaseTest {
    @Resource
    private DemoService demoService;

    @Test
    public void testGetDemoByPage(){
        PageInfo<DemoDO> info = demoService.getDemoByPage(1, 10);
        logger.info("body:{}", JSON.toJSON(info));
    }

  
}

/**
 * @description: service
 * @author: fengze
 * @create: 2018-09-13 15:21
 **/
@Service("demoService")
public class DemoServiceImpl extends BaseService implements DemoService{

    @Autowired
    private DemoDAO demoDAO;


    /*獲取當前符合要求的分頁資料*/
    @Override
    public PageInfo<DemoDO> getDemoByPage(int pageNum,int pageSize) {
        /*獲取全量靜態酒店*/
        PageHelper.startPage(pageNum,pageSize);
        List<DemoDO> lists = demoDAO.getDemoByPage();
        PageInfo<DemoDO> pageInfo = new PageInfo<>(lists);

        return pageInfo;
    }
}

/**持久層*/

@Repository
public interface DemoDAO {

    List<DemoDO> getDemoByPage();

    
}


<!--mapper配置,BaseResultMap自動對映,需要獲取的欄位-->
<sql id="Base_Column_List">
    id, name, name, city_name, business, addr, star, grade, score, create_time, update_time, is_delete
  </sql>


<select id="getDemoByPage" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List"/>
    from demo
  </select>