使用

1)、統計總數,(將SQL語句變為 select count(0) from xxx,只對簡單SQL語句其效果,複雜SQL語句需要自己寫)
    Page<?> page = PageHelper.startPage(1,-1);
    long count = page.getTotal();
2)、分頁,pageNum - 第N頁, pageSize - 每頁M條數
    A、只分頁不統計(每次只執行分頁語句)
    PageHelper.startPage([pageNum],[pageSize]);
    List<?> pagelist = queryForList( xxx.class, "queryAll" , param);
    //pagelist就是分頁之後的結果
    B、分頁並統計(每次執行2條語句,一條select count語句,一條分頁語句)適用於查詢分頁時數據發生變動,需要將實時的變動信息反映到分頁結果上
    Page<?> page = PageHelper.startPage([pageNum],[pageSize],[iscount]);
    List<?> pagelist = queryForList( xxx.class , "queryAll" , param);
    long count = page.getTotal();
    //也可以 List<?> pagelist = page.getList();  獲取分頁後的結果集
3)、使用PageHelper查全部(不分頁)
    PageHelper.startPage(1,0);
    List<?> alllist = queryForList( xxx.class , "queryAll" , param);
4)、PageHelper的其他API
    String orderBy = PageHelper.getOrderBy();    //獲取orderBy語句
    Page<?> page = PageHelper.startPage(Object params);
    Page<?> page = PageHelper.startPage(int pageNum, int pageSize);
    Page<?> page = PageHelper.startPage(int pageNum, int pageSize, boolean isCount);
    Page<?> page = PageHelper.startPage(pageNum, pageSize, orderBy);
    Page<?> page = PageHelper.startPage(pageNum, pageSize, isCount, isReasonable);    //isReasonable分頁合理化,null時用默認配置
    Page<?> page = PageHelper.startPage(pageNum, pageSize, isCount, isReasonable, isPageSizeZero);    //isPageSizeZero是否支持PageSize為0,true且pageSize=0時返回全部結果,false時分頁,null時用默認配置

什麼時候會導致不安全的分頁?

PageHelper 方法使用了靜態的 ThreadLocal 參數,分頁參數和線程是綁定的。

只要你可以保證在 PageHelper 方法調用後緊跟 MyBatis 查詢方法,這就是安全的。因為 PageHelper 在 finally 代碼段中自動清除了 ThreadLocal 存儲的對象。

如果代碼在進入 Executor 前發生異常,就會導致線程不可用,這屬於人為的 Bug(例如接口方法和 XML 中的不匹配,導致找不到 MappedStatement 時), 這種情況由於線程不可用,也不會導致 ThreadLocal 參數被錯誤的使用。

但是如果你寫出下面這樣的代碼,就是不安全的用法:

PageHelper.startPage(1, 10);
List<Country> list;
if(param1 != null){
    list = countryMapper.selectIf(param1);
} else {
    list = new ArrayList<Country>();
}

這種情況下由於 param1 存在 null 的情況,就會導致 PageHelper 生產了一個分頁參數,但是沒有被消費,這個參數就會一直保留在這個線程上。當這個線程再次被使用時,就可能導致不該分頁的方法去消費這個分頁參數,這就產生了莫名其妙的分頁。

上面這個代碼,應該寫成下面這個樣子:

List<Country> list;
if(param1 != null){
    PageHelper.startPage(1, 10);
    list = countryMapper.selectIf(param1);
} else {
    list = new ArrayList<Country>();
}

這種寫法就能保證安全。

如果你對此不放心,你可以手動清理 ThreadLocal 存儲的分頁參數,可以像下面這樣使用:

List<Country> list;
if(param1 != null){
    PageHelper.startPage(1, 10);
    try{
        list = countryMapper.selectAll();
    } finally {
        PageHelper.clearPage();
    }
} else {
    list = new ArrayList<Country>();
}

這麼寫很不好看,而且沒有必要。

 

轉載:

 

TRANSLATE with x

English

Arabic

Hebrew

Polish

Bulgarian

Hindi

Portuguese

Catalan

Hmong Daw

Romanian

Chinese Simplified

Hungarian

Russian

Chinese Traditional

Indonesian

Slovak

Czech

Italian

Slovenian

Danish

Japanese

Spanish

Dutch

Klingon

Swedish

English

Korean

Thai

Estonian

Latvian

Turkish

Finnish

Lithuanian

Ukrainian

French

Malay

Urdu

German

Maltese

Vietnamese

Greek

Norwegian

Welsh

Haitian Creole

Persian

 

 

TRANSLATE with

COPY THE URL BELOW

Back

EMBED THE SNIPPET BELOW IN YOUR SITE


Enable collaborative features and customize widget: Bing Webmaster Portal

Back

帶着疑問去思考,然後串聯,進而歸納總結,不斷追問自己,進行自我辯證,像偵查嫌疑案件一樣看待技術問題,漆黑的街道,你我一起尋找線索,你就是技術界大偵探福爾摩斯