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

學無先后,達者為師

網站首頁 編程語言 正文

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

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

目錄

使用pageHelper的步驟

一? 引入分頁插件

二? 配置攔截器插件

分頁插件的可選參數介紹:

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

分頁插件的執行原理:

在實際應用中查詢分頁代碼

pageHelper的安全調用:

PageInfo對象介紹


pageHelper是國內非常優秀的一款mybatis分頁插件,支持基本的主流與常用的數據庫.

使用pageHelper的步驟

一? 引入分頁插件

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

二? 配置攔截器插件

在dao層的applicationContext-dao.xml配置文件中,配置以下內容

<!--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">
                        <!--使用下面方式配置參數,一行配置一個,可以不用配置可使用默認值-->
                        <value>
                            helperDialect=mysql
                        </value>
                    </property>
                </bean>
            </array>
        </property>
    </bean>

分頁插件的可選參數介紹:

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

? ? ? ? ? ? ? ?

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

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

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

分頁插件的調用有多種方式,最用的有以下兩種調用方式.

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

分頁插件的執行原理:

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

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

在實際應用中查詢分頁代碼寫在service模塊中,代碼樣式如下:

service:

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

controller:

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

pageHelper的安全調用:

? ? ? ? pageHelper在使用startPage方法的時候,后面必須跟隨一個查詢的方法,因為pageHelper使用了靜態的ThreadLocal參數,分頁參數和線程是綁定的,而在finally代碼中自動清除了ThreadLocal存儲的對象.如果代碼在進入Executor前發生異常,就會導致線程不可用,同時也不會導致ThreadLocal參數被 錯誤的使用

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

PageInfo對象介紹

public class PageInfo<T> implements Serializable {
   private static final long serialVersionUID = 1L;
   //當前頁
   private int pageNum;
   //每頁的數量
   private int pageSize;
   //當前頁的數量
   private int size;
 
   //由于startRow和endRow不常用,這里說個具體的用法
   //可以在頁面中"顯示startRow到endRow 共size條數據"
 
   //當前頁面第一個元素在數據庫中的行號
   private int startRow;
   //當前頁面最后一個元素在數據庫中的行號
   private int endRow;
   //總記錄數
   private long total;
   //總頁數
   private int pages;
   //結果集
   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;
   //導航頁碼數
   private int navigatePages;
   //所有導航頁號
   private int[] navigatepageNums;
   //導航條上的第一頁
   private int navigateFirstPage;
   //導航條上的最后一頁
   private int navigateLastPage;

}

?

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

欄目分類
最近更新