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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • activity生命周期_软件生命周期八个阶段

    activity生命周期_软件生命周期八个阶段子曰:溫故而知新,可以為師矣。《論語》学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细研读几遍,以领悟到作者的思想精髓。近来回顾了一下关于Activity的生命周期,参看了相关书籍和官方文档,也有了不小的收获,对于以前的认知有了很大程度上的改善,在这里和大家分享一下。熟悉javaEE的朋友们都了解servlet技术,

    2022年8月16日
    2
  • 手机游戏开发综述[通俗易懂]

    手机游戏开发综述[通俗易懂]一、背景介绍  现在的移动电话是小型的计算机,它的处理能力与台式机的标准处理能力相比很有限,但是足够运行一个小型的游戏。  现在的手机的一个特性就是它们还是网络计算机,能够高速发送和接收数字数据。除了语音数据以外,它们还可以发送和接收其它类型的数据。所以类似《传奇》、《千年》这样的网络游戏也可以在手机上实现。当然就处理能力和性能而言,当前阶段的支持Java的手机很接近第二代控制台游戏机、80年

    2022年6月7日
    36
  • 一文看懂TVS二极管SM8S30A

    一文看懂TVS二极管SM8S30A一文读懂TVS二极管SM8S系列,汽车抛负载防护器件随着汽车行业的大力发展,智能化、数字网络化、总线化以及节能环保成为了汽车发展的方向,然而,无论朝着哪种方向发展,汽车运用的基础电子保护防护元器件作用不容忽视,不可替代。如今,汽车电路保护的概念,早已不在局限于汽车保险丝,从仪表盘到车灯,从动力总成系统到高级驾驶辅助,个性化驾驶习惯和不确定的工作环境,都需要更高级、先进的保护措施为汽车保驾护航。电…

    2022年9月23日
    0
  • linux系统下怎么安装.deb文件?

    linux系统下怎么安装.deb文件?

    2021年12月1日
    58
  • 记一次固态硬盘数据恢复

    记一次固态硬盘数据恢复背景15年初的时候买过一个128G的固态硬盘,在自己的笔记本电脑上组了一个双硬盘(ssd+hdd),ssd作为系统盘。到今年也已经用了三年了。昨天上午的时候,电脑突然蓝屏报错,本来以为是一次简单的蓝屏故障,但是发现电脑重启之后,电脑报错找不到硬盘。当时心里一凉,难道硬盘寿终就寝了,但是硬盘坏了不重要,里面的数据还没有备份会比较可怕。赶快用一个winpe系统把电脑开起来,想看看数据是否还在。然…

    2022年9月20日
    0
  • PHP网站常见安全漏洞,及相应防范措施总结

    PHP网站常见安全漏洞,及相应防范措施总结

    2021年9月24日
    41

发表回复

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

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