1. 程式人生 > 其它 >PageHelper查詢資料,並將結果集傳送到前端

PageHelper查詢資料,並將結果集傳送到前端

初用PageHelper,記錄使用,解釋pageInfo返回是Page物件而不是結果集

1. pom新增依賴

<!--    Mybatis分頁外掛PageHelper    -->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.3.0</version>
    </dependency>

2. 在 SqlSessionFactory 設定外掛,或在 SpirngMVC 配置檔案中設定

這裡以SqlSessionFactory為例

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--  指定Mybatis配置檔案  -->
        <property name="configLocation" value="classpath:mybatis-config.xml" />
        <!--  指定資料來源  -->
        <property name="dataSource" ref="pooledDataSource" />
        <!--  指定mapper檔案位置  -->
        <property name="mapperLocations" value="classpath:mapper/*.xml" />
        <!--  配置PageHelper外掛  -->
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <props>
                            <prop key="helperDialect">mysql</prop>
                            <!--  頁碼長度為0時不進行分頁  -->
                            <prop key="pageSizeZero">true</prop>
                        </props>
                    </property>
                </bean>
            </array>
        </property>
</bean>

3. Controller方法

@RequestMapping("/allBooks")
public ModelAndView getAllBooks() {
	ModelAndView mv = new ModelAndView();
	PageHelper.startPage(1, 4);  // 傳入頁碼,每頁條數
    List<Book> books = mapper.getAllBooks(); // SQL查詢所有書,此時books是Page物件,不是ArrayList物件
   	PageInfo<Book> pageInfo = new PageInfo<>(books);  
	List<Book> list = pageInfo.getList();  // 返回結果集,list實際上是一個Page物件
	mv.addObject("pageInfo", pageInfo);
	mv.addObject("books", new Gson().toJson(list));
	mv.setViewName("book/show");
}

(1)在 PageHelper.startPage() 執行後,Mapper進行SQL查詢返回的結果集向下轉型成了一個 Page 物件,而不是ArrayList物件
(2)Page類 繼承了 ArrayList類,重寫了 toString() 方法,所以 new PageInfo<>(books) 傳入了一個Page物件,pageInfo.getList() 返回的也是 Page物件,所以 pageInfo.getList() 返回值不是我們想要的book集合

  • pageInfo.getList()的返回值,一個Page物件:
Page{count=true, 
pageNum=1, 
pageSize=4, 
startRow=0, 
endRow=4, 
total=8, 
pages=2, 
reasonable=false, 
pageSizeZero=true}
[Book{bookId=1, bookName='死屋', author='unknown', press='unknown', imgPath='/static/img/book/default.jpg', bookImpression='null'}, 
Book{bookId=2, bookName='我和你', author='馬丁·布伯', press='四川人民出版社', imgPath='', bookImpression='null'}, 
Book{bookId=3, bookName='波蘭史', author='', press='', imgPath='', bookImpression=''}, 
Book{bookId=4, bookName='無敵艦隊', author='unknown', press='unknown', imgPath='/static/img/book/default.jpg', bookImpression='null'}
  • 而我們只想要book集合的資訊
Book{bookId=2, bookName='我和你', author='馬丁·布伯', press='四川人民出版社', imgPath='', bookImpression='null'}, Book{bookId=3, bookName='波蘭史', author='', press='', imgPath='', bookImpression=''}, Book{bookId=4, bookName='無敵艦隊', author='unknown', press='unknown', imgPath='/static/img/book/default.jpg', bookImpression='null'}

(3) 將 pageInfo.getList() 返回的結果轉換成 Json,併發送給前端,交由前端進行Json解析,得到物件後,對其進行遍歷
Page就是一個ArrayList,可以進行遍歷獲取結果集

4. 前端JS解析獲取結果集

<!DOCTYPE html>
<html lang="zh_CN" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script th:src="@{/static/js/jquery-3.6.0.js}"></script>
</head>
<body>
	<!--  獲取後端傳過來的Model資料  -->
	<input id="books" type="hidden" th:value="${books}">
</body>
<script th:inline="javascript">
    $(function () {
        var booksJson = $("#books").val();
        var books = JSON.parse(booksJson);  // 將傳過來Json進行解析,得到List集合
        $.each(books, function (index, book) {  // 遍歷物件,並將物件轉為字串
            alert(JSON.stringify(book));  // alert展示每本書的資訊
        });
    });
</script>

解析結果:SQL查詢後分頁的第一頁,4條Book物件的資訊如下



5. 詳細使用的朋友建議自己看原始碼

...