Mybatis中BindingException異常的產(chǎn)生原因及解決過程
一. 問題背景
今天我在講完MyBatis后,學生在進行代碼練習時遇到了下面這樣的一個異常,先上圖:
二. 問題分析
1.原因分析
首先我們看到,這里拋出的異常是org.apache.ibatis.binding.BindingException,接著再看異常的信息是 Invalid bound statement (not found): com.qf.mapper.EmpMapper.list。基于這兩點,我們大概能定位到是Mapper綁定產(chǎn)生的異常。
我們知道,在MyBatis中我們需要先定義一個Mapper接口,在接口中定義方法。然后再定義一個Mapper.xml,在XML文件中編寫方法對應的SQL語句,這也是java代碼和sql語句分離的體現(xiàn)。我們在調(diào)用Mapper接口中的方式時MyBatis會給我們創(chuàng)建一個該接口的代理類,通過代理類來調(diào)用Mapper接口中的方法。
現(xiàn)在有了代理就可以調(diào)用方法了,但是怎么找到這個方法對應的SQL語句呢?此時就需要把Mapper接口和Mapper.xml進行綁定,只有綁定了MyBatis才知道方法對應的sql語句,我們通過代理調(diào)用方法時才能正常運行sql語句。那么這個異常就是報的綁定異常,說沒有找到com.qf.mapper.EmpMapper.list()對應的sql語句。
那如何把它們兩個綁定呢?看下面代碼。
2.定義EmpMapper接口
package com.qf.mapper; import com.qf.core.dao.BaseDao; import com.qf.entity.Emp; import org.omg.CORBA.INTERNAL; public interface EmpMapper extends BaseDao<Emp> { public Emp selectById(Integer empno); }
3.定義EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.qf.mapper.EmpMapper"> <select id="list" resultType="emp"> select * from t_emp </select> </mapper>
在Mapper.xml中通過namespace屬性和接口綁定,這個屬性中設置的需要綁定的接口全類名。這里設置的是com.qf.mapper.EmpMapper,就代表當前EmpMapper.xml就和EmpMapper.java綁定了。然后在通過<select>標簽中的id和接口中的方法名稱保持一致,這樣就完成了方法和sql語句的綁定。這些操作都配置完成后MyBatis才能正常運行,調(diào)用方法時才可以找到對應的SQL語句。
4.問題原因
現(xiàn)在知道MyBatis的綁定的過程了,我們繼續(xù)回到上面提到的異常。
通過檢查學生的代碼發(fā)現(xiàn),這個學員只是在Mapper接口中定義了方法,但是沒有在Mapper.xml中編寫的sql語句,所以MyBatis找不到sql語句就拋出了上面的異常。
三. 異常解決
對于上面的異常,其實我們只需要在Mapper.xml中添加對應的sql語句就可以解決。該學員的這個bug的原因是因為沒有寫sql語句導致的。但是除了這個原因外,還有其他的場景也會導致出現(xiàn)這個bug,在這里都統(tǒng)一列出來方便大家學習,常見原因如下。
1.Mapper.xml中的namespace屬性寫錯了
2.Mapper.java中的方法名稱和Mapper.xml中標簽id的屬性不一致
3.Mapper.java中定義了方法,但是沒有寫Mapper.xml中對應的slq語句
4.Mapepr.xml沒有給MyBatis注冊
5.Mapepr.xml中的id最好和方法名稱保持一致,而且Mapper.java中的方法名稱不要重載。方法中是可以重載的,但是Mapepr.xml中的id是不允許重復的。
四. 結語
現(xiàn)在你知道Mybatis的BindingException綁定異常是怎么產(chǎn)生,以及怎么解決的了嗎?
到此這篇關于Mybatis中BindingException異常的產(chǎn)生原因及解決過程的文章就介紹到這了,更多相關MyBatis BindingException異常解決內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java注解中@Component和@Bean的區(qū)別
這篇文章主要介紹了@Component和@Bean的區(qū)別,在這給大家簡單介紹下作用對象不同:@Component 注解作用于類,而 @Bean 注解作用于方法,具體實例代碼參考下本文2024-03-03Spring實戰(zhàn)之使用Resource作為屬性操作示例
這篇文章主要介紹了Spring實戰(zhàn)之使用Resource作為屬性,結合實例形式分析了spring載人Resource作為屬性相關配置與使用技巧,需要的朋友可以參考下2020-01-01Java編程通過list接口實現(xiàn)數(shù)據(jù)的增刪改查代碼示例
這篇文章是介紹Java編程基礎方面的內(nèi)容,涉及l(fā)ist接口的操作,通過list接口實現(xiàn)對數(shù)據(jù)的增刪改查的相關代碼,具有一定參考價值,需要的朋友可以了解下。2017-10-10