spring Boot集成mybatis:注解與配置文件的協同作用
在spring boot與MyBatis的整合開發中,Mapper接口及其映射文件的配置常常令人困惑。本文將詳細闡述@Mapper、@MapperScan注解和mybatis.mapper-locations配置文件參數之間的區別,并解釋為何僅使用注解有時會引發“Invalid bound statement (not found)”錯誤。
許多開發者遇到過“Invalid bound statement (not found)”錯誤,這表示MyBatis找不到對應的sql映射語句。即使Mapper接口使用了@Mapper注解,啟動類也使用了@MapperScan注解,錯誤仍然可能出現。只有在application.properties或application.yml中添加mybatis.mapper-locations=classpath:mapper/*.xml后,程序才能正常運行。這種現象引發了對這三種配置方式作用的疑問,它們似乎都指向Mapper接口的位置。
實際上,@Mapper和@MapperScan注解并非直接指定Mapper接口的XML映射文件位置,而是負責將Mapper接口注冊到spring容器中。@Mapper用于單個Mapper接口,而@MapperScan用于掃描指定包下所有Mapper接口,并將它們注冊為Spring Bean。 Spring通過這些注解創建Mapper接口的代理對象,從而方便調用MyBatis的SQL映射方法。
然而,MyBatis還需要知道sql語句的存放位置。@Mapper和@MapperScan只負責注冊Mapper接口,它們并不知道SQL語句存儲在哪個XML文件中。mybatis.mapper-locations參數則明確告訴MyBatis XML映射文件的位置,例如classpath:mapper/*.xml表示MyBatis應在classpath下的mapper目錄中查找所有XML映射文件。
因此,@Mapper和@MapperScan負責Mapper接口的注冊,mybatis.mapper-locations則負責告知MyBatis SQL映射文件的位置。兩者并非替代關系,而是互補的。只有當MyBatis同時找到Mapper接口的代理對象及其對應的SQL映射文件時,程序才能正常工作。如果只使用注解而未配置mybatis.mapper-locations,MyBatis將無法找到SQL映射文件,從而導致“Invalid bound statement (not found)”錯誤。 所以,在使用MyBatis時,需要同時使用注解注冊Mapper接口,并使用mybatis.mapper-locations配置映射文件路徑,確保兩者協同工作。