新手使用mybatis3的心酸,應該也只有新手才能體會了,網上一堆解決異常的辦法都不起做用,心態很差的話,砸電腦都有可能了,還好,個人心態還能夠,認可是本身的學識不夠,只能怒而學習之,呵呵,扯得有點多。 java
最近熟練springmvc+mybatis3的開發框架,在搭建開發環境的時候遇到了如標題這樣的問題,代碼分層上仍是普通的Controller、Service、Service Impl、Mapper層,而後使用註解的方式注入bean,註解用的是JSR-330的規範,相似@Inject、@Named之類的東西。 spring
介紹截到這裏了,先看報錯: sql
INFO: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring Exception in thread "main" org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.join.stump.site.service.MenuService.queryMenuList at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:189) at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:43) at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:58) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:51) at com.sun.proxy.$Proxy12.queryMenuList(Unknown Source) at com.join.stump.site.service.impl.MenuServiceImpl.main(MenuServiceImpl.java:25)
調用方法: apache
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "stump-core-config.xml" }); MenuService menuService = (MenuService) context .getBean("menuService"); System.err.println("menuService:"+menuService.queryMenuList(null)); }
顯然在調用service的方法的時候報錯了,有兩個地方可能會讓你納悶, mybatis
一、爲何報Invalid bound statement (not found): com.join.stump.site.service.MenuService.queryMenuList mvc
二、爲何service的對象類型是org.apache.ibatis.binding.MapperProxy app
關於第一個問題,由第二個問題能夠獲得解釋,由於是org.apache.ibatis.binding.MapperProxy 在使用com.join.stump.site.service.MenuService.queryMenuList在mybatis的sql映射文件中沒有這個sql,因此報錯。 框架
那爲何會有第二個問題了,我也百事不得騎姐(故意的),在通過一方折騰後,看到mybatis-spring的官網上一段話,感受豁然開朗,試着調整了下就沒問題了。這個問題跟個人mybatis的配置文件有很大關係。先看出錯前的配置: 學習
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.join.stump" /> </bean>
再看解決後的配置: spa
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.join.stump.site.mapper,com.join.stump.base.mapper" /> </bean>
MapperScannerConfigurer 支 持 過 濾 由 指 定 的 創 建 接 口 或 注 解 創 建 映 射 器 。 annotationClass 屬性指定了要尋找的註解名稱。 markerInterface 屬性指定了要尋找的父 接口。若是二者都被指定了,加入到接口中的映射器會匹配兩種標準。 默認狀況下,這兩個 屬性都是 null,因此在基包中給定的全部接口能夠做爲映射器加載。好吧,應該可以想到點什麼了吧,好吧,我直說了,出錯的配置中basePackage用的是com.join.stump,這樣MapperScannerConfigurer作掃描的時候,把Service也掃進去了,因此,如今能夠騎姐了。