學習mybatis的過程中,測試mapper自動代理的時候一直出錯,在eclipse中可以正常運行,而同樣的代碼在idea中卻無法成功。雖然可以繼續調試,但心里總是糾結原因。百度了好久,終於找到一個合適的原因。參考:http://blog.csdn.net/z69183787/article/details/48933481;
原因:(參考:http://www.linuxidc.com/Linux/2015-06/118877.htm)
IDEA的maven項目中,默認源代碼目錄下的xml等資源文件並不會在編譯的時候一塊打包進classes文件夾,而是直接舍棄掉。
如果使用的是Eclipse,Eclipse的src目錄下的xml等資源文件在編譯的時候會自動打包進輸出到classes文件夾。Hibernate和Spring有時會將配置文件放置在src目錄下,編譯后要一塊打包進classes文件夾,所以存在着需要將xml等資源文件放置在源代碼目錄下的需求。
解決:
方法1:將xml或properties等配置文件放到resource下,並修改獲取配置文件的代碼,比如注冊mapper.xml的位置等;
方法2:在maven中添加過濾:
1 <!--配置Maven 對resource文件 過濾 --> 2 <resources> 3 <resource> 4 <directory>src/main/resources</directory> 5 <includes> 6 <include>**/*.properties</include> 7 <include>**/*.xml</include> 8 </includes> 9 <filtering>true</filtering> 10 </resource> 11 <resource> 12 <directory>src/main/java</directory> 13 <includes> 14 <include>**/*.properties</include> 15 <include>**/*.xml</include> 16 </includes> 17 <filtering>true</filtering> 18 </resource> 19 </resources>
我采用mybatis的自動代理設置,將mapper文件和xml文件同名同包下,並在sqlMap.xml(mybatis-config.xml)中配置mapper自動注冊掃描包:
1 <mappers> 2 <mapper resource="sqlmap/User.xml"/> 3 <!--通過resource方法一次加載一個映射文件 --> 4 <!--<mapper resource="sqlmap/UserMapper.xml"/>--> 5 6 <!-- 通過mapper接口加載單個 映射文件 7 遵循一些規范:需要將mapper接口類名和mapper.xml映射文件名稱保持一致,且在一個目錄 中 8 上邊規范的前提是:使用的是mapper代理方法 9 --> 10 <!--<mapper class="cn.itcast.mybatis.mapper.UserMapper"/>--> 11 12 <!-- 批量加載mapper 13 指定mapper接口的包名,mybatis自動掃描包下邊所有mapper接口進行加載 14 遵循一些規范:需要將mapper接口類名和mapper.xml映射文件名稱保持一致,且在一個目錄 中 15 上邊規范的前提是:使用的是mapper代理方法 16 --> 17 <package name="cn.itcast.mybatis.mapper"/> 18 19 </mappers>
測試通過,解決了心頭的疙瘩。