MyBatis分頁功能

MyBatis 的分頁功能是基于內(nèi)存的分頁,即先查詢出所有記錄,再按起始位置和頁面容量取出結(jié)果。

本節(jié)我們?yōu)椴樵兙W(wǎng)站記錄增加分頁功能,要求結(jié)果列表按照 id 升序排列(本節(jié)示例基于《第一個(gè)MyBatis程序》一節(jié)的代碼實(shí)現(xiàn))。

WebsiteMapper 中方法如下。

/**
*
* @param site
* @param currentPageNo 起始位置
* @param pageSize      頁面容量
* @return
*/
public List<Website> selectWebsite(
                    @Param("site") Website site,
                    @Param("from") Integer currentPageNo,
                    @Param("pageSize") Integer pageSize);
                

相比原來的 selectWebsite 方法,增加了兩個(gè)參數(shù),起始位置(from)和頁面容量(pageSize),用于實(shí)現(xiàn)分頁查詢。

修改 WebsiteMapper.xml 的查詢語句,增加 limit 關(guān)鍵字,SQL 映射代碼如下。

<select id="selectWebsite" resultType="net.biancheng.po.Website">
    SELECT id,name,url,age,country
    FROM website
    <trim prefix="where" prefixOverrides="and">
        <if test="site.name != null and site.name !=''">
            AND name LIKE CONCAT ('%',#{site.name},'%')
        </if>
        <if test="site.url!= null and site.url !=''">
            AND url LIKE CONCAT ('%',#{site.url},'%')
        </if>
        ORDER BY id limit #{from},#{pageSize}
    </trim>
</select>
                

WebsiteMapper 類中方法如下。

public List<Website> selectWebsite(Website website);
                

測(cè)試代碼如下。

public static void main(String[] args) throws IOException {
    // 讀取配置文件mybatis-config.xml
    InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
    // 根據(jù)配置文件構(gòu)建
    SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
    // 通過SqlSessionFactory創(chuàng)建SqlSession
    SqlSession ss = ssf.openSession();
    Website site = new Website();
    // site.setname("編程");
    site.setUrl("http");
    Integer pageSize = 3;
    Integer currentPageNo = 0;
    List<Website> siteList = new ArrayList<Website>();
    siteList = ss.getMapper(WebsiteMapper.class).selectWebsite(site, currentPageNo, pageSize);
    for (Website ws : siteList) {
        System.out.println(ws);
    }
}
                

輸出結(jié)果如下。

DEBUG [main] - ==>  Preparing: SELECT id,name,url,age,country FROM website where url like concat ('%',?,'%') ORDER BY id limit ?,?
DEBUG [main] - ==> Parameters: http(String), 0(Integer), 3(Integer)
DEBUG [main] - <==      Total: 3
Website[id=1,name=編程幫,url=http://www.soo66.com/,age=10,country=CN]
Website[id=2,name=C語言中文網(wǎng),url=https://c.cainiaoplus.com/,age=12,country=CN]
Website[id=3,name=百度,url=https://www.baidu.com/,age=18,country=CN]
                

上述代碼中,根據(jù)傳入的起始位置(currentPageNo=0)和頁面容量(pageSize=3)進(jìn)行相應(yīng)分頁,查看第一頁的數(shù)據(jù)列表,運(yùn)行測(cè)試方法,輸出正確的分頁列表。

注意:MyBatis 實(shí)現(xiàn)分頁查詢屬于 DAO 層操作,由于 DAO 層不牽涉任何業(yè)務(wù)實(shí)現(xiàn),所以實(shí)現(xiàn)分頁的方法中第一個(gè)參數(shù)為 limit 的起始位置(下標(biāo)從 0 開始),而不是用戶輸入的真正頁碼(頁碼從1開始)。在 JSP 教程的《JSP分頁》一節(jié)已經(jīng)學(xué)習(xí)過頁碼如何轉(zhuǎn)換為 limit 的起始位置下標(biāo),即:起始位置下標(biāo)=(頁碼-1)*頁面容量,那么這個(gè)轉(zhuǎn)換操作必然不能在 DAO 層實(shí)現(xiàn),需要在業(yè)務(wù)層實(shí)現(xiàn)。所以我們?cè)跍y(cè)試類中傳入的參數(shù)為下標(biāo),而不是頁碼。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清