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

news2024/10/3 10:40:25

一. 问题背景

今天壹哥在讲完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中写对应的SQL语句

4. Mapepr.xml没有给MyBatis注册

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

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

四. 结语

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/54069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

老板说我最近飘了,都敢用 MySQL 实现分布式锁了

​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 以前参加过一个库存系统&#xff0c;由于其业务复杂性&#xff0c;搞了很多个应用来支撑。这样的话一份库存数据就有可能同时有多个应用来修改库存数据。比如说&#xff0c;有定时任务…

专为医疗领域打造!飞凌嵌入式新一代FDU显控一体机发布

飞凌嵌入式重磅推出一款专为医疗打造的显控一体机——FDU070K02 & FDU101K02。产品采用无外壳设计、支持戴医疗手套触摸&#xff0c;支持双屏同显或异显&#xff0c;兼顾场景灵活性与使用便捷性。 同时飞凌为用户提供开箱即用的硬件和操作系统&#xff0c;极大简化了开发流…

vue+element模仿电商商城,前后端分离实现,下单微信扫码支付

1.前言 接上一篇《vueelementSpringBootOAuth2Spring SecurityRedismybatis-plusmysqlswagger模仿商城&#xff0c;前后端分离实现》。 上篇文章介绍了&#xff1a; 用户注册用户登录首页商品推荐展览商品搜索商品分类按商品分类预览商品商品详情预览加入购物车 上一篇文章有…

【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

arthars在线诊断

官网地址&#xff1a;https://arthas.aliyun.com/doc/quick-start.html#_6- 1.安装启动 curl -O https://arthas.aliyun.com/arthas-boot.jar java -jar arthas-boot.jar2.选择对应进程编号回车3.watch命令 官网命令文档&#xff1a;https://arthas.aliyun.com/doc/arthas-t…

[python][学习]循环与嵌套---打印乘法口诀

打印乘法口诀表 打印乘法口诀表 按照规律可以直接用一个for循环进行实现 加就是显示字符串&#xff0c;没有加就是直接计算或者显示 for i in range(1,10): print(i,*,1,,i*1,end ) print(i,*,2,,i*2,end ) print(i,*,3,,i*3,end ) print(i,*,4,,i*…

STC 51单片机50——中断问题演示

// 功能要求&#xff1a;按下按钮后&#xff0c;Led的状态改变。 #include "reg51.h" sbit LedP1^0; sbit ButtonP3^2; //外中断0对应的引脚 void delay(unsigned char m) { unsigned char i,j,k; for(i0;i<m;i) for(j0;j<250;j) for(k…

JWT生成tonken验证+AOP拦截验证

JSON Web Token&#xff08;JWT&#xff09;是目前都在用的前后分离跨域验证规则。 JWT由3部分组成 Header——头部一般Base64URL编码&#xff0c;作用&#xff1a;声明token类型&#xff0c;声明token使用的加密算法。一般都是使用HMAC-SHA256或者RSA支持很多种算法&#xf…

岩藻多糖-聚乙二醇-刀豆球蛋白A,ConcanavalinA-PEG-Fucoidan,刀豆球蛋白A-PEG-岩藻多糖

岩藻多糖-聚乙二醇-刀豆球蛋白A&#xff0c;ConcanavalinA-PEG-Fucoidan&#xff0c;刀豆球蛋白A-PEG-岩藻多糖 中文名称&#xff1a;岩藻多糖-刀豆球蛋白A 英文名称&#xff1a;Fucoidan-ConcanavalinA 别称&#xff1a;刀豆球蛋白A修饰岩藻多糖&#xff0c;ConA-岩藻多糖 …

分享从零开始学习网络设备配置--任务2.6 避免网络环路

任务描述 某公司最近由于业务迅速发展和对网络可靠性的要求&#xff0c;使用了两台高性能交换机作为核心交换机&#xff0c;接入层交换机与核心层交换机互联&#xff0c;形成冗余结构&#xff0c;来满足网络的可靠性&#xff0c;达到最佳的工作效率。 生成树技术&#xff08;S…

在一次又一次的失败中, 我总结了这份万字的《MySQL 性能调优笔记》

MySQL 性能调优学习导图》概要 说明&#xff1a;本文篇幅有限&#xff0c;故只展示部分内容&#xff0c;《MySQL 性能调优学习导图》资料已整理成文档&#xff0c;需要获取的小伙伴可以直接转发关注后私信&#xff08;学习&#xff09;即可获取哦 一、性能监控 1. 使用 show p…

2022/12/1 结构体

结构体 声明结构体&#xff1a; struct 结构体名 例如&#xff1a;struct student 其中&#xff0c;student又称为结构体标记 结构体可以拥有成员&#xff0c;例如&#xff1a; struct student { int num; int score; char name[20] }; 注意&#xff0c;分号不可以少…

万应低代码11月重点更新内容速递

速览版 详情版 低代码开发效率升级 1.页面变量支持快速构建 在「数据提交」、「调用逻辑」等存在数据返回的节点中&#xff0c;支持根据其输出的内容去自动创建数据类型相同的变量&#xff0c;并自动建立好映射关系。 ● 【功能上线前】&#xff1a; 需要为每一个输出字…

Elasticsearch_第一章_ elasticsearch基础

Elasticsearch_第一章_ elasticsearch基础 – elasticsearch基础 文章目录Elasticsearch_第一章_ elasticsearch基础0.学习目标1.初识elasticsearch1.1.了解ES1.1.1.elasticsearch的作用1.1.2.ELK技术栈1.1.3.elasticsearch和lucene1.1.4.为什么不是其他搜索技术&#xff1f;1…

企业该如何选择自己合适的云财务软件?

据相关数据统计&#xff0c;2021年&#xff0c;我国云服务市场规模达274亿美元&#xff08;超1700亿元人民币&#xff09;&#xff0c;预计到2026年将增长至850亿美元&#xff08;约5400亿元人民币&#xff09;。可见&#xff0c;云服务市场的发展之迅。对于企业而言&#xff0…

python入门项目03:完成黑心资本家发工资的程序

本题来源于黑马程序员b站视频&#xff0c;如有侵权&#xff0c;请联系删除。 import random #总金额10000 all_money10000 n0#记录发放工资的人 #发工资 for i in range(1,21):#20个员工jixiaorandom.randint(1,10)#生成一个1&#xff0c;10的随机数if jixiao<5:print(f员工…

12.1排序

目录 0.修改栈堆内存 一.堆排序 1 原理 2.代码实现 3.分析 二.冒泡排序 1 原理 2.实现 3.分析 三.快速排序(重要) 1 原理-总览 2.方法:挖坑法 步骤一 步骤二 步骤三 步骤四 步骤五 步骤六 3.代码实现挖坑法 4.分析 四.字符串转整数 1.字符串方法 2.字符…

【C++重点语法下】可变参数模板,STL里面的push_back和emplace_back区别 ,包装器function,bind

目录 1.可变参数模板 1.1取出参数包内的参数方法一&#xff1a; 1.2取出参数包内的参数方法二&#xff1a; 1.3STL里面的push_back和emplace_back区别 2.包装器function 2.1function&#xff08;头文件functional&#xff09; 2.1.1可调用类型和包装器 2.1.2类的成员函数…

实验十 符号计算基础与符号微积分(matlab)

目录 实验十 符号计算基础与符号微积分 1.1实验目的 1.3流程图 1.4程序清单 1.5运行结果及分析 1.6实验的收获与体会 1.1实验目的 1.2实验内容 符号计算基础与符号微积分 课本第372页 1.3流程图 1.4程序清单 实验十 1 clear xsym(6); ysym(5); z(1x)/(sqrt(…

第9章 登录页面的跳转实现

1 “swg-login.html”登录按钮不能触发异常 由于.Net框架默认支持“HTTPS”协议从而导致“swg-login.html”登录按钮不能触发&#xff0c;其异常信息如下&#xff1a;“Mixed Content: The page at https://localhost:7037/swg-login.html was loaded over HTTPS, but requeste…