1. 程式人生 > 其它 >關於 mybatis 的 @MapperScan 用法心得

關於 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)