日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

【mybatis】spring mybatis與pageHelper分頁插件的整合

作者:James-Blackhu 更新時間: 2022-04-04 編程語言

目錄

使用pageHelper的步驟

一? 引入分頁插件

二? 配置攔截器插件

分頁插件的可選參數(shù)介紹:

三? 分頁插件在代碼中的使用

分頁插件的執(zhí)行原理:

在實(shí)際應(yīng)用中查詢分頁代碼

pageHelper的安全調(diào)用:

PageInfo對象介紹


pageHelper是國內(nèi)非常優(yōu)秀的一款mybatis分頁插件,支持基本的主流與常用的數(shù)據(jù)庫.

使用pageHelper的步驟

一? 引入分頁插件

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>最新版本</version>
</dependency>

二? 配置攔截器插件

在dao層的applicationContext-dao.xml配置文件中,配置以下內(nèi)容

<!--sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="typeAliasesPackage" value="cn.itcast.domain"/>
        <!--配置spring和mybatis整合分頁插件-->
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <!--使用下面方式配置參數(shù),一行配置一個,可以不用配置可使用默認(rèn)值-->
                        <value>
                            helperDialect=mysql
                        </value>
                    </property>
                </bean>
            </array>
        </property>
    </bean>

分頁插件的可選參數(shù)介紹:

  • 默認(rèn)情況下,我們會使用PageHelper的方式進(jìn)行分頁,pageHelper實(shí)現(xiàn)了dialect接口,,如果想要實(shí)現(xiàn)自己的分頁邏輯,也可以通過實(shí)現(xiàn)Dialect接口(com.github.pagehelper.Dialect),然后配置該屬性為實(shí)現(xiàn)類的全限定名稱.

? ? ? ? ? ? ? ?

  • 在默認(rèn)dialect情況下,有以下幾個參數(shù)可以進(jìn)行設(shè)置,但是在實(shí)際的應(yīng)用過程中可以省略配置,使用默認(rèn)值即可.
    • helperDialect:自動檢測當(dāng)前數(shù)據(jù)庫的連接,選擇合適的分頁方式.也可以配置此屬性指定使用哪種數(shù)據(jù)庫連接的分頁方式(oracle? ?mysql? ?db2? .....等)
      • 注意:使用SqlServer2012數(shù)據(jù)庫時,需要手動指定為sqlserver2012,否則會使用SqlServer2015的方式進(jìn)行分頁
    • offsetAsPageNum:默認(rèn)值為false,對使用RowsBounds作為分頁參數(shù)有效,當(dāng)參數(shù)為true時,會將RowBounds中的offset參數(shù)當(dāng)成pageNum使用,可以用頁碼和頁面大小兩個參數(shù)進(jìn)行分頁.
    • rowBoundsWithCount:默認(rèn)值為false,對使用RowBounds作為分頁參數(shù)時有效,當(dāng)該參數(shù)設(shè)置為true時,使用RowBounds分頁會進(jìn)行count查詢
    • pageSizeZero: 默認(rèn)值為false,當(dāng)該參數(shù)設(shè)置為true時,如果pageSize=0或者RowsBounds.limit=0就會查詢出全部的結(jié)果(相當(dāng)于沒有執(zhí)行分頁查詢,但是返回的結(jié)果仍然是page類型)
    • reasonable:分頁合理化參數(shù),默認(rèn)值為false,當(dāng)該參數(shù)為true時,pageNum<=0時查詢第一頁,pageNum>pages(超過總數(shù)時),會查詢最后一頁,默認(rèn)為false,直接根據(jù)參數(shù)進(jìn)行查詢
    • params:為了支持startPage(Object? params)方法,增加了該參數(shù)來配置參數(shù)映射,用于從對象中根據(jù)屬性名取值,可以配置pageNum, pageSize, count, pageSizeZero, reasonable ,不配置映射則使用默認(rèn)值,默認(rèn)值為:pageNum=pageNum, pageSize=pageSize, count=countSql,reasonable=reasonable; pageSizeZero=pageSizeZero
    • supportMethodArguments:支持通過Mapper接口參數(shù)來傳遞分頁參數(shù),默認(rèn)值為false,分頁插件從查詢方法的參數(shù)中,自動根據(jù)上面params配置的字段中取值,查找到合適的值就會自動進(jìn)行分頁.
    • autoRuntimeDialect:默認(rèn)值為false.設(shè)置為true時,允許在運(yùn)行時根據(jù)多數(shù)據(jù)源自動識別對應(yīng)的方言進(jìn)行分頁(不支持自動選擇SqlServer2012).
    • closeConn:默認(rèn)值為true當(dāng)使用運(yùn)行時動態(tài)數(shù)據(jù)源或者設(shè)置helperDialect屬性自動獲取數(shù)據(jù)庫類型是,會自動獲取一個數(shù)據(jù)庫連接,通過該屬性來設(shè)置是否關(guān)閉獲取這個連接,默認(rèn)true關(guān)閉,設(shè)置為false后,不會關(guān)閉獲取的連接,參數(shù)的設(shè)置根據(jù)自己選擇的數(shù)據(jù)源來決定

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?參數(shù)的使用場景和參考連接:https://pagehelper.github.io/docs/howtouse/

三? 分頁插件在代碼中的使用

分頁插件的調(diào)用有多種方式,最用的有以下兩種調(diào)用方式.

  • //第二種,Mapper接口方式的調(diào)用,pagehelper的startPage方法
PageHelper.startPage(1, 10); 
List<Country> list = countryMapper.selectIf(1);
  • //第三種,Mapper接口方式的調(diào)用,pagehelper的offsetPage方法
PageHelper.offsetPage(1, 10);
List<Country> list = countryMapper.selectIf(1);

分頁插件的執(zhí)行原理:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ?mybatis執(zhí)行SQL語句的時候,會首先在sqlsessionFactory工廠中創(chuàng)建sqlsession對象,然后sqlsession進(jìn)入Executor執(zhí)行器中執(zhí)行方法,在執(zhí)行方法之前,mybatis攔截器對方法進(jìn)行了攔截,判斷是否包含select查詢語句,如果包含了select查詢語句,則給語句后面拼接上limit條件語句,然后將拼接后的語句返回給執(zhí)行器去執(zhí)行,最后去數(shù)據(jù)庫中查詢結(jié)果然后返回

在實(shí)際應(yīng)用中查詢分頁代碼寫在service模塊中,代碼樣式如下:

service:

// PageInfo等同于我們自定義的pageBean 并且比pageBean更完善
public PageInfo<Company> findByPage(Integer page, Integer pageSize) {
   PageHelper.startPage(page,pageSize);  //使用分頁插件 一定要緊跟一個查詢方法
   List<Company> list = companyDao.findAll(); //表面上是查詢所有,但是執(zhí)行時已經(jīng)分頁了
   return new PageInfo<Company>(list,5);
}

controller:

@RequestMapping(value = "/list", name = "查詢用戶信息")
@RequestParam(defalutValue):屬性值代表默認(rèn)值
    public String findAdd(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "5") Integer pageSize) {
        //根據(jù)分頁查詢用戶信息
        PageInfo<User> pageInfo = userService.findByPage(getCompanyId(), page, pageSize);
        //將pageInfo信息保存到request域中
        request.setAttribute("page", pageInfo);
        //重定向
        return "system/user/user-list";
    }

pageHelper的安全調(diào)用:

? ? ? ? pageHelper在使用startPage方法的時候,后面必須跟隨一個查詢的方法,因?yàn)閜ageHelper使用了靜態(tài)的ThreadLocal參數(shù),分頁參數(shù)和線程是綁定的,而在finally代碼中自動清除了ThreadLocal存儲的對象.如果代碼在進(jìn)入Executor前發(fā)生異常,就會導(dǎo)致線程不可用,同時也不會導(dǎo)致ThreadLocal參數(shù)被 錯誤的使用

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

PageInfo對象介紹

public class PageInfo<T> implements Serializable {
   private static final long serialVersionUID = 1L;
   //當(dāng)前頁
   private int pageNum;
   //每頁的數(shù)量
   private int pageSize;
   //當(dāng)前頁的數(shù)量
   private int size;
 
   //由于startRow和endRow不常用,這里說個具體的用法
   //可以在頁面中"顯示startRow到endRow 共size條數(shù)據(jù)"
 
   //當(dāng)前頁面第一個元素在數(shù)據(jù)庫中的行號
   private int startRow;
   //當(dāng)前頁面最后一個元素在數(shù)據(jù)庫中的行號
   private int endRow;
   //總記錄數(shù)
   private long total;
   //總頁數(shù)
   private int pages;
   //結(jié)果集
   private List<T> list;
 
   //前一頁
   private int prePage;
   //下一頁
   private int nextPage;
 
   //是否為第一頁
   private boolean isFirstPage = false;
   //是否為最后一頁
   private boolean isLastPage = false;
   //是否有前一頁
   private boolean hasPreviousPage = false;
   //是否有下一頁
   private boolean hasNextPage = false;
   //導(dǎo)航頁碼數(shù)
   private int navigatePages;
   //所有導(dǎo)航頁號
   private int[] navigatepageNums;
   //導(dǎo)航條上的第一頁
   private int navigateFirstPage;
   //導(dǎo)航條上的最后一頁
   private int navigateLastPage;

}

?

原文鏈接:https://blog.csdn.net/weixin_43267344/article/details/109285537

欄目分類
最近更新