关于spring boot 的测试问题

img


如图,在test测试类里测试getbyid方法,显示创建bean有问题。我试了试用mapperscan注入也不行,而写的bean也是按照视频里来的,那么到底是哪里的问题?

包扫描路径到package级别即可,比如到com.example.dao,不需要到下面的类

  • 这篇博客: Spring Boot 2.x使用篇(二)—— 访问数据库中的 4.3.3 使用@MapperScan定义扫描 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •   使用MapperScannerConfigurer扫描装配MyBatis接口的方式虽然能够通过扫描的方式装配Bean,从而避免了一个一个接口的装配,但是这种方式仍然需要编写代码。而实际上还有更为简单的方式,那就是使用注解@MapperScan

      修改Spring Boot的启动类Chapter5Application为如下所示:

    package com.ccff.springboot.demo.chapter5;
    
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.stereotype.Repository;
    
    @SpringBootApplication
    @MapperScan(basePackages="com.ccff.springboot.demo.chapter5.dao", annotationClass = Repository.class)
    public class Chapter5Application {
        @Autowired
        SqlSessionFactory sqlSessionFactory = null;
    
        /**
         * 定义一个MyBatis的Mapper接口
         * @return
         */
    //    @Bean
    //    public MapperFactoryBean<MyBatisUserDao> initMyBatisUserDao(){
    //        MapperFactoryBean<MyBatisUserDao> bean = new MapperFactoryBean<>();
    //        bean.setMapperInterface(MyBatisUserDao.class);
    //        bean.setSqlSessionFactory(sqlSessionFactory);
    //        return bean;
    //    }
    
        /**
         * 配置MyBatis接口扫描
         * @return
         */
    //    @Bean
    //    public MapperScannerConfigurer mapperScannerConfigurer(){
    //        //定义扫描器示例
    //        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
    //        //加载SqlSessionFactory,Spring Boot会自动生产,SqlSessionFactory实例
    //        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
    //        //定义扫描的包
    //        mapperScannerConfigurer.setBasePackage("com.ccff.springboot.demo.chapter5.dao");
    //        //限定被注解@Repository标注的接口才被扫描
    //        mapperScannerConfigurer.setAnnotationClass(Repository.class);
    //        //除此之外,还可以通过继承某个接口限制扫描,但一般用的不多
    //        //mapperScannerConfigurer.setMarkerInterface(...);
    //        return mapperScannerConfigurer;
    //    }
    
        public static void main(String[] args) {
            SpringApplication.run(Chapter5Application.class, args);
        }
    
    }
    

      注解@MapperScan允许我们通过扫描加载MyBatis的Mapper,如果Spring Boot项目中不存在多个SqlSessionFactory(或者SqlSessionTemplate),那么完全可以不配置sqlSessionFactoryRef(或者sqlSessionTemplateRef)。但如果存在多个时,必须进行指定,而且需要注意的是:sqlSessionTemplateRef的优先权是大于sqlSessionFactoryRef的,也就是当我们将两者都配置之后,系统会优先选择sqlSessionTemplateRef,而把sqlSessionFactoryRef作废。与使用MapperScannerConfigurer类似,在使用注解@MapperScan时也可以选择接口限定,同样并不常用。

      需要说明一点的是:在上面的代码中,选择使用注解@Repository作为限定,这是一个Spring对持久层的注解,而事实上MyBatis也提供了一个对Mapper的注解@Mapper,我们可以二选其一。