全局配置文件
全局配置文件的书写方式有三种,分别是配置模式、注解模式以及混合模式。在配置之前,我们需要做些准备工作,让SpringBoot知道我们的配置文件写在哪里。
准备工作:
配置全局配置文件位置( 在application.yaml
中指定Mapper配置文件的位置,以及指定全局配置文件的信息,建议配置在mybatis.configuration
);
mybatis: #全局配置文件位置 config-location: classpath:mybatis/mybatis-config.xml #sql映射文件位置 mapper-locations: classpath:mybatis/mapper/*.xml #定义别名扫描的包,需要与@Alias联合使用 type-aliases-package: …… #具体类需要与@MappedJdbcTypes联合使用 type-handlers-package: …… #执行器(Executor),可以配置STMPLE、REUSE、BATCH、默认为STMPLE executor-type: …… configuration: #配置MyBatis插件(拦截器等) interceptors: …… #级联延迟加载配置属性 aggressive-lazy-loading: ……
-
- 注意
config-location
与mapper-locations
不能同在,理由如下: - 当需要使用mybatis-config.xml配置文件的时需要配置
config-location
,config-location
的作用是确定mybatis-config.xml文件位置;而mapper-locations
是用来注册xxxmapper.xml文件。如果使用了mybatis-config.xml,并且里面配置了mapper,那就不需要mapper-locations
。
- 注意
-
编写mapper接口,使用标准
@Mapper
注解( 也可以在启动类上加上@MapperScan
替换@Mapper )
@Mapper
-
映射配置;
-
用在接口类上
-
在接口类上添加了@Mapper,在编译之后会生成相应的接口实现类;
-
如果有多组接口需要编译成实现类,需要在每个接口上标注一个@Mapper;
@Mapper public interface UserDAO { //代码 }
@MapperScan
-
映射扫描配置;
-
用在主启动类下;
-
指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类;
-
将MyBatis所需的对应接口扫描到Spring IOC容器中;
-
可以解决@Mapper标注过多问题,直接在主启动类上加上一个@MapperScan即可;
@SpringBootApplication //@MapperScan("com.dlhjw.mapper") @MapperScan( //指定扫描包 basePackages = "com.dlhjw.mapper", //指定SqlSessionFactory,如果sqlSessionTemplate被指定,则作废 sqlSessionFactoryRef = "sqlSessionFactory", //指定sqlSessionTemplate,将忽略sqlSessionFactory的配置(优先级高) sqlSessionTemplateRef = “sqlSessionTemplate”, //限制扫描接口,不常用 //markerInterface = class.class, annotationClass = Repository.class ) public class SpringbootMybatisDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringbootMybatisDemoApplication.class, args); } }
【以下不常用、不推荐】 上述两个接口都可以让SpringBoot知道用户配置的MyBatis映射关系在哪,除了用接口方式外,还可以:
- 通过
MapperFactoryBean
装配MyBatis; - 使用
MapperScannerConfigurer
; - 使用MyBatis接口(因为
SqlSessionFactory
是SpringBoot自动生成好了,所以直接拿来使用);
上面两个接口可改成如下代码:(不常用、不推荐)
1. 通过MapperFactoryBean装配MyBatis:
@Autowired SqlSessionFactory sqlSessionFactory = null; //定义一个MyBatis的Mapper接口 @Bean public MapperFactoryBean<MyBatisUserDao> initMyBatisUserDao(){ MapperFactoryBean<MyBatisUserDao> bean = new MapperFactoryBean<>(); bean.setMapperInterface(UserDAO.class); bean.setSessionFactory(sqlSessionFactory); return beam; }
2. 使用MapperScannerConfigurer:
@Bean public MapperScannerConfigurer mapperScannerConfig(){ //定义扫描器实例 MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); //加载SqlSessionFactory,SpringBoot会自动生产,SqlSessionFactory实例 mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory"); //定义扫描的包 mapperScannerConfigurer.setBeanPackage("com.dlhjw.mapper"); //限定被标注@Repository的接口才被扫描 mapperScannerConfigurer.setAnnotationClass(Repository.class); //通过继承某个接口限制扫描,一般使用不多 //mapperScannerConfigurer.setMarkerInterface(....); return mapperScannerConfigurer; }
3. 使用MyBatis接口:
public interface MyBatisUserService{ public User getUser(Long id); } @Service public class MyBatisUserServiceImpl implements MyBatisUserService{ //因为在启动文件application.yaml配置了对应接口,所以直接依赖注入即可 @Autowired private MyBatisUserDao myBatisUserDao = null; @Override public User getUser(Long id){ return myBatisUserDao.getUser(id); } }
https://www.cnblogs.com/dlhjw/p/15115803.html