序言
springboot + mybatis-plus + druid 是如今非常好用一套組合方案,可以大大提升我們開發的效率。
本文記錄一下老馬自己的實戰使用筆記,希望給你的工作和學習提供一點幫助。
實現原理,就是透過 springboot-starter 實現的。
分頁如果我們希望使用分頁外掛,那麼配置一下:
import com.baomidou.mybatisplus.plugins.PaginationInterceptor;import org.mybatis.spring.annotation.MapperScan;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configuration@MapperScan(basePackages = "com.github.houbb.privilege.admin.dal.mapper")public class DataSourceConfig { @Bean public PaginationInterceptor paginationInterceptor(){ PaginationInterceptor page = new PaginationInterceptor(); //設定方言型別 page.setDialectType("mysql"); return page; }}
分頁測試正常情況public BasePageInfo<User> pageQueryList(CommonPageReq pageReq) { Wrapper<User> userWrapper = new EntityWrapper<>(); // 分頁查詢 Page<User> userPage = new Page<>(pageReq.getPageNum(), pageReq.getPageSize()); userPage = this.selectPage(userPage, userWrapper); BasePageInfo<User> pageInfo = new BasePageInfo<>(); pageInfo.setList(userPage.getRecords()); pageInfo.setTotal(userPage.getTotal()); return pageInfo;}
發現這種分頁資訊是正常的。
不生效的情況import com.baomidou.mybatisplus.mapper.EntityWrapper;import com.baomidou.mybatisplus.mapper.Wrapper;import com.baomidou.mybatisplus.plugins.pagination.PageHelper;import com.github.houbb.heaven.util.lang.StringUtil;import com.github.houbb.privilege.admin.common.dto.BasePageInfo;import com.github.houbb.privilege.admin.common.dto.common.CommonPageReq;import com.github.houbb.privilege.admin.dal.entity.Role;import com.github.houbb.privilege.admin.dal.mapper.RoleMapper;import com.github.houbb.privilege.admin.service.service.RoleService;import com.baomidou.mybatisplus.service.impl.ServiceImpl;import org.springframework.stereotype.Service;import java.util.List;@Servicepublic class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService { @Override public BasePageInfo<Role> pageQueryList(CommonPageReq pageReq) { PageHelper.startPage(pageReq.getPageNum(), pageReq.getPageSize()); Wrapper<Role> roleWrapper = new EntityWrapper<>(); List<Role> userList = baseMapper.selectList(roleWrapper); long total = PageHelper.getTotal(); BasePageInfo<Role> pageInfo = new BasePageInfo<>(); pageInfo.setList(userList); pageInfo.setTotal(total); return pageInfo; }}
一開始以為是 PageHelper.startPage 後面不是緊跟查詢方法,後來調整順序發現也不行。
問題原因然後 debug 了一下原始碼。
mybatis-plus 的 PaginationInterceptor 類
// 先判斷是不是SELECT操作MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");if (!SqlCommandType.SELECT.equals(mappedStatement.getSqlCommandType())) { return invocation.proceed();}RowBounds rowBounds = (RowBounds) metaObject.getValue("delegate.rowBounds");/* 不需要分頁的場合 */if (rowBounds == null || rowBounds == RowBounds.DEFAULT) { // 本地執行緒分頁 if (localPage) { // 採用ThreadLocal變數處理的分頁 rowBounds = PageHelper.getPagination(); if (rowBounds == null) { return invocation.proceed(); } } else { // 無需分頁 return invocation.proceed(); }}
發現屬性 localPage 沒有啟動,於是調整一下分頁的配置:
@Beanpublic PaginationInterceptor paginationInterceptor(){ PaginationInterceptor page = new PaginationInterceptor(); //設定方言型別 page.setDialectType("mysql"); page.setLocalPage(true); return page;}
然後分頁就正常了。
小結myabtis-plus 個人使用的版本可能相對比較低,這種基於 ThreadLocal 的分頁方式沒有預設開啟。
有時候去網上查也很難查到類似的問題。因為不同的版本,問題可能完全不同,所以還是需要看原始碼。
本實戰系列用於記錄 springboot 的實際使用和學習筆記。
我是老馬,期待與你的下次相遇。
最新評論