1 mybatis-plus提供的方法不需要映射文件的支持
如果controller請求的service使用的是BaseService寫的方法,那么最終代碼不會走到mapper接口的映射文件——換句話說,resource包下有沒有映射文件都不影響查詢
|
|
2 放置映射文件的兩種情況
在把自動生成的文件復制到自己的項目時,要將接口和java文件放在java包下,將mapper包的映射文件放在resource包下
根據映射文件放置在resource下的位置,有兩種情況
2.1 接口和映射文件同包同目錄
所謂的同包同目錄不是說接口和映射文件都在一個包內,而是兩個文件分開在不同包內,但包的名字以及層級完全相同
完全相同的情況下不用特別去做什么操作
2.1.1“完全相同”的概念
映射文件從resource下開始看包名和層級
mapper接口從java下開始看包名和層級
|
|
2.1.2 mapper 特別的包名
經過測試發現,在springboot工程中,如果接口放在mapper包下(或者子包下),而映射文件也放在resource/mapper包下,那么此時springboot可以找到這些映射文件,在springboot看來,兩者算同包同目錄,估計是在springboot的哪個內置類中定義了這個默認路徑(並且設置了掃描這個包和子包)
|
|
|
2.2 接口和映射文件不是同包同目錄
此時項目中的接口和映射文件放在兩個不同的包下並且包名不完全相同
不完全相同的情況下,就需要在yml文件中說明映射文件的路徑,讓spring容器能找到這些文件
|
|
具體操作
通過AutoConfigure類找mybatis,最后找到mybatisproperties類,在里面找屬性和方法,知道可以通過mapper-locations去配置映射文件地址,然后到springboot的配置文件中配置(或者簡單的辦法——百度)
舉例
java項目中的classpath到底是什么 - SegmentFault 思否
下面只是舉例了幾種情況,要想真正理解classpath后的路徑怎么寫,可以看看上面的鏈接
2.2.1 情況一 resource包根目錄(一般沒人用)
只查詢根目錄,不深入子目錄
圖:
|
|
代碼:
mybatis-plus:
mapper-locations: classpath:*.xml
2.2.2 情況二 resource一級目錄(常用)
只查詢指定的一級目錄,不深入一級目錄的子目錄
圖:
|
|
代碼:
mybatis-plus:
mapper-locations: classpath:dao/*.xml
2.2.3 情況三 resource一級目錄 com包(一般沒人用)
特別的,如果直接放在com包下(一般也沒人這樣不規范放置吧?),需要加上前置目錄(這種情況下只能用**/了 **/代表名稱的路徑),否則會報錯
圖:
|
|
代碼:
mybatis-plus:
mapper-locations: classpath:**/com/*.xml
2.2.4 情況四 resource非一級目錄(常用)
只掃描到指定目錄,不會掃描指定目錄的子目錄
圖:
|
|
代碼:
mybatis-plus:
mapper-locations: classpath:**/springboot/*.xml
2.2.5 情況五 需要掃描指定目錄和其子目錄(一般沒人用)
上面所有的情況,都只是掃描指定目錄,如果希望連帶子目錄一起掃描,就在指定目錄后加**/,這就能把指定目錄以及所有子目錄的文件都掃描到
圖:
|
|
代碼:
mybatis-plus:
mapper-locations: classpath:**/springboot/**/*.xml
3 配置接口的兩種方式
配置完映射文件,現在要配置接口文件
目前有兩種方式讓spring容器讀取到mapper接口文件——@Mapper注解 和 包掃描
有的mapper自動生成工具會根據使用時的設置自動配好@Mapper注解或者包掃描
3.1 使用@Mapper注解
如果mapper接口使用@Mapper注解方式,后續開發時新創建的mapper接口,也得在類上使用這個注解
|
|
3.2 使用包掃描
每個接口都要手動添加一個@Mapper太麻煩了,所以有了包掃描@MapperScan
如果希望使用包掃描(或者把@Mapper改為包掃描),需要在springboot啟動類上或者自定義一個配置類,在類上使用包掃描注解
一旦使用包掃描,此時所有mapper接口上的@Mapper注解就失效了
@MapperScan(basePackages = {"com.javasm.springboot.mapper"})
|
|
3.3 mapper包掃描的注意事項
在使用包掃描時,如果如圖設置目錄結構以及mapper的包掃描,有時候會出現只掃描mapper包下的接口,不掃描mapper包下的子包的情況(老師演示時出現的問題)
但是我個人測試了一下 掃描mapper接口時,把MyMapper接口放在mapper/base包下 一樣能掃到,沒有出現問題
即便把RoleMapper放到base下,依然能正常掃描到,這個包掃描並不是只掃描mapper包,會連帶掃描子包
|
|
|












![CSpringBootApp1 i cati on
CEnabl e Transact i onManagement
{"com. javasm. springboot. mapper"b )
@MapperScan (basePackages =
public class FirstSpringApp1ication
public static void main (String[] args) {
SpringApp1ication. run(FirstSpringApp1ication. class, args) ;](/image/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMjQ3ODE5Mi8yMDIxMTAvMjQ3ODE5Mi0yMDIxMTAwNDIzMjIxMjE5Mi0xMTE1OTE0NjY2LnBuZw==.png)

![- @SpringBootApp1ication
flapper'S can (base Packages
{"com. IWI . mapper " } )
- @Enab1eTransactionmanagement
public class {
public static void main(StringC] args) {
SpringApp1ication . run ( SpringbootApp1ication . class ,
args) ;](/image/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMjQ3ODE5Mi8yMDIxMTAvMjQ3ODE5Mi0yMDIxMTAwNDIzMjIxMjExOC02NzMyODk5OTAucG5n.png)