小言_互联网的博客

Mybatis的BindingException异常产生原因及解决办法详解

478人阅读  评论(0)

一. 问题背景

今天壹哥在讲完MyBatis后,有学生在进行代码练习时遇到了下面这样的一个异常,先上图:

二. 问题分析

1. 原因分析

首先我们看到,这里抛出的异常是org.apache.ibatis.binding.BindingException,接着再看异常的信息是 Invalid bound statement (not found): com.qf.mapper.EmpMapper.list。基于这两点,我们大概能定位到是Mapper绑定产生的异常。

我们知道,在MyBatis中我们需要先定义一个Mapper接口,在接口中定义方法。然后再定义一个Mapper.xml,在XML文件中编写方法对应的SQL语句,这也是java代码和sql语句分离的体现。我们在调用Mapper接口中的方式时MyBatis会给我们创建一个该接口的代理类,通过代理类来调用Mapper接口中的方法。

现在有了代理就可以调用方法了,但是怎么找到这个方法对应的SQL语句呢?此时就需要把Mapper接口和Mapper.xml进行绑定,只有绑定了MyBatis才知道方法对应的sql语句,我们通过代理调用方法是才能正常运行sql语句。那么这个异常就是报的绑定异常,说没有找到com.qf.mapper.EmpMapper.list()对应的sql语句。

那如何把它们两个绑定呢?看下面代码。

2. 定义EmpMapper接口


  
  1. package com.qf.mapper;
  2. import com.qf.core.dao.BaseDao;
  3. import com.qf.entity.Emp;
  4. import org.omg.CORBA.INTERNAL;
  5. public interface EmpMapper extends BaseDao<Emp> {
  6. public Emp selectById (Integer empno);
  7. }

3. 定义EmpMapper.xml


  
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.qf.mapper.EmpMapper">
  6. <select id="list" resultType="emp">
  7. select * from t_emp
  8. </select>
  9. </mapper>

在Mapper.xml中通过namespace属性和接口绑定,这个属性中设置的需要绑定的接口全类名。这里设置的是com.qf.mapper.EmpMapper,就代表当前EmpMapper.xml就和EmpMapper.java绑定了。然后在通过<select>标签中的id和接口中的方法名称保持一致,这样就完成了方法和sql语句的绑定。这些操作都配置完成后MyBatis才能正常的运行,调用方法时才可以找到对应的SQL语句。

4. 问题原因

现在我们知道MyBatis的绑定过程了,接下来我们继续回到上面提到的异常。

通过检查这个学生的代码,壹哥发现这个学员只是在Mapper接口中定义了方法,但是没有在Mapper.xml中编写的sql语句,所以MyBatis找不到sql语句就抛出了上面的异常。

三. 异常解决

对于上面的异常,其实我们只需要在Mapper.xml中添加对应的sql语句就可以解决。该学员的这个bug的原因是因为没有写sql语句导致的。但是除了这个原因外,还有其他的一些场景也可能会导致出现这个bug,在这里壹哥统一列出来方便大家学习,常见原因有如下几种。

1. Mapper.xml中的namespace属性写错了

 2. Mapper.java中的方法名称和Mapper.xml中标签id的属性不一致

 3. Mapper.java中定义了方法,但没有在Mapper.xml中写对应的SQL语句

4. Mapepr.xml没有给MyBatis注册

 5. id要和方法名称保持一致

Mapepr.xml中的id最好和方法名称保持一致,而且Mapper.java中的方法名称不要重载。方法中是可以重载的,但在Mapepr.xml中的id是不允许重复的。

四. 结语

现在你知道Mybatis的BindingException绑定异常是怎么产生,以及怎么解决的了吗?如果你还有其他疑问,可以私信或评论区留言,壹哥来给你解决。


转载:https://blog.csdn.net/syc000666/article/details/128142296
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场