筆者近期在整合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);
}
最終能夠正常輸出出來
終於解決了,不需要自己返回再封裝。