SpringBoot | 3.2 整合MyBatis

全局配置文件

全局配置文件的书写方式有三种,分别是配置模式、注解模式以及混合模式。在配置之前,我们需要做些准备工作,让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-locationmapper-locations不能同在,理由如下:
    • 当需要使用mybatis-config.xml配置文件的时需要配置config-locationconfig-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映射关系在哪,除了用接口方式外,还可以:

  1. 通过MapperFactoryBean装配MyBatis;
  2. 使用MapperScannerConfigurer
  3. 使用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

posted @ 2021-08-30 11:53  Bonnie_ξ  阅读(259)  评论(0编辑  收藏  举报