spring Boot集成mybatis時,@Mapper、@MapperScan注解和mybatis.mapper-locations配置文件參數如何協同工作?本文將詳細解釋它們之間的區別,并說明為何缺少mybatis.mapper-locations配置會導致org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)錯誤。
Invalid bound statement (not found)錯誤表明MyBatis無法找到對應的sql映射語句。雖然@Mapper(用于單個Mapper接口)、@MapperScan(用于掃描多個Mapper接口)和mybatis.mapper-locations都與Mapper接口定位相關,但它們的功能不同。
@Mapper注解將一個接口標記為MyBatis的Mapper接口,指示Spring創建該接口的動態代理對象。此代理對象執行接口方法并調用相應的sql語句。需要注意的是,@Mapper只能用于單個Mapper接口。
@MapperScan注解掃描指定包下所有Mapper接口,并為其生成動態代理對象,避免在每個接口上都添加@Mapper注解。它簡化了配置,一次性處理多個Mapper接口。
mybatis.mapper-locations=classpath:mapper/*.xml配置項指定了MyBatis映射文件(.xml文件)的路徑。MyBatis正是通過這些.xml文件找到具體的SQL語句。@Mapper和@MapperScan注解僅告知Spring哪些接口是Mapper接口并生成代理,但它們并未告訴MyBatis在哪里查找SQL映射語句,而這些語句定義在.xml文件中。
因此,僅使用@Mapper或@MapperScan,MyBatis雖然能找到Mapper接口,卻找不到對應的SQL語句,從而拋出Invalid bound statement (not found)錯誤。添加mybatis.mapper-locations配置后,MyBatis就能根據路徑找到.xml文件,正確執行SQL語句。注解負責Mapper接口的掃描和代理生成,配置文件負責指定SQL映射文件位置,兩者缺一不可。