目录

一、遇到的问题

二、分析思路

1、映射文件

2、测试类

三、解决方案


一、遇到的问题

前几日,有个工作不久的同事找我帮他解决一个 Mybatis 的问题。他写了一个增删改查,但是在启动程序的时候报错:Invalid bound statement (not found) 。他试图解决该异常,花了一个小时还是没有解决,所以向我求助。所谓当局者迷,我帮他梳理了一下开发逻辑,几分钟后他发现了问题,并解决了该异常。刚工作两三年的开发者特别容易碰到该异常,但是只要理清思路,就很容解决问题。我将分析问题的思路记录一下,希望能帮到你。

二、分析思路

Mybatis 开发有两种方式,一种是原始 Dao 开发方式,另一种是 Mapper 动态代理开发方式。在开发项目时,我们会用 Mapper 动态代理开发方式,动态代理会自动帮我们生成 Mapper 的代理类,将细节封装起来。但是,在分析问题的时候,我么用原始 Dao 开发方式,可以让我们了解到 statement 绑定映射文件的细节。

下面使用原始 Dao 的开发方式演示一下 statement 是如何绑定映射文件中的 Sql 语句的。

1、映射文件

<?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.test.mapper.UserMapper"><!-- 查询所有的用户名 --><select id="findUserNameList" resultType="java.lang.String">select user_name userName from user</select>
</mapper>

2、测试类

public class Test {//会话工厂private SqlSessionFactory sqlSessionFactory;@Beforepublic void createSqlSessionFactory() throws IOException {// 配置文件String resource = "SqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);// 使用SqlSessionFactoryBuilder从xml配置文件中创建SqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}// 查询所有的用户名@Testpublic void testFindUserNameById() {// 数据库会话实例SqlSession sqlSession = null;try {// 创建数据库会话实例sqlSessionsqlSession = sqlSessionFactory.openSession();// 查询所有的用户名List<String> list = sqlSession.selectList("com.test.mapper.UserMapper.findUserNameById");} catch (Exception e) {e.printStackTrace();} finally {if (sqlSession != null) {sqlSession.close();}}}
}

在上面的测试中,使用了 sqlSession 的 selectList 方法,中间的参数就是 statement 。该参数用来确定映射文件中的 Sql 语句,换句话说就是用这个 statement 绑定映射文件中的 Sql 语句。

该参数是用映射文件中的 namespace 和 select 标签的 id 组合而成的,在项目是唯一的。示例中映射文件的 namespace 是:com.test.mapper.UserMapper,select 标签的 id 是:indUserNameById ,所以组合起来的 statement 是 com.test.mapper.UserMapper.findUserNameById

如果 statement 写错了,就会导致找不到映射文件中的 Sql 语句,就会报 Invalid bound statement (not found) 。所以造成该异常的原因是 statement 和 Sql 语句不匹配。

在实际项目会使用 Mapper 动态代理的开发方式,自动生成 mapper 接口的实现类,就更容易出现该异常了。

三、解决方案

既然知道了造成该异常的原因,就容易解决了,如果通过 statement 找不到映射文件中的 Sql 就会报错误:Invalid bound statement (not found) 。在项目中一般都是使用 Mapper 动态代理,所以我们要解决的也是动态代理的问题。先说一下 Mapper 动态代理的实现原理,看完之后你就知道应该怎么解决该异常了。

Mapper 动态代理只需要开发定义 Mapper 接口,Mybatis 会根据接口创建动态代理对象。使用该种方式开发,需要遵守一定的开发规范,规范如下 4 点:

  1. Mapper.xml 文件中的 namespace 与 mapper 接口的类路径相同。
  2. Mapper 接口方法名和 Mapper.xml 中定义的每个 statement 的 id 相同
  3. Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 Sql 的 parameterType 的类型相同
  4. Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 Sql 的 resultType 的类型相同

所以,我们在使用 Mapper 动态代理遇到该异常,就是要检查是否遵守开发规范,因为粗心或单词写错了,容易导致程序报错。

我列了几个检查步骤,你跟着步骤检查一下,肯定能找到问题的所在之处。步骤如下 7 点:

  1. 检查 target 目录中有没有 Mybatis 的映射文件
  2. 检查 mybatis.mapper-locations 配置,该配置是把 mapper 的位置告诉 Mybatis 。默认是mapper-locations: classpath*:/mapper/**/*.xml
  3. 检查映射文件是不是放在 resources/mapper 目录中
  4. 检查映射文件中的 namespace 与 mapper 接口的类路径是不是一样
  5. 检查映射文件中的 statement 是不是和 Mapper 接口的方法名一样
  6. 检查映射文件中的 statement 的 parameterType 和 resultType 是不是和 Mapper 接口的方法中的入参和出参一样
  7. 如果你使用 Idea 开发,检查一下 resources 目录,在该目录下创建下级目录是不能一次性创建的,要创建完成一个目录后再创建另外的下级目录

另外,如果你遇到过该异常,并且遇到的错误不在上述之中。不妨在留言区提出,大家一起讨论一下,给后来者提个醒,避免遇到坑。

如何快速解决 Mybatis 异常:Invalid bound statement (not found)相关推荐

  1. Mybatis异常Invalid bound statement (not found): com.xxx.xxxMapper.selectxxxByxxx

    这个异常问题的解决办法就是首先,检查Mapper文件配置是否有误,返回类型和bean是否对应.如果bean和mapper文件都无问题,可以检查一下@Mapper注解的导包问题,导包错误也会导致这个问题

  2. 绑定异常 Invalid bound statement (not found): com.fwind.blog.dao.mapper.TagMapper

    绑定异常 Invalid bound statement (not found): com.fwind.blog.dao.mapper.TagMapper 今天springBoot项目报了绑定异常,也 ...

  3. springboot mybatis mysql8.0 异常 invalid bound statement (not found)(汇总篇)

    大家好,我是烤鸭: 现在是采坑实录. invalid bound statement (not found)  这个坑用过mybatis的人肯定都踩过. 1. 环境 <parent>< ...

  4. springboot整合mybatis之Invalid bound statement解决

    项目场景: 最近跟着一些网上项目做了springboot的相关学习,真心觉得方便,快捷,好用,感觉自己学的差不多了,就想着自己完全独立做一个CRUD练练手,本想速战速决,没想到触发了一个隐秘的小坑,在 ...

  5. MyBatis报Invalid bound statement (not found)错误

    一.场景 本项目使用mybatis-plus作为orm框架,使用的是以下jar包 compile 'com.baomidou:mybatis-plus-boot-starter:3.4.0' 都知道m ...

  6. MyBatis:Invalid bound statement (not found)

    Invalid bound statement (not found)Exception 这个异常的原因是:        由于程序在运行的时候会将mapper接口加载到target文件中,但是却没有 ...

  7. Mybatis异常_03_Invalid bound statement (not found)

    一.异常信息 Caused by: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): c ...

  8. spring boot 集成Mybatis时 Invalid bound statement (not found)

    spring boot 集成Mybatis时,运行提示 org.apache.ibatis.binding.BindingException: Invalid bound statement (not ...

  9. 【Spring+Mybatis】 Invalid bound statement (not found): com.xxxx.mapper.UserMapper.selectUser

    org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxxx.mapper.Use ...

最新文章

  1. [JavaWeb基础] 007.Struts2的配置和简单使用
  2. 中国工程院2021年院士增选第二轮候选人名单公布
  3. java解析c上传十六进制_磕代码c/c++/java:十六进制转十进制
  4. UUID介绍与生成的方法
  5. 【数据库】数据库单表对比
  6. 2018-11-18年工作感想
  7. MyBatis创建SqlSession-有没有更好的拿到SqlSessionTemplate 的方法?
  8. 【C++】 67_经典问题分析 五
  9. linux容器进程号,linux下docker启动容器,查看容器、进程、日志等命令
  10. 前端,到底什么来路?
  11. BUPT 2012复试机考 2T
  12. 剑指offer(C++)-JZ6:从尾到头打印链表(数据结构-链表)
  13. android 初始化变量,变量初始化 - Android Studio
  14. Linux中关于API函数与系统调用
  15. POI 导出 Excel:字体颜色、行列自适应、锁住、合并单元格、一文搞定……
  16. win10 计算机网络密码,详细教你Win10怎么查看无线网络密码
  17. java 项目骨架,maven项目中骨架
  18. 找工作必做事项-剑指offer
  19. GitHub 上受欢迎的 Android UI Library 整理
  20. 四色定理已利用计算机证明,地图四色定理的非计算机证明.pdf

热门文章

  1. J.U.C之AQS:CLH同步队列
  2. 计算机成瘾的危险英语对话,英语作文:论孩子们对电脑游戏上瘾
  3. 安卓手机状态栏显示秒_让安卓手机上方状态栏时间显示精确到秒方法
  4. 模糊数学Fuzzy Set第2讲——Fuzzy Logic Fuzzy Reasoning
  5. Postgresql多行合并一行
  6. 【蓝桥杯备赛笔记 02】费解的开关
  7. Python爬虫案例:爬取必应壁纸
  8. 谷歌免费CDN加速Google PageSpeed Service申请和使用教程
  9. 经典题目3-应用的闪退通常是什么原因造成的?如果应用闪退,Android 和 iOS 上是分别怎么抓取日志的?
  10. 计算机网络需要买什么电脑,教你如何自己配一台专门用来吃鸡的电脑