專案中PageHelper分頁外掛的使用例項(SSM)
分頁(英語:Paging),是一種作業系統裡儲存器管理的一種技術,可以使計算機的主存可以使用儲存在輔助儲存器中的資料。作業系統會將輔助儲存器(通常是磁碟)中的資料分割槽成固定大小的區塊,稱為“頁”(pages)。當不需要時,將分頁由主存(通常是記憶體)移到輔助儲存器;當需要時,再將資料取回,載入主存中。相對於分段,分頁允許儲存器儲存於不連續的區塊以維持檔案系統的整齊。[1]分頁是磁碟和記憶體間傳輸資料塊的最小單位。
分頁/虛擬記憶體能有助“大大地”降低整體及額外非必要的 I/O 次數,提高系統整體運作效能。因為這能有助提高 RAM 的讀取命中率,也透過其內部的高效率演算法來達到 I/O 資料流的預快取工作,通過與之相關的等等手段也能很好地提高了 CPU 的使用效率,而擁有大實體記憶體的使用者更可能考慮利用如
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>