springboot使用使用mybatis报错BindingException

本文详细解析了在SpringBoot项目中整合MyBatis时常见的BindingException错误,包括检查名称、命名空间、SQL语句ID、返回值类型及打包配置等问题,并提供了具体的解决步骤。

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

springboot使用使用mybatis报错BindingException

使用springboot在启动类添加上@MapperScan(“com.jd.mapper”)注解,扫描mapper所在的包,否则springboot无法启动。

使用mybatis的使用报错为:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.jd.mapper.UserMapper.getUserList
主要是为绑定Mapper接口和Mapper.xml 异常。

解决方式

1、检查名称

两个文件的名称要完全一致,仅后缀不同。
在这里插入图片描述

2、检查命名空间

在mapper.xml中命名空间是接口的全限定路径。
在这里插入图片描述

3、检查sql语句的id

sql语句中的id要与接口中的方法名一致。

接口中的方法
在这里插入图片描述
mapper.xml 中的sql的id
在这里插入图片描述

4、检查返回值

sql中的resultType是否与接口的返回值一致。

注意:尽量使用resultMap,进行逐一对应。并且如果使用到别名的话,在配置文件中配置

mybatis.type-aliases-package=com.jd.domain

5、查看mapper.xml是否打包到target

使用maven管理项目的话,maven不会打包main/java下的 .xml文件,只会打包 .java。如下图没有打包,需要添加pom文件打包。
在这里插入图片描述
将mapper.xml编译打包有两种方式:
1、添加编译命令,将java包下的xml一同打包。

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
              	    <!--任意包下的任意名称的xml文件-->
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>

2、mapper.xml和接口分离
将mapper.xml 与 接口分离,将mapper.xml放在main/resources之下,
并且在配置文件中添加mapper文件的位置信息:

mybatis.mapper-locations=classpath:mapper/*.xml

在这里插入图片描述

总结

建议使用mybatis的插件,更好的将mapper接口和mapper.xml结合起来。
使用这个插件很好用。
在这里插入图片描述
使用之后会出现蓝色箭头,直接对应找到mapper.xml
在这里插入图片描述
另外:纪录一下mapper.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.jd.mapper.UserMapper">

</mapper>
<think>好的,用户提到MyBatis测试类报错,我需要详细分析可能的原因和解决方法。首先,我应该回忆常见的MyBatis测试问题,比如配置错误、SQL映射问题、资源未加载等。 用户可能不太清楚具体的错误信息,所以需要分步骤引导他们检查。首先,查看异常堆栈,确定错误类型,比如SQLException、BindingException或者连接问题。 接下来,考虑配置文件的正确性。MyBatis的配置文件(如mybatis-config.xml)是否正确,数据库连接参数是否正确,包括URL、用户名、密码。另外,mapper.xml文件的位置是否在类路径下,是否被正确扫描到。 然后是SQL会话工厂的创建是否正确,在测试类中是否正确初始化SqlSessionFactory。如果使用Spring,可能需要检查上下文配置是否正确加载,比如注解如@ContextConfiguration是否正确使用。 还有可能是映射接口的问题,比如方法名与XML中的id是否匹配,参数是否正确,结果映射是否有误。此外,数据库本身的问题,如表是否存在,字段是否匹配,事务管理是否恰当。 另外,资源过滤问题,特别是在Maven项目中,mapper.xml文件是否被正确复制到target目录下。需要在pom.xml中配置资源过滤,确保XML文件被打包。 还可能涉及事务未提交,导致查询不到数据。或者在测试方法中没有正确关闭SqlSession,造成资源泄漏。 需要建议用户检查日志,确认具体的错误信息,然后根据错误类型逐一排查。可能还需要给出示例代码,比如正确的配置方式或测试类结构,帮助用户对照修改。</think>当MyBatis测试类报错时,需按照以下步骤排查问题。以下是常见错误场景及解决方法: --- ### **1. 确认错误类型** 首先查看控制台抛出的**完整异常堆栈**,重点关注以下高频错误类型: - `org.apache.ibatis.exceptions.PersistenceException`:MyBatis核心异常 - `BindingException: Invalid bound statement (not found)`:接口与Mapper未绑定 - `SQLSyntaxErrorException`:SQL语法错误 - `IOException: Could not find resource`:资源文件加载失败 - `TypeException: Could not set parameters`:参数映射错误 --- ### **2. 检查配置文件** #### **(1) 数据库连接配置** 确保`mybatis-config.xml`或`application.properties`中的连接参数正确: ```properties # application.properties示例 spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` #### **(2) Mapper文件扫描路径** 验证XML映射文件路径是否在配置中声明: ```xml <!-- mybatis-config.xml示例 --> <mappers> <mapper resource="mapper/UserMapper.xml"/> </mappers> ``` --- ### **3. 排查Mapper绑定问题** #### **(1) 接口与XML映射匹配** - **接口方法名**必须与XML中`<select id="methodName">`严格一致 - **包路径**需符合`<mapper namespace="com.example.dao.UserMapper">` #### **(2) 资源文件未打包** 在Maven项目中,需在`pom.xml`中添加: ```xml <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </build> ``` --- ### **4. 测试类初始化验证** #### **(1) 手动加载SqlSessionFactory** ```java @Test public void testSelectUser() { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.selectById(1); System.out.println(user); } } ``` #### **(2) Spring整合测试** 使用`@SpringBootTest`时需确保配置类正确: ```java @SpringBootTest(classes = {MyBatisConfig.class, DataSourceConfig.class}) public class UserMapperTest { @Autowired private UserMapper userMapper; @Test public void testSelect() { User user = userMapper.selectById(1); Assert.assertNotNull(user); } } ``` --- ### **5. 数据库相关错误** #### **(1) 表结构不匹配** - 检查实体类字段名与数据库列名是否匹配 - 使用`@Result`注解手动映射(如驼峰命名未启用时): ```java @Results({ @Result(property = "createTime", column = "create_time") }) ``` #### **(2) 事务未提交** 在写操作测试后添加`session.commit()`: ```java @Test public void testInsert() { try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); mapper.insert(new User("test")); session.commit(); // 必须显式提交 } } ``` --- ### **6. 日志调试** 在`log4j.properties`中开启MyBatis日志: ```properties log4j.logger.org.mybatis=DEBUG log4j.logger.java.sql=DEBUG ``` --- ### **典型错误示例** ```log ### Cause: org.apache.ibatis.binding.BindingException: Parameter 'userId' not found. Available parameters are [arg1, arg0, param1, param2] ``` **解决方法**:在接口方法参数前添加`@Param`注解: ```java User selectByCondition(@Param("userId") Integer id, @Param("role") String role); ``` --- 通过以上步骤逐步排查,可解决90%以上的MyBatis测试类报错问题。建议结合具体错误信息精准定位原因。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值