利用Aspect對PageHelper的簡單封裝

PageHelper是一個Mybatis插件捕仔,是一個非常方便使用的分頁插件幌墓,常用方式為:PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectIf(1);
這種方式很方便熊杨,但這是非常容易出問題的使用方式榕暇。
作者在使用文檔也有說明:

image.png

其實實際使用中,尤其是業(yè)務(wù)復(fù)雜,查詢條件很多的情況下悟衩,很容易造成疏忽,
然后出現(xiàn)莫名奇妙的分頁栓拜,而且這種問題是很難定位的座泳。
嚴謹?shù)氖褂梅绞綉?yīng)該為:

try{
  PageHelper.startPage(1, 10);
  ...
  mapper.select();
}finally{
  PageHelper.clearPage();
}

保證PageHelper.clearPage()一定被調(diào)用。
但這樣寫起來非常啰嗦幕与,這種模板類代碼看起來很不優(yōu)雅呢挑势。
解決辦法:使用Aop,消除模板代碼啦鸣。

定義注解:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PagingQuery {
    String pageNumParameterName() default "pageNum";//頁號的參數(shù)名
    String pageSizeParameterName() default "pageSize";//每頁行數(shù)的參數(shù)名
}

定義切面:

@Aspect
@Component
public class Aop{
      @Around("@annotation(pagingQuery)")
      public Object pagingQuery(ProceedingJoinPoint joinPoint, PagingQuery  pagingQuery) throws Throwable {
          MethodSignature signature = (MethodSignature) joinPoint.getSignature();
          Class<?> returnType = signature.getMethod().getReturnType();
          if (returnType == List.class) {
              String pageNumParameterName = pagingQuery.pageNumParameterName();
              String pageSizeParameterName = pagingQuery.pageSizeParameterName();
              //獲取request潮饱,從中獲取分頁參數(shù)
              ServletRequestAttributes currentRequestAttributes = (ServletRequestAttributes) RequestContextHolder
                    .currentRequestAttributes();
              HttpServletRequest request = currentRequestAttributes.getRequest();
              String pageNum = request.getParameter(pageNumParameterName);
              String pageSize = request.getParameter(pageSizeParameterName);
              if (StringUtils.isNotBlank(pageNum) && StringUtils.isNotBlank(pageSize)) {
                  try {
                      PageHelper.startPage(Integer.valueOf(pageNum), Integer.valueOf(pageSize));
                      Object result = joinPoint.proceed();
                      return new PageInfo<>((List<?>) result);//建議自己實現(xiàn)返回類型,官方自帶的返回數(shù)據(jù)太冗余了
                  } finally {//保證線程變量被清除
                      if (PageHelper.getLocalPage() != null)
                          PageHelper.clearPage();
                  }
              }
          }
          return joinPoint.proceed();
      }
}

使用示例

在controller上使用:
    @PagingQuery(pageNumParameterName = "page", pageSizeParameterName = "size")//當前端調(diào)用時傳的參數(shù)名跟默認不一致時需指定參數(shù)名
    @PostMapping("/list")
    public List<User> list() {
        return userService.findAll();
    }
或在service上使用:
@PagingQuery
public List<User> pagingQuery(args) {
         ...
        return mapper.select(condition);
    }

是不是更加方便優(yōu)雅了诫给。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末香拉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子中狂,更是在濱河造成了極大的恐慌凫碌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胃榕,死亡現(xiàn)場離奇詭異盛险,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門枉层,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泉褐,“玉大人,你說我怎么就攤上這事鸟蜡。” “怎么了挺邀?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵揉忘,是天一觀的道長。 經(jīng)常有香客問我端铛,道長泣矛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任禾蚕,我火速辦了婚禮您朽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘换淆。我一直安慰自己哗总,他們只是感情好,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布倍试。 她就那樣靜靜地躺著讯屈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪县习。 梳的紋絲不亂的頭發(fā)上涮母,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機與錄音躁愿,去河邊找鬼叛本。 笑死,一個胖子當著我的面吹牛彤钟,可吹牛的內(nèi)容都是我干的来候。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼样勃,長吁一口氣:“原來是場噩夢啊……” “哼吠勘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起峡眶,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤剧防,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辫樱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峭拘,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸡挠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辉饱。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拣展,靈堂內(nèi)的尸體忽然破棺而出彭沼,到底是詐尸還是另有隱情,我是刑警寧澤备埃,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布姓惑,位于F島的核電站,受9級特大地震影響按脚,放射性物質(zhì)發(fā)生泄漏于毙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一辅搬、第九天 我趴在偏房一處隱蔽的房頂上張望唯沮。 院中可真熱鬧,春花似錦堪遂、人聲如沸介蛉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甘耿。三九已至,卻和暖如春竿滨,著一層夾襖步出監(jiān)牢的瞬間佳恬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工于游, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毁葱,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓贰剥,卻偏偏與公主長得像倾剿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蚌成,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容