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


相关推荐

  • docker部署mysql 实现远程连接[通俗易懂]

    1.dockersearchmysql查看mysql版本2.dockerpullmysql要选择starts最高的那个name进行下载3.dockerimages查看下载好的镜像4.启动mysql实例dockerrun–namedockermysql-p3307:3306-eMYSQL_ROOT_PASS…

    2022年4月11日
    45
  • SpringCloud整合Hmily实现TCC分布式事务案例详解

    SpringCloud整合Hmily实现TCC分布式事务案例详解目录一、概述二、案例说明和数据库、表准备三、服务注册中心搭建四、搭建中国建设银行BBC微服务五、搭建中国工商银行ICBC微服务六、测试七、总结一、概述前面一篇文章,我们已经详细介绍了TCC是如何处理分布式事务,主要分别三个阶段:try:负责业务检查及资源预留; confirm:用来执行业务逻辑; cancel:实现一个与Try相反的操作既回滚操作;前面一篇文章,大部分都是理论相关知识,我们都知道理论必须结合实践才能加深对其理解,所以本篇文章我们将会以一个银行转账

    2022年5月21日
    40
  • mask rcnn训练自己的数据集_fasterrcnn训练自己的数据集

    mask rcnn训练自己的数据集_fasterrcnn训练自己的数据集这篇博客是基于GoogleColab的maskrcnn训练自己的数据集(以实例分割为例)文章中数据集的制作这部分的一些补充温馨提示:实例分割是针对同一个类别的不同个体或者不同部分之间进行区分我的任务是对同一个类别的不同个体进行区分,在标注的时候,不同的个体需要设置不同的标签名称在进行标注的时候不要勾选labelme界面左上角File下拉菜单中的StayWithImagesData选项否则生成的json会包含Imagedata信息(是很长的一大串加密的软链接

    2022年8月23日
    5
  • Apache Thrift的简单使用

    Apache Thrift的简单使用

    2021年12月7日
    48
  • 写给夏燕第十一个男人「建议收藏」

    写给夏燕第十一个男人「建议收藏」悲哀,(李旧)是她第十一个男人。她想要什么呢???很多男人吗?很多是多少?我是她第十个男人,我原理她了:“说自己以前走的路不可能回头了,叫我不要在过问她以前的事了”。过也两个月后,可还死不改心,还有多少男人被她骗呢?   夏燕(安徽宿松人) 她电话13764996496 15300910532 13917482046   过年回家时,我和夏燕(我第一个女人)认识我不到24小时,就和她发生过关系,还

    2022年9月18日
    3
  • orcle数据库[通俗易懂]

    orcle数据库[通俗易懂]步骤:1、下载安装数据库2、安装plsqldevepor3、使用下面的东西创建表空间和用户使用plsql来orcle创建表空间和用户

    2025年8月4日
    1

发表回复

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

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