SpringBoot使用@Mapper和@MapperScan注解无效的解决方法

SpringBoot使用@Mapper和@MapperScan注解无效的解决方法在使用@Mapper注解时,注解无效,service层,dao层该添加的注解都添加了,最后发现是少加了一个jar包<!–缺少此jar包,导致@Mapper注解无效–><dependency><groupId>org.mybatis.spring.boot</groupId>

大家好,又见面了,我是你们的朋友全栈君。

在使用@Mapper注解时,注解无效,service层,dao层该添加的注解都添加了,最后发现是少加了一个jar包

<!--缺少此jar包,导致@Mapper注解无效-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.2.0</version>
        </dependency>

添加此依赖,注解即可正常使用。

还有就是可能是版本号有问题。除此之外,SpringBoot项目别忘了要在properties配置文件中配置mapper.xml文件存放路径,否则会报Invalid bound statement (not found): cn.hzr0523.dao.UserMapper.insertUserInfo错误。

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

2019-04-23 遇一问题:

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

<!--        <dependency>-->
<!--            <groupId>org.mybatis.spring.boot</groupId>-->
<!--            <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--            <version>2.0.1</version>-->
<!--            <exclusions>-->
<!--                <exclusion>-->
<!--                    <groupId>org.mybatis</groupId>-->
<!--                    <artifactId>mybatis</artifactId>-->
<!--                </exclusion>-->
<!--                <exclusion>-->
<!--                    <groupId>org.mybatis</groupId>-->
<!--                    <artifactId>mybatis-spring</artifactId>-->
<!--                </exclusion>-->
<!--            </exclusions>-->
<!--        </dependency>-->

使用当前最新版本的MyBatis Plus, 如果使用mybatis-plus-boot-starter依赖,一切正常,但是我想使用下面两个依赖替换上面的依赖,结果老是有问题。排除jar包冲突之后,启动项目虽然正常,但访问Mapper时报错。遇到的错误有一下几个:

  • 只去掉mybatis-plus-boot-starter依赖,Mapper中继承了BaseMapper<>接口,想使用mybatisplus提供的方法,但是一调用方法就报invalid bind statement, 提示我调用selectOne()找不到。
  • 如果把mybatis-spring-boot-starter整个依赖去掉,只留下mybatis-plus依赖,则会报:java.lang.annotation.AnnotationFormatError: Invalid default: public abstract java.lang.Class org.mybatis.spring.annotation.MapperScan.factoryBean(),没有此jar包,导致mapperscan注解无法使用。

???为什么会这样,后面两个依赖和第一下依赖的效果难道不是一样的吗。。。
经过对官方文档的理解,应该后面两个依赖使用springMVC框架,一些配置需要写到xml中,在springboot中无法实现自动绑定,需要自己手动创建配置文件。
解决方法:加个MyBatisConfig文件


@Configuration
@MapperScan(basePackages = { "cn.hezhiren.funshop.mapper"}, sqlSessionFactoryRef = "sqlSessionFactory")
public class MybatisPlusConfig {
    @Autowired
    private DataSource dataSource;

    @Autowired
    private MybatisProperties properties;

    @Autowired
    private ResourceLoader resourceLoader = new DefaultResourceLoader();

    @Autowired(required = false)
    private Interceptor[] interceptors;

    @Autowired(required = false)
    private DatabaseIdProvider databaseIdProvider;

    /**
     * mybatis-plus分页插件
     */
    @Bean
    @Primary
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor page = new PaginationInterceptor();
        page.setDialectType("mysql");
        return page;
    }

    /**
     * 这里全部使用mybatis-autoconfigure 已经自动加载的资源。不手动指定 配置文件和mybatis-boot的配置文件同步
     *
     * @return
     */
    @Primary
    @Bean(name = "sqlSessionFactory")
    public MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean() {
        MybatisSqlSessionFactoryBean mybatisPlus = new MybatisSqlSessionFactoryBean();
        mybatisPlus.setDataSource(dataSource);
        mybatisPlus.setVfs(SpringBootVFS.class);
        if (StringUtils.hasText(this.properties.getConfigLocation())) {
            mybatisPlus.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
        }
        // mybatisPlus.setConfiguration(properties.getConfiguration());
        if (!ObjectUtils.isEmpty(this.interceptors)) {
            mybatisPlus.setPlugins(this.interceptors);
        }
        // MP 全局配置,更多内容进入类看注释
//        GlobalConfiguration globalConfig = new GlobalConfiguration();
//        globalConfig.setDbType(DBType.MYSQL.name());
//        // ID 策略 AUTO->`0`("数据库ID自增")
//        // INPUT->`1`(用户输入ID") ID_WORKER->`2`("全局唯一ID") UUID->`3`("全局唯一ID")
//        globalConfig.setIdType(0);
//        mybatisPlus.setGlobalConfig(globalConfig);
        // MybatisConfiguration mc = new MybatisConfiguration();
        // mc.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
        // mybatisPlus.setConfiguration(mc);
        if (this.databaseIdProvider != null) {
            mybatisPlus.setDatabaseIdProvider(this.databaseIdProvider);
        }
        if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {
            mybatisPlus.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
        }
        if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {
            mybatisPlus.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
        }
        if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {
            mybatisPlus.setMapperLocations(this.properties.resolveMapperLocations());
        }
        return mybatisPlus;
    }

    /**
     * SQL执行效率插件
     */
    @Bean
    public PerformanceInterceptor performanceInterceptor() {
        return new PerformanceInterceptor();
    }
}

主要原因应该就是SqlSessionFactory,没有使用第一个依赖,没有配置sqlSessionFactory的话,则Spring会加载默认的原生mybatis自带的sqlSessionFactory,而没有使用mybatisplus提供的MyBatisSqlSessionFactory,导致invalid bind statement的出现。使用配置文件配置MyBatisSqlSessionFactory之后,则就可以正常只用BaseMapper中提供的方法。
当然,现在有第一个与springboot集成的jar包了,直接使用即可,很方便,配置也更加容易,不需要额外添加配置文件。

那么…问题又来了,mybatis-plus-boot-start又是如何实现与springboot集成的呢,首先开下jar包目录:
在这里插入图片描述
在这里就帮你配置了上面的那种配置文件(MyBatisAutoConfiguratuion)。
在这里插入图片描述
代码中重要的一点,使用MyBatisSqlSessionFactory取代SqlSessionFactory。
除此之外,还有一个spring.factory文件
在这里插入图片描述
这个spring.factories里面配置的类,主要作用是告诉Spring Boot这个stareter所需要加载的那些xxxAutoConfiguration类,也就是你真正的要自动注册的那些bean或功能。然后,我们实现一个spring.factories指定的类,标上@Configuration注解,一个starter就定义完了。
读取spring.factories文件的实现是通过org.springframework.core.io.support.SpringFactoriesLoader实现。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132313.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • at命令的用法

    at命令的用法at 命令的用法 nbsp At 列出在指定的时间和日期在计算机上运行的已计划命令或计划命令和程序 必须正在运行 计划 服务才能使用 at 命令 at computername id delete delete yes at computername time interactive every date

    2025年9月1日
    5
  • AndroidStudio-断点调试-让你的调试更有效率

    AndroidStudio-断点调试-让你的调试更有效率前言:上篇博客AndroidStudio-断点调试-也许你该知道断点调试是有多么的美好,记录了AndroidStudio上断点调试的基本流程和debug面板按钮介绍.这一篇就给大家分享一点调试的小技巧,让我们的代码调试变得更有效率.你可以选择随时进入调试模式一般我们都是点击绿色小昆虫进入调试模式进行调试,其实还可以有另外一种方法.看下面的面板截图,有没有发现有两个小昆虫图标.图标E

    2022年5月21日
    63
  • Mathtype公式编辑器常用快捷键

    Mathtype公式编辑器常用快捷键文章目录Mathtype公式编辑器常用快捷键1.放大或缩小尺寸2.在数学公式中插入一些符号3.微移间隔4.元素间的跳转用键盘选取菜单或工具条贴加常用公式Mathtype公式编辑器常用快捷键1.放大或缩小尺寸Ctrl+1(100%);Ctrl+2(200%);Ctrl+4(400%);Ctrl+8(800%)。2.在数学公式中插入一些符号Ctrl+9或Ctrl+0(小括号);Ctrl+[或Ctrl+](中括号);Ctrl+{或Ctrl+}(大括号);Ctrl+F(分式);Ctrl+/(斜杠

    2025年6月18日
    3
  • linux配置pycharm环境_创建桌面快捷方式是什么意思

    linux配置pycharm环境_创建桌面快捷方式是什么意思一去官网下载基于Linux系统PyCharm的安装包DownloadPyCharm:PythonIDEforProfessionalDevelopersbyJetBrains关于专业版和社区版:本人下载community版本,具体版本区别可参考下面所附链接pyCharm专业版、教育版和社区版的区别详解及查看其版本_水亦心的博客-CSDN博客_pycharm专业版和社区版区别一、功能上的区别:PyCharm专业版是功能最丰富的,与社区版相比,PyCharm.

    2022年10月18日
    7
  • devtools安装_检测devtools

    devtools安装_检测devtoolsvue-devtools是一款基于chrome浏览器的插件,用于调试vue应用。安装:chrome商店直接安装。手动安装步骤:找到vue-devtools的github项目,并将其clone到本地:gitclonehttps://github.com/vuejs/vue-devtools.git安装项目所需要的npm包:npminstall编译项目文件:npmrunbuild添加至chrome浏览器:地址(“chrome://extensions/”)进入扩展程序页面,点击“加载

    2022年9月1日
    4
  • [教程]使用Lite MP4 Tool专业制作MP4(AVC)视频格式 – 指导教程

    [教程]使用Lite MP4 Tool专业制作MP4(AVC)视频格式 – 指导教程LiteMP4Tool教程,详细教程,MP4教程

    2022年7月2日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号