记一次Gradle项目mybatis整合Spring时, Invalid bound statement (not found):

本文详细介绍了在Gradle项目整合Mybatis与Spring时遇到的Invalid bound statement异常,分析了由于XML文件未被编译进资源目录导致的问题,并提供了两种解决方案:一是通过自定义Task将XML文件复制到正确位置,二是修改配置将Java目录下的文件一并编译为资源文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题,即在mybatis中dao接口与mapper配置文件在做映射绑定的时候出现问题,简单说,就是接口与xml要么是找不到,要么是找到了却匹配不到。

常见原因: 一般的原因 Mapper interface和xml文件的定义对应不上,需要检查包名,namespace,函数名称等能否对应上。 按以下步骤一一执行:
1、检查xml文件所在的package名称是否和interface对应的package名称一一对应
2、检查xml文件的namespace是否和xml文件的package名称一一对应
3、检查函数名称能否对应上
4、去掉xml文件中的中文注释
5、随意在xml文件中加一个空格或者空行然后保存

如果以上方法都不好使的情况,请看下面特殊原因

特殊原因:我这次的错误原因就是此原因,Maven项目和Gradle项目在利用mybatis进行接口与xml文件映射的时候,理应在同一包下,而此包不属于resources资源,编译的时候,该包下的xml文件不会被编译进Out/production/resources(IDEA编译后存放资源的目录),但是我们在运行java程序的时候,需要到Out目录(已编译的文件)中找到对应的XML文件,因为此时XML文件并没有导入到Out目录下,相当于接口找不到对应的XML实现,所以会报 Invalid bound statement (not found)异常:

解决此异常的方法如下:

1.第一种方法:在build.gradle下添加一个Task(任务),该任务的目的是对src下的文件有所选择,只将结尾含有Mapper.xml的资源文件拷贝到Out/production/resources(IDEA编译后存放资源的目录),运行此任务,接着执行程序,会发现该目录下的Mapper包应会有对应的XML文件,Task代码如下:**

task mapperXmlCopy(type: Copy) {
    copy {
        from("src/main/java") {   //把src.main.java目录下的所有静态资源(例如XML)
            include ("**/*Mapper.xml")        //标明以Mapper结尾的XML文件资源
        }
        into("${projectDir}/out/production/resources")  //拷贝到out/production/resources目录下
    }
    print "Copy Success\n"
}

在这里插入图片描述

2.第二种方法: 此方法存在一些弊端,本质是将src/main/java目录下的文件和src/main/resources目录下的文件都视为资源文件,程序编译时将这两个目录下所有的文件都拷贝到out/production/resources下,该操作浪费时间空间,在build.gradle下直接贴上如下代码,在重新测试,即可成功运行。

sourceSets.main.resources.srcDirs = ["src/main/java","src/main/resources"]


**特别鸣谢:JL学长**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值