Mybatis中BindingException异常的产生原因及解决过程

 更新时间:2023年06月01日 09:16:31   作者:一一哥Sun  
BindingException异常是MyBatis框架中自定义的异常,顾名思义指的是绑定出现问题,下面这篇文章主要给大家介绍了关于MyBatis报错BindingException异常的产生原因及解决过程,需要的朋友可以参考下

一. 问题背景

今天我在讲完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接口

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才能正常运行,调用方法时才可以找到对应的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中对应的slq语句

4.Mapepr.xml没有给MyBatis注册

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

四. 结语

现在你知道Mybatis的BindingException绑定异常是怎么产生,以及怎么解决的了吗?

到此这篇关于Mybatis中BindingException异常的产生原因及解决过程的文章就介绍到这了,更多相关MyBatis BindingException异常解决内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java注解中@Component和@Bean的区别

    Java注解中@Component和@Bean的区别

    这篇文章主要介绍了@Component和@Bean的区别,在这给大家简单介绍下作用对象不同:@Component 注解作用于类,而 @Bean 注解作用于方法,具体实例代码参考下本文
    2024-03-03
  • 详细解读JAVA多线程实现的三种方式

    详细解读JAVA多线程实现的三种方式

    本篇文章主要介绍了详细解读JAVA多线程实现的三种方式,主要包括继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。有需要的可以了解一下。
    2016-11-11
  • Java高级特性

    Java高级特性

    这篇文章主要介绍了Java高级特性,需要的朋友可以参考下
    2017-04-04
  • Spring实战之使用Resource作为属性操作示例

    Spring实战之使用Resource作为属性操作示例

    这篇文章主要介绍了Spring实战之使用Resource作为属性,结合实例形式分析了spring载人Resource作为属性相关配置与使用技巧,需要的朋友可以参考下
    2020-01-01
  • Java实现递归读取文件夹下的所有文件

    Java实现递归读取文件夹下的所有文件

    这篇文章主要为大家详细介绍了如何利用Java实现递归读取文件夹下的所有文件,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • 关于Map的遍历以及转JsonArray存储方式

    关于Map的遍历以及转JsonArray存储方式

    在Java开发过程中,经常会遇到需要对复杂数据结构进行处理的情况,本案例以List<Map<String,Object>>为例,介绍了如何遍历该数据结构,并根据特定条件筛选出符合要求的元素,通过自定义一个Edit类来模拟形成一个新的Map对象,实现了数据的有序存储
    2024-11-11
  • Java编程通过list接口实现数据的增删改查代码示例

    Java编程通过list接口实现数据的增删改查代码示例

    这篇文章是介绍Java编程基础方面的内容,涉及list接口的操作,通过list接口实现对数据的增删改查的相关代码,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • 面试Spring中的bean线程是否安全及原因

    面试Spring中的bean线程是否安全及原因

    这篇文章主要为大家介绍了面试中常问的Spring中bean线程是否安全及原因,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • Spring事务隔离级别简介及实例解析

    Spring事务隔离级别简介及实例解析

    这篇文章主要介绍了Spring事务隔离级别简介及实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • 一文带你了解Java设计模式之原型模式

    一文带你了解Java设计模式之原型模式

    原型模式其实就是从一个对象在创建另外一个可定制的对象,不需要知道任何创建的细节。本文就来通过示例为大家详细聊聊原型模式,需要的可以参考一下
    2022-09-09

最新评论