smzqhy 2025-10-07 23:54 采纳率: 0%
浏览 15

为什么我mybatis代码使用mybatis-plus依赖后就不能用了

发布者正在通过bilibili上的黑马视频学习mybatis-plus,所以写了一个简单的mybatis代码想体验一下引入mybatis-plus依赖后是否会有变化
首先创建了一个数据库查询接口


package com.example.demo;



import org.apache.ibatis.annotations.Mapper;


@Mapper
public  interface  cha  {
    public com.example.demo.User selectBlog();

}

使用xml文件定义sql语句

<?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.example.demo.cha">
    <select id="selectBlog" resultType="com.example.demo.User">
        select * from vk limit 1
    </select>
</mapper>

使用名为user的bean接收


package com.example.demo;

import org.springframework.stereotype.Component;

@Component
public class User {
String name ;

    public void setName(String name) {
        this.name = name;
    }

    public User() {
    }

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

管理的依赖如下所示


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>org.example</groupId>
    <artifactId>demo1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo1</name>
    <description>demo1</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
<!--        <dependency>-->
<!--            <groupId>com.baomidou</groupId>-->
<!--            <artifactId>mybatis-plus-boot-starter</artifactId>-->
<!--            <version>3.5.7</version>-->
<!--        </dependency>-->
       <dependency>
           <groupId>org.mybatis.spring.boot</groupId>
           <artifactId>mybatis-spring-boot-starter</artifactId>
           <version>3.0.5</version>
       </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter-test</artifactId>
            <version>3.0.5</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

然后在仅仅改变依赖的情况下,运行报错了(未改变前正常运行)


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>org.example</groupId>
    <artifactId>demo1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo1</name>
    <description>demo1</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
       <dependency>
           <groupId>com.baomidou</groupId>
           <artifactId>mybatis-plus-boot-starter</artifactId>
           <version>3.5.7</version>
       </dependency>
<!--       <dependency>-->
<!--           <groupId>org.mybatis.spring.boot</groupId>-->
<!--           <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--           <version>3.0.5</version>-->
<!--       </dependency>-->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter-test</artifactId>
            <version>3.0.5</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

报错的内容太长了下面是deepseek分析后的结果

根据错误日志分析,问题出在你的Spring Boot应用程序中一个名为cha的Bean定义上。具体错误是:
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'cha' defined in file [C:\Users\19707\IdeaProjects\demo1\target\classes\com\example\demo\cha.class]: Invalid value type for attribute 'factoryBeanObjectType': java.lang.String
错误原因分析:
​Bean定义问题​:Spring在尝试处理cha这个Bean时,发现它的factoryBeanObjectType属性类型无效。这个属性应该是一个Class类型,但当前配置中可能是一个String类型。

这是为什么,请求帮忙解答

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-10-07 23:55
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    你提到在引入 MyBatis-Plus 依赖后,原本正常的 MyBatis 代码无法运行了。这个问题通常是由于 MyBatis-Plus 和原生 MyBatis 的兼容性问题 导致的。下面我将详细分析原因,并提供解决方案。


    一、问题分析

    1. MyBatis-Plus 与原生 MyBatis 的区别

    • MyBatis-Plus(MP) 是对 MyBatis 的增强工具,它提供了很多便捷的功能(如 CRUD 操作、分页等),但它是基于 MyBatis 构建的。
    • 如果你在项目中同时引入了 mybatis-spring-boot-startermybatis-plus-boot-starter,可能会导致 Spring Boot 自动配置冲突,因为它们都试图管理 MyBatis 的配置。

    2. 你当前的依赖情况

    你之前使用的是:

    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>3.0.5</version>
    </dependency>
    

    但在你尝试引入 MyBatis-Plus 后,可能错误地替换了这个依赖为:

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.7</version>
    </dependency>
    

    这会导致 Spring Boot 自动配置行为发生变化,尤其是如果你没有正确配置 MyBatis-Plus 的相关组件(如 @MapperScan 等),就会出现运行时异常。


    二、为什么会出现报错?

    以下是常见的几种报错原因:

    1. 未启用 MyBatis-Plus 的自动映射功能

    MyBatis-Plus 要求你使用它的 @Select@Update@Insert 等注解,或者通过继承 IService 接口来实现 CRUD 操作,而不是传统的 XML 文件方式。

    2. XML 文件未被正确识别

    MyBatis-Plus 默认不加载 XML 映射文件,除非你显式地配置了它。而你原来的代码是基于 XML 的,所以会出错。

    3. 缺少 @MapperScan 注解

    MyBatis-Plus 需要你用 @MapperScan 注解扫描 Mapper 接口,否则无法识别你的接口。


    三、解决方法(按步骤)

    ✅ 正确做法:使用 MyBatis-Plus 的方式重构代码

    1. 移除旧的 MyBatis 依赖,改用 MyBatis-Plus

    修改 pom.xml 中的依赖部分如下:

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.7</version>
    </dependency>
    

    注意:不要同时保留 mybatis-spring-boot-starter,否则会冲突。


    2. 添加 @MapperScan 注解

    在 Spring Boot 主类上添加:

    @SpringBootApplication
    @MapperScan("com.example.demo") // 扫描 Mapper 接口所在的包
    public class Demo1Application {
        public static void main(String[] args) {
            SpringApplication.run(Demo1Application.class, args);
        }
    }
    

    3. 重构 Mapper 接口(使用 MyBatis-Plus 的方式)

    如果你不想用 XML,可以改为使用 MyBatis-Plus 的注解方式:

    package com.example.demo;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import org.apache.ibatis.annotations.Mapper;
    
    @Mapper
    public interface UserMapper extends BaseMapper<User> {
        // 可以直接调用 selectById() 等方法
    }
    

    4. 如果坚持使用 XML 文件

    你需要手动配置 MyBatis-Plus 加载 XML 文件:

    修改 application.yml
    mybatis-plus:
      mapper-locations: classpath*:mapper/*.xml
    
    pom.xml 中确保有以下依赖(可选):
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.9</version>
    </dependency>
    

    四、完整修改后的 pom.xml 示例

    <dependencies>
        <!-- 使用 MyBatis-Plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.7</version>
        </dependency>
    
        <!-- MySQL 驱动 -->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
    
        <!-- 测试依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    

    五、总结

    | 问题 | 解决方案 | |------|----------| | 引入 MyBatis-Plus 后无法运行 | 移除原生 MyBatis 依赖,使用 MyBatis-Plus 的方式重构代码 | | XML 文件未被识别 | 添加 mybatis-plus.mapper-locations 配置 | | Mapper 接口未被扫描 | 添加 @MapperScan 注解 | | 使用 XML 与 MyBatis-Plus 不兼容 | 尽量使用 MyBatis-Plus 提供的注解或接口方法 |


    六、建议

    如果你刚开始学习 MyBatis-Plus,建议先使用其提供的 BaseMapperService 接口,避免直接使用 XML 文件,这样能更高效地体验其优势。

    如果你确实需要使用 XML,那么务必确认 MyBatis-Plus 的配置是否正确加载 XML 文件。


    如有更多错误信息(如具体报错内容),欢迎继续提问,我可以进一步帮你定位问题!

    评论

报告相同问题?

问题事件

  • 创建了问题 10月7日