記一次簡單又令人抓狂的Mybatis異常

記一次簡單又令人抓狂的Mybatis異常

老規矩,還是開局先報異常:Invalid bound statement (not found): com.mapper.LoginMapper.login

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.mapper.LoginMapper.login
at org.apache.ibatis.binding.MapperMethodSqlCommand.<init>(MapperMethod.java:227)atorg.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:49)atorg.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:65)atorg.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58)atcom.sun.proxy.SqlCommand.<init>(MapperMethod.java:227) at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:49) at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:65) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58) at com.sun.proxy.Proxy19.login(Unknown Source)
at com.service.impl.adloginServiceImpl.login(adloginServiceImpl.java:29)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)

這個問題還是很好找的,搜索引擎上一找一大堆,基本上最核心的問題就是Mapper.xml有問題,無非就是SQL語句的標籤中的id裏面的值沒有和Mapper接口的方法對應上**(建議還是複製粘貼爲妙)** ;

<select id="" paramType=""></select>

但是看到這裏的朋友可能就會心裏想要MMP了,就那麼簡單的幾個字母,看了不下十遍,真的沒有錯,那可能就不是這個原因了。廢話不多說,正片開始。

在反覆檢查之後發現,居然是在applicationContext.xml裏面的配置找到了問題;

<!-- 在配置sqlSessionFactory的時候,使用了批量產生mapper的方式
	 因此需要配置mapper.xml的位置  
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="mapperLocations" value="classpath:com/my/mapper/*.xml"></property>
</bean>

而這次異常正好出現在上面的配置的value="classpath:com/mapper/*.xml"這裏,先看兩張圖:

在這裏插入圖片描述

  • 上圖是一個普通的web項目

    • 在普通的項目中,classpath:一般是指向項目根路徑\src 這個路徑的,所以,如果是這樣的話,使用上面的配置方式,完全是不會產生問題的;

在這裏插入圖片描述

  • 這是一個maven構建的web項目

    • 而在maven項目中,classpath:指向的路徑是src/resources這個文件夾,所以,使用上面的value寫法就會出現問題,導致Spring沒辦法找到你的Mapper.xml,然後檢查配置文件可能一下子沒有意識到這個問題

最後的解決方案是把**mapper.xml這些mapper文件放在resources文件夾下面即可;

在這裏插入圖片描述

如上圖所示:爲了規範一點,就另建一個mapper文件夾,當然這裏可以按功能劃分mapper,總之別放錯位置就行了。然後把配置信息修改一下

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="mapperLocations" value="classpath:mapper/*.xml"></property>
</bean>

這樣,就可以解決問題了。

最後插點題外話,當初在某站大學學這些東西的時候,up主說爲了方便就把mapper.xml放在了接口的文件夾下,java文件與xml文件混着放,這樣看方便一點,那個時候也沒有多想這個細節點,但是在遇到這個問題的時候,我去求助身邊的大佬,他們一上來就說配置文件和java文件要分開放,規範一點。可能我們自己寫的普通項目可以隨便那麼一點點,但是如果是使用maven來構建項目的話,還是要遵循規範好一點,不然某一天忽然因爲某個不規範的點引發異常,然後又花費很長的時間去找問題,偷這點懶,得不償失啊~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章