關於 mybatis 的 @MapperScan 用法心得


1. 必需引用 mybatis-spring-boot-starter, 否則不能掃描生效。可以用 mybatis-plus 的 mybatis-plus-boot-starter 替代。

2. 從網上搜 MapperScan,大部分說是通過 basePackage 指定掃描多個包,本身沒問題,但不是一個完美的方案。原因如下:

(1)如果掃描的包名是一個較頂級的,那么,一些不是 mapper 的 interface 也會被處理成 mapper 而被創建成一個 spring bean,造成系統無法啟動,這肯定不行。

(2)只有縮小包的范圍,最好是只配置 mapper 對應包,但如果把所有包含  mapper 的包羅列出來,則也存在不足。

  - 其一,會導致列表變得比較長。用通配符解決一部分問題,但需要包包滿足一些統一的規則。另外,對於層級不同的情況,不好處理。

  - 其二,則降低了擴展性,因為每增加或調整 mapper 包,都要到 @MapperScan 中去注冊。業務代碼的變更影響了框架性的代碼。尤其是對於多模塊的情況,這個問題變得越發隱晦:誰能想到多引用一個模塊就需要配置一下 @MapperScan?

  - 其三,違背依賴的原則,本來框架不依賴業務,現在變成了框架反過來要因業務變化而調整代碼。

3. 因此,我認為最好的方式是,在 @MapperScan 中,使用 basePackage + annotationClass 組件解決問題。

(1)所有的 mapper 上加上 @Mapper 注解。這是合理的,因為本身 mapper 屬於一類特殊的接口,理應該要通過特殊注冊進行區分。

(2)有了第1條,basePackage 就可以指定一個較頂級的包名了

通過上面兩條,一方面解決了 mapper 包動態變化的問題,因為業務上的代碼一般會有一個統一的包前綴,典型的如 com.cortName, 那么就可以把它作為 basePackage,只需要配置一次,后面的變化都不受影響。

示例:

@MapperScan(basePackages = {"com.biz1", "com.group2"}, annotationClass = Mapper.class)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM