mybatis错误:Invalid bound statement (not found): com.prcsteel.peanut.dao.UserDao.selectById

本文介绍了如何在Spring框架中整合MyBatis,包括配置SqlSessionFactoryBean、设置数据源、指定实体类包路径等步骤,并解决了mapper文件未被加载的问题。

spring + mybatis 配置 SqlSessionFactoryBean

<bean id="sqlSessionFactory" name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--数据源-->
        <property name="dataSource" ref="dataSource" />
        <!--基础实体类包路径-->
        <property name="typeAliasesPackage" value="${mybatis.model}" />
        <!--mybatis 动态sql编写mapper文件路径-->
        <property name="mapperLocations" value="${mybatis.mapperLocations}" />
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageHelper">
                    <property name="properties" value="dialect=mysql"/>
                </bean>
            </array>
        </property>
    </bean>

代理接口dao通过MapperScanConfigurer扫描注入

<!--mapper 代理接口(dao)扫描-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--这里value 用properties文件引入死活不成功!-->
        <property name="basePackage" value="com.prcsteel.peanut.dao" />
        <!--单一数据源时可以不配制此项-->
      <!--  <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />-->
    </bean>

参照网上的几点建议:
1、<mapper namespace="com.prcsteel.peanut.dao.UserDao">
mapper文件namespace和dao路径对应

2.UserDao的方法在UserMapper.xml中没有,然后执行UserDao的方法会报此

3、UserDao的方法返回值是List,而select元素没有正确配置ResultMap,或者只配置ResultType!

4、如果你确认没有以上问题,请任意修改下对应的xml文件,比如删除一个空行,保存.问题解决…

发现并无上述问题。仔细查看log,发现有这一段输出:

[DEBUG] org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory - Property 'mapperLocations' was not specified or no matching resources found

SqlSessionFactoryBean 并没有加载到对应的mapper xml文件,当然执行方法的时候也就找不到dao所对应的mapper,而无法执行对应的sql,查看maven target 的classes目录下也并没有mapper的xml文件出现。

原因:mapper文件并不是放在resource中,而是在java目录,maven编译的时候并没有把xml文件编译进来。
解决:在pom文件中添加resource编译

<resources>
    <resource>
        <!--此处配置到java是因为mapper.xml文件在java目录-->
        <directory>src/main/java</directory>
        <includes>
            <include>**/*</include>
        </includes>
        <filtering>false</filtering>
    </resource>
</resources>
Spring Boot 应用中出现 `Invalid bound statement (not found): cn.itsurtce.springbottour.dao.UserDao.selectById` 错误,通常表明 MyBatis 无法找到与接口方法相对应的 SQL 映射语句。这种问题可能由多个因素导致,包括但不限于映射文件未正确加载、命名空间配置错误、或接口与 XML 文件不匹配等。 ### 常见原因及解决办法 #### 1. **Mapper XML 文件未被正确加载** Spring Boot 默认不会自动包含 `src/main/java` 目录下的 XML 文件。如果 Mapper XML 文件位于 Java 源代码目录中,则需要在 `pom.xml` 中添加资源过滤配置,确保这些文件能够被编译到目标目录中 [^3]。 ```xml <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> <resource> <directory>src/main/resources</directory> </resource> </resources> </build> ``` #### 2. **XML 文件中的 namespace 与 DAO 接口不一致** 每个 MyBatis 的 Mapper XML 文件都必须指定一个 `namespace`,该值应当等于对应接口的全限定类名。例如,如果 `UserDao` 接口位于包 `cn.itsurtce.springbottour.dao` 下,则其对应的 XML 文件中应该如下所示: ```xml <mapper namespace="cn.itsurtce.springbottour.dao.UserDao"> <select id="selectById" resultType="..."> SELECT * FROM user WHERE id = #{id} </select> </mapper> ``` 若两者名称不一致,MyBatis 将无法将接口方法与 XML 中的 SQL 语句绑定起来 [^2]。 #### 3. **未正确注册 Mapper 接口或 XML 文件** 在 Spring Boot 应用中,可以通过两种方式注册 MyBatis 的 Mapper:一种是使用注解(如 `@MapperScan`),另一种是在 MyBatis 配置文件中手动注册。 - **使用 `@MapperScan` 注解** ```java @SpringBootApplication @MapperScan("cn.itsurtce.springbottour.dao") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` - **在 `mybatis-config.xml` 中注册 Mapper** ```xml <mappers> <mapper class="cn.itsurtce.springbottour.dao.UserDao"/> </mappers> ``` 确保所有涉及的接口和 XML 文件都被正确注册 [^2]。 #### 4. **检查文件路径是否正确** XML 文件应当放置在资源目录(通常是 `src/main/resources`)下,或者确保 `pom.xml` 中已配置了正确的资源路径以包含 Java 源码目录中的 XML 文件 [^3]。 #### 5. **确认项目构建后 XML 文件存在于 classpath 中** 执行 Maven 构建命令后,检查 `target/classes` 目录下是否存在相应的 XML 文件。如果没有,说明资源过滤配置可能存在问题 [^3]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值