Spring boot本地运行正常,请求正常,打包后运行正常,但是请求报错:invalid bound statement (not found) 的问题

Spring boot本地运行请求正常,打包后运行正常,但是请求报错:invalid bound statement not found 的问题

问题场景

这个问题发生在我准备将一个旧项目打包部署到服务器上的时候,在服务器上运行jar包后,访问接口返回500,检查服务器日志发现抛出了异常invalid bound statement (not found)

项目结构

项目主要框架为Spring boot 和 mybatis-plus , 代码放在src/main/java中的某个包下,而xml文件则存在在resources/Mapper文件夹下

初步分析

按照以往的经验来说,出现该问题是由于mybatis的xml文件与mapper接口类没有建立映射关系。
于是我就启动了本地项目进行测试,但是发现本地项目可以正常请求,正常调用sql语句,一下就给整蒙了…
接着我又做了以下几个操作:

  1. 检查xml文件中的namespace映射,发现是正确的(其实这一步由于本地IDE启动时正常的所以基本不会错)
  2. 检查打包文件是否包含了xml文件,结果是正常打包进去了的。
  3. 重新clean -> compile -> package 打包重新部署到服务器,重新请求 =》 抛出异常
  4. 在本地机器直接运行jar包,重新请求 =》抛出异常

在进行以上操作后,很奇怪,为什么本地和jar类相同,但是二者启动后的测试却不同,显而易见,这个问题肯定是与 jar包启动方式 有关。

接着踩坑

在网上用mybatis jar包等关键词搜索了一圈,没有找到相关的文章,于是开始自己寻找原因。
根据刚刚的测试,通过IDE直接运行main方法是可以正常访问的,而打包成jar包运行jar包则会失败。
那么就去查看了直接运行main方法 与 运行jar包的区别,后来得出结论:

在通过jar包启动项目时,如果你的静态资源都打包在jar包里,那么就需要注意路径大小写的问题,如果你的静态资源是在jar外部,那大小写是否敏感就的看你运行的操作系统了。

下面的文章对于两种启动方式的研究很详细,这里附上链接,可以自行查看一下。

参考文章:SpringBoot的静态文件资源文件名称大小写敏感问题研究

原因: 个人问题

根据上面的分析结果,将存放xml文件夹的目录名称Mapper中的大写字母改成小写就可以了。
但是,这时候我想到一个问题,难道文件名必须强制要求小写?这种要求似乎太过于严苛了,不是可以通过mapper-locations配置xml扫描路径么。

所以,我又去检查了项目中的xml扫描路径配置,结果发现忘记写了…采用的是mybatis-plus的默认扫描路径,即src/main/resources/mapper/*.xml。由于个人习惯也是放在这个目录下,但是当初创建文件夹时不小心把首字母大写了,后面发现能够运行也就没有去多想。

那么 总结下来,在我的项目中会导致出现本地IDE运行正常,打包jar包启动后mybatis的xml映射关系找不到invalid bound statement (not found)的原因有以下几点:

  1. 未配置mapper-loactions属性,采用了mybatis-plus默认的路径src/main/resources/mapper
  2. 存放xml文件的目录名为Mapper,首字母大写
  3. 本地IDE直接启动项目时,对于resources不区分大小写。对jar包启动项目时,对于resources路径区分大小写。

总结

还是个人经验不足,粗心大意,竟然忘记了配置mapper-locations,实际上通过mapper-locations属性是可以指定扫描任意目录中的Mapper.xml文件的,同时还阴差阳错的将xml文件放到了默认扫描路径下,并且把目录名首字母大写了,导致jar包启动时区分大小写时无法找到xml文件。不过还是有收获的,了解到了直接运行main方法以及jar包启动之间的区别,记录下来,提醒自己避免再犯这种错误。

需要保证xml文件在打包后成功打包进了jar包中。因为在解决问题的过程中发现许多人是出现了将xml文件放在java代码目录下导致打包时maven自动忽略的xml文件导致找不到xml文件的问题。

微信扫码订阅
UP更新不错过~
关注
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: binding.BindingException: invalid bound statement (not found): com.hehuang.p,通常表示MyBatis无法找到指定的SQL语句映射。这可能是由于以下原因导致的: 1. SQL语句映射文件中未定义ID为“com.hehuang.p”的语句。 2. 映射文件中的命名空间与调用代码中的命名空间不一致。 3. 有正确配置MyBatis的Mapper扫描器,导致无法找到映射文件。 4. 在调用语句之前,未正确加载映射配置文件。 解决这个问题的方法包括: 1. 检查映射文件的命名空间和ID是否正确。 2. 确保调用语句的命名空间与映射文件中定义的命名空间一致。 3. 如果使用Mapper扫描器,请检查扫描路径是否正确配置。 4. 如果手动加载映射配置文件,请确保在调用语句之前正确加载该文件。 通过以上方法进行排错,就能够解决binding.BindingException: invalid bound statement (not found): com.hehuang.p的问题。 ### 回答2: binding.BindingException:无效的绑定语句(未找到):com.hehuang.p 这是一个MyBatis中的异常。它出现的原因是MyBatis无法找到配置文件中绑定语句的定义。 要解决这个问题,我们需要确定绑定语句的正确位置。在MyBatis的配置文件中,绑定语句通常是定义在Mapper文件中的。因此,我们需要检查Mapper文件是否正确地放置在MyBatis的配置文件中。 如果在检查后发现绑定语句的定义确实存在于Mapper文件中,那么我们需要确认Mapper文件的命名规则是否正确。MyBatis默认使用Mapper文件的名称作为命名空间,并在运行时将这些命名空间用作SqlSession的访问路径。因此,如果Mapper文件的名称不符合命名规则,那么MyBatis就无法找到绑定语句的定义。 最后,我们还需要确保MyBatis的配置文件中包含了正确的Mapper文件路径。如果我们把Mapper文件放在了其他目录下,而有在配置文件中正确地指定这些路径的话,那么MyBatis同样也会出现无法找到绑定语句的问题。 综上所述,我们可以通过三个步骤来解决binding.BindingException:无效的绑定语句(未找到):com.hehuang.p这个问题。首先,我们需要检查Mapper文件是否正确地放置在MyBatis的配置文件中。其次,我们需要确认Mapper文件的命名规则是否正确。最后,我们还需要确保MyBatis的配置文件中包含了正确的Mapper文件路径。 ### 回答3: binding.BindingException是MyBatis框架中的一种异常类型,常见于Mapper配置文件中的SQL语句编写有误。该异常表示绑定SQL语句失败,往往会提示SQL语句的关键信息,如绑定失败的语句、未能找到的Mapper方法等。 在出现binding.BindingException: invalid bound statement (not found): com.hehuang.p这个错误时,意味着Mapper配置文件中的某个SQL语句出现了问题。其中,“com.hehuang.p”很可能是Mapper文件中的一个namespace,也就是指向一个具体的Mapper接口。可以尝试检查Mapper文件中的语句,是否与该namespace对应。如果有对应,则需要手动添加。另外还要注意SQL语句是否存在语法错误、是否与Mapper接口中的方法相匹配等问题。 常见导致binding.BindingException的错误原因还包括: 1. Mapper文件中namespace和SQL语句中的不一致。 2. SQL语句存在语法错误,例如SQL语句中的表名或字段名不存在等。 3. Mapper接口中的方法名与SQL语句中的不一致。 4. Mapper接口中的方法有被正确地绑定到Mapper.xml文件中的SQL语句。 5. 一个Mapper文件中存在多个namespace。 解决这类错误的方法主要包括: 1. 检查XML配置文件和Mapper接口,确保namespace和方法之间的匹配一致。 2. 检查SQL语句的语法,确保有拼写错误,所有表名和字段名都存在。 3. 确认Mapper.xml文件中的方法已正确地绑定到相应的Mapper接口。 4. 如果一个Mapper文件中存在多个namespace,需要将它们单独提出来或者整合。 综上所述,binding.BindingException: invalid bound statement (not found): com.hehuang.p这个错误的出现可能源于SQL语句或者Mapper.xml配置文件中的问题,需要针对具体错误进行排查和解决。一旦解决了异常,MyBatis就能够正确地执行查询和更新操作,顺利完成数据交互任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiyeyee

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值