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


相关推荐

  • kafka应用场景包括_什么是场景理论

    kafka应用场景包括_什么是场景理论1.Kafka概述Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。简单地说,Kafka就相比是一个邮箱,生产者是发送邮件的人,消费者是接收邮件的人,Kafka就是用来存东西的,只不过它提供了一些处理邮件的机制。               2.Kafka相关名词分析Broker:Kafka节点,一个Kafka…

    2022年10月14日
    3
  • Codeforces 432E Square Tiling(结构体+贪婪)

    Codeforces 432E Square Tiling(结构体+贪婪)

    2022年1月5日
    36
  • Java中executeUpdate和executeQuery的区别

    Java中executeUpdate和executeQuery的区别executeQueryexecuteQuery()方法是在PreparedStatement对象中执行SQL查询,并返回该查询生成的ResultSet对象,executeUpdate该方法是在PreparedStatement对象中执行SQL语句,该语句必须是一个SQL数据操作语言,例如INSERT,UPDATE,DELETE等语句,或者是没有返回内容的SQL语句….

    2022年10月20日
    1
  • 群晖|半洗白后moments正常显示人像、主题、预览「建议收藏」

    群晖|半洗白后moments正常显示人像、主题、预览「建议收藏」Moments不工作群晖重装6.2.3之后,发现moments不能正常工作了,不管是人物还是主题都是空白,还会显示有XXX张照片待发现,但会停在这儿。这如何能忍,网络上找到替换文件大法,没啥用,这台虚拟机内黑群晖只能暂时放下。想到自己还有台裸机安装的黑群晖,尝试后moments正常工作。替换ffmpeg为第三方替换的目的是为了能够正确的生成预览图、视频等。dsm版本及内核uname-a#LinuxvmDSM3.10.105#25426SMPTueMay1204:53:1

    2022年5月6日
    1.6K
  • linux zip 删除源文件,linux zip命令参数及用法详解–linux压缩zip文件命令[通俗易懂]

    linux zip 删除源文件,linux zip命令参数及用法详解–linux压缩zip文件命令[通俗易懂]linux命令的基本用法是:zip[参数][打包后的文件名][打包的目录路径]linuxzip命令参数列表:-a将文件转成ASCII模式-F尝试修复损坏的压缩文件-h显示帮助界面-m将文件压缩之后,删除源文件-n特定字符串不压缩具有特定字尾字符串的文件-o将压缩文件内的所有文件的最新变动时间设为压缩时候的时间-q安静模…

    2022年10月20日
    2
  • jdbc java_SpringBoot打包

    jdbc java_SpringBoot打包一、SpringBootDataJPA介绍  SpringData:其实SpringData就是Spring提供了一个操作数据的框架。而SpringDataJPA只是SpringData框架下的一个基于JPA标准操作数据的模块。  SpringDataJPA:基于JPA的标准数据进行操作。简化操作持久层的代码。只需要编写接口就可以。  二、SpringBoot整…

    2022年10月20日
    2

发表回复

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

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