springboot項目中 mybatis的xml映射文件位置 mapper接口配置


1 mybatis-plus提供的方法不需要映射文件的支持

如果controller請求的service使用的是BaseService寫的方法,那么最終代碼不會走到mapper接口的映射文件——換句話說,resource包下有沒有映射文件都不影響查詢

0@RestContr011er 
" role " ) 
public class RoleContr011er { 
private IR01eService iR01eService; 
@GetMapping( " one " ) 
public Role queryOne(){ 
return iR01eService . get8yId(1); 
RoleControllerjava X 
I Servicejava 
boolean saveOrUpdate(T entity) ; 
* fifi ID 
* id _ææro 
RoleMapF 
default T getById(Seria1izab1e id) { 
return get8aseMapper() . selectById(id) ; 
Ice

 

2 放置映射文件的兩種情況

在把自動生成的文件復制到自己的項目時,要將接口和java文件放在java包下,將mapper包的映射文件放在resource包下

根據映射文件放置在resource下的位置,有兩種情況

 

2.1 接口和映射文件同包同目錄

所謂的同包同目錄不是說接口和映射文件都在一個包內,而是兩個文件分開在不同包內,但包的名字以及層級完全相同

完全相同的情況下不用特別去做什么操作

 

2.1.1“完全相同”的概念

映射文件從resource下開始看包名和層級

mapper接口從java下開始看包名和層級

сот 
V springboot 
controller 
Вао 
О RoleMapper 
О SysroleMapper 
О SyssalaryMapper 
О SysuserMapper 
entity 
service 
(В Springbooapplication 
resources 
сот 
V springboot 
RoleMapper.xml 
SysroleMapper.xml 
SysuserMapper.xml 
static 
templates 
application.yml

 

2.1.2 mapper 特別的包名

經過測試發現,在springboot工程中,如果接口放在mapper包下(或者子包下),而映射文件也放在resource/mapper包下,那么此時springboot可以找到這些映射文件,在springboot看來,兩者算同包同目錄,估計是在springboot的哪個內置類中定義了這個默認路徑(並且設置了掃描這個包和子包)

v 
Dconfig 
@Myconfig 
' on " 。 r 
0 AdminMapper 
丷 0 impl 
•AdminServiceImpl 
生 IAdminService 
這 是 標 准 的 同 包 同 目 錄 
v : 河 《 om•j “ 0 m 薩 汾 gboot•mapper 
".AdminMapper•xml 
特 別 的 mapper 包 
"AdminMapperxml 也 會 被 認 為 是 同 包 同 目 錄

mapper 
O RoleMapper 
O SysroleMapper 
O SyssalaryMapper 
O SysuserMapper 
service 
SpringbootApplication 
resources 
com 
mapper 
spring boot 
daoxml 
RoleMapper.xml 
tn SysroleMapper.xml 
tn SyssalaryMapper.xml 
tn SysuserMapper.xml

 

2.2 接口和映射文件不是同包同目錄

此時項目中的接口和映射文件放在兩個不同的包下並且包名不完全相同

不完全相同的情況下,就需要在yml文件中說明映射文件的路徑,讓spring容器能找到這些文件

сот 
springboot 
controller 
О RoleMapper 
О SysroleMapper 
О SyssalaryMapper 
О SysuserMapper 
entity 
service 
(В Springbooapplication 
resources 
сот 
springboot 
Вао 
RoleMapper.xml 
SysroleMapper.xml 
SysuserMapper.xml 
static 
templates

 

具體操作

通過AutoConfigure類找mybatis,最后找到mybatisproperties類,在里面找屬性和方法,知道可以通過mapper-locations去配置映射文件地址,然后到springboot的配置文件中配置(或者簡單的辦法——百度)

 

舉例

java項目中的classpath到底是什么 - SegmentFault 思否

下面只是舉例了幾種情況,要想真正理解classpath后的路徑怎么寫,可以看看上面的鏈接

 

2.2.1 情況一 resource包根目錄(一般沒人用)

只查詢根目錄,不深入子目錄

圖:

resources 
static 
templates 
application.yml 
RoleMapper.xml 
tn SysroleMapper.xml 
tn SyssalaryMapper.xml 
tn SysuserMapper.xml

代碼:

mybatis-plus:
  mapper-locations: classpath:*.xml

2.2.2 情況二 resource一級目錄(常用)

只查詢指定的一級目錄,不深入一級目錄的子目錄

圖:

resources 
com 
RoleMapper.xml 
tn SysroleMapper.xml 
tn SyssalaryMapper.xml 
tn SysuserMapper.xml 
static 
templates 
application.yml

代碼:

mybatis-plus:
  mapper-locations: classpath:dao/*.xml

2.2.3 情況三 resource一級目錄 com包(一般沒人用)

特別的,如果直接放在com包下(一般也沒人這樣不規范放置吧?),需要加上前置目錄(這種情況下只能用**/ **/代表名稱的路徑),否則會報錯

圖:

v resaurces 
v com 
RoleMapper.xml 
SysroleMapper.xml 
SyssalaryMapper.xml 
SysuserMapper.xml

代碼:

mybatis-plus:
  mapper-locations: classpath:**/com/*.xml

2.2.4 情況四 resource非一級目錄(常用)

只掃描到指定目錄,不會掃描指定目錄的子目錄

圖:

resources 
com 
spring 
daoxml 
RoleMapper.xml 
tn SysroleMapper.xml 
tn SyssalaryMapper.xml 
tn SysuserMapper.xml

 

代碼:

mybatis-plus:
  mapper-locations: classpath:**/springboot/*.xml

2.2.5 情況五 需要掃描指定目錄和其子目錄(一般沒人用)

上面所有的情況,都只是掃描指定目錄,如果希望連帶子目錄一起掃描,就在指定目錄后加**/,這就能把指定目錄以及所有子目錄的文件都掃描到

圖:

resources 
com 
spring 
daoxml 
tn SyssalaryMapper.xml 
RoleMapper.xml 
tn SysroleMapper.xml 
tn SysuserMapper.xml

代碼:

mybatis-plus:
  mapper-locations: classpath:**/springboot/**/*.xml

3 配置接口的兩種方式

配置完映射文件,現在要配置接口文件

目前有兩種方式讓spring容器讀取到mapper接口文件——@Mapper注解 包掃描

有的mapper自動生成工具會根據使用時的設置自動配好@Mapper注解或者包掃描

 

3.1 使用@Mapper注解

如果mapper接口使用@Mapper注解方式,后續開發時新創建的mapper接口,也得在類上使用這個注解

CMapper L/ 
public interface AÆninMapper 
List<Admin> list ;

 

3.2 使用包掃描

每個接口都要手動添加一個@Mapper太麻煩了,所以有了包掃描@MapperScan

如果希望使用包掃描(或者把@Mapper改為包掃描),需要在springboot啟動類上或者自定義一個配置類,在類上使用包掃描注解

一旦使用包掃描,此時所有mapper接口上@Mapper注解就失效了

@MapperScan(basePackages = {"com.javasm.springboot.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) ;

 

3.3 mapper包掃描的注意事項

在使用包掃描時,如果如圖設置目錄結構以及mapper的包掃描,有時候會出現只掃描mapper包下的接口,不掃描mapper包下的子包的情況(老師演示時出現的問題)

 

但是我個人測試了一下 掃描mapper接口時,把MyMapper接口放在mapper/base包下 一樣能掃到,沒有出現問題

即便把RoleMapper放到base下,依然能正常掃描到,這個包掃描並不是只掃描mapper包,會連帶掃描子包

map per 
O MyMapper 
O RoleMapper 
O SysroleMapper 
O SyssalaryMapper 
O SysuserMapper

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

 


免責聲明!

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



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