天天看點

springboot 整合mybatis_springboot+mybatis+druid 整合實戰序言springboot 整合 mybatis-plusmaven 依賴配置檔案分頁分頁測試正常情況不生效的情況問題原因小結拓展閱讀

序言

springboot + mybatis-plus + druid 是如今非常好用一套組合方案,可以大大提升我們開發的效率。

本文記錄一下老馬自己的實戰使用筆記,希望給你的工作和學習提供一點幫助。

springboot 整合mybatis_springboot+mybatis+druid 整合實戰序言springboot 整合 mybatis-plusmaven 依賴配置檔案分頁分頁測試正常情況不生效的情況問題原因小結拓展閱讀

springboot 整合 mybatis-plus

maven 依賴

  • 版本
3.4.41.3.12.31.85.1.471.1.141.8.102.01.5.11.RELEASE
           
  • 依賴
    org.mybatis    mybatis    ${mybatis.version}    org.mybatis    mybatis-spring    ${mybatis-spring.version}    com.baomidou    mybatis-plus    ${mybatis-plus.version}                        mybatis            org.mybatis                            mybatis-spring            org.mybatis                com.baomidou    mybatis-plus-boot-starter    ${mybatis-plus.version}    org.apache.velocity    velocity-engine-core    ${velocity.version}    mysql    mysql-connector-java    ${mysql.version}    runtime    com.alibaba    druid-spring-boot-starter    ${druid.version}    org.springframework.boot    spring-boot-starter-jdbc    ${spring-boot.version}    org.springframework.boot    spring-boot-starter-test    ${spring-boot.version}    test    org.springframework.boot    spring-boot-starter-web    ${spring-boot.version}
           

配置檔案

server:  port: 8080spring:  datasource:    druid:      username: root      password: 123456      url: jdbc:mysql://localhost:3306/padmin?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC      driver-class-name: com.mysql.jdbc.Drivermybatis-plus:  mapper-locations: classpath*:com/github/houbb/privilege/admin/dal/mapper/*Mapper.xml  type-aliases-package: com.github.houbb.privilege.admin.dal.entity
           

到這裡,最基本的配置就完成了。

實作原理,就是通過 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;@[email protected](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 pageQueryList(CommonPageReq pageReq) {    Wrapper userWrapper = new EntityWrapper<>();    // 分頁查詢    Page userPage = new Page<>(pageReq.getPageNum(), pageReq.getPageSize());    userPage = this.selectPage(userPage, userWrapper);    BasePageInfo 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 implements RoleService {    @Override    public BasePageInfo pageQueryList(CommonPageReq pageReq) {        PageHelper.startPage(pageReq.getPageNum(), pageReq.getPageSize());        Wrapper roleWrapper = new EntityWrapper<>();        List userList = baseMapper.selectList(roleWrapper);        long total = PageHelper.getTotal();        BasePageInfo 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 的實際使用和學習筆記。

希望本文對你有所幫助,如果喜歡,歡迎點贊收藏轉發一波。

我是老馬,期待與你的下次相遇。

拓展閱讀

面試官:知道 springboot 的啟動原理嗎?

5 分鐘入門 springboot 實戰學習筆記

實作你的自定義 springboot starter 實戰

springboot 整合阿裡 druid 資料庫連接配接池實戰

springboot 整合mybatis_springboot+mybatis+druid 整合實戰序言springboot 整合 mybatis-plusmaven 依賴配置檔案分頁分頁測試正常情況不生效的情況問題原因小結拓展閱讀