【Springboot採坑日記】Springboot整合Mybatis和Mybatis-Plus自定義SQL分頁

2020-09-29 17:00:54

Springboot整合Mybatis和Mybatis-Plus的大坑

整合問題來源

問題來源

筆者近期在整合Springboot和mybatis時,一直採用的以下方式:
pom檔案:

       <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>

yml檔案:

mybatis:
  type-aliases-package: top.powersys..*.entity
  mapper-locations: classpath:top/powersys/**/**/dao/xml/*.xml

mapper介面:

@Mapper
public interface DebtMapper {
    List<DebtRecordDto> getDebtByAccoutNoList( @Param("accountNo") String accountNo);
}

一直也都是沒有什麼問題。由於功能偵錯沒問題了,便打算新增分頁。調研了許久,在朋友的建議下決定不自己手寫分頁工具,直接利用Myabtis-plus進行整合。
依賴如下:

<!--mp-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>2.1.5</version>
        </dependency>

並且新增設定:

@Configuration
public class PageConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        return paginationInterceptor;
    }

}

將Mapper中的介面修改為:

@Mapper
public interface DebtMapper {
    Page<DebtRecordDto> getDebtByAccoutNoList(Page<DebtRecordDto> page, @Param("accountNo") String accountNo);
}

結果報錯,報錯內容:應該selectOne() 為一個物件或者null,而不該為多個。於是筆者無語了,本想著用IPage直接對封裝物件DebtRecordDto進行封裝,怎麼就沒有封裝成List查詢。
於是筆者跟隨原始碼後,發現原始碼中,statement的執行結果直接封裝返回,並且直接進入selectOne()方法中,並沒有返回給IPage做再封裝。於是筆者將上述程式碼改為:

@Mapper
public interface DebtMapper {
    List<DebtRecordDto> getDebtByAccoutNoList(Page<DebtRecordDto> page, @Param("accountNo") String accountNo);
}

最終完美解決,page中存的包括paginationInterceptor攔截器執行後的select count(1),而List則是分頁後的結果,返回Page的時候,要把List反過來賦給Page。

挖坑過程

雖然能夠分頁返回,但每次都要將返回的值在反過來賦給page,筆者不爽於多寫程式碼,於是運用了百度大法,看到都用

@Mapper
public interface DebtMapper {
    IPage<DebtRecordDto> getDebtByAccoutNoList(Page<DebtRecordDto> page, @Param("accountNo") String accountNo);
}

後,便也朝著改造,卻發現沒有IPage的類,於是提高了Mybatis的依賴版本:

<!--mp-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.1.0</version>
        </dependency>

別的依賴不做修改,並且跟著一起做,結果又報了詭異的錯誤,雖然能跑起來,但是每次跳轉都會出現異常,於是筆者升級到3.1.2版本,結果報錯,說
ibatis.session.Configuration 不能cast to mybatisplus.core.MybatisConfiguration
在網上搜了很多資料,毫無所獲

解決方案

Configuration作為MybatisConfiguration的父類別,不該無法強轉,於是筆者想,也許是原來的ibatis類下沒有MybatisConfiguration這個子類,一查ibatis包,果然沒有,於是棄用mybatis的依賴,而改為mybatis-plus-boot-starter的依賴

        <!--新增mybatis-->
<!--        <dependency>-->
<!--            <groupId>org.mybatis.spring.boot</groupId>-->
<!--            <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--            <version>2.1.3</version>-->
<!--        </dependency>-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.2</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-core</artifactId>
            <version>3.0.7.1</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-extension</artifactId>
            <version>3.0.7.1</version>
        </dependency>

同時,要把yml組態檔修改,不然找不到xml和entity

mybatis-plus:
  type-aliases-package: top.powersys..*.entity
  mapper-locations: classpath:top/powersys/**/**/dao/xml/*.xml

然後,重新更新Mapper類:

@Mapper
public interface DebtMapper {
    IPage<DebtRecordDto> getDebtByAccoutNoList(Page<DebtRecordDto> page, @Param("accountNo") String accountNo);
}

最終能夠正常輸出出來
在這裡插入圖片描述
終於解決了,不需要自己返回再封裝。