包扫描路径到package级别即可,比如到com.example.dao,不需要到下面的类
使用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,我们可以二选其一。