数据访问-整合mybatis原理及源码注解

数据访问整合mybatis
去GitHub上找mybatis的场景依赖:mybatis的场景依赖
starter
Spring Boot官方的starter: spring-boot-starter-*
第三方的:*-spring-boot-starter

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.4</version>
</dependency>

在这里插入图片描述
首先找到mybatis的自动配置包:
在这里插入图片描述
在此jar包一加载就会引入spring.factories下的自动配置类:

#Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisLanguageDriverAutoConfiguration,\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

点开MybatisAutoConfiguration配置类:

@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties(MybatisProperties.class)
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class })

@ConditionalOnClass表示容器中有SqlSessionFactory.class, SqlSessionFactoryBean.class配置类的时候才会加载,在导入mybatis包的时候就有这两个配置类了。
@ConditionalOnSingleCandidate(DataSource.class) 表示当前容器中只有一个数据源的时候才加载。
@EnableConfigurationProperties(MybatisProperties.class) mybatis配置项的绑定类,点开MybatisProperties:

@ConfigurationProperties(prefix = MybatisProperties.MYBATIS_PREFIX)
public class MybatisProperties {
  public static final String MYBATIS_PREFIX = "mybatis";

可以看到mybatis绑定的配置文件的前缀是mybatis,所以要修改配置项的话只需要修改配置文件中以mybatis开头的所有即可。
1.配置模式

  • 全局配置文件:
  • SqlSessionFactory:自动配置好了
    查看MybatisAutoConfiguration类的构造方法可以看到,在进行构造的时候就加载MybatisProperties配置文件了:
public MybatisAutoConfiguration(MybatisProperties properties, ObjectProvider<Interceptor[]> interceptorsProvider,
      ObjectProvider<TypeHandler[]> typeHandlersProvider, ObjectProvider<LanguageDriver[]> languageDriversProvider,
      ResourceLoader resourceLoader, ObjectProvider<DatabaseIdProvider> databaseIdProvider,
      ObjectProvider<List<ConfigurationCustomizer>> configurationCustomizersProvider) {
    this.properties = properties;
    this.interceptors = interceptorsProvider.getIfAvailable();
    this.typeHandlers = typeHandlersProvider.getIfAvailable();
    this.languageDrivers = languageDriversProvider.getIfAvailable();
    this.resourceLoader = resourceLoader;
    this.databaseIdProvider = databaseIdProvider.getIfAvailable();
    this.configurationCustomizers = configurationCustomizersProvider.getIfAvailable();
  }

继续向下看:

  @Bean
  @ConditionalOnMissingBean
  public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
    factory.setDataSource(dataSource);

给容器中放了SqlSessionFactory ,使用容器中的数据源。

  • SqlSession:自动配置了SqlSessionTemplate 组合了SqlSession
  @Bean
  @ConditionalOnMissingBean
  public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
    ExecutorType executorType = this.properties.getExecutorType();
    if (executorType != null) {
      return new SqlSessionTemplate(sqlSessionFactory, executorType);
    } else {
      return new SqlSessionTemplate(sqlSessionFactory);
    }
  }

点进去SqlSessionTemplate可以看到:

public class SqlSessionTemplate implements SqlSession, DisposableBean {
  private final SqlSessionFactory sqlSessionFactory;
  private final ExecutorType executorType;
  private final SqlSession sqlSessionProxy;
  private final PersistenceExceptionTranslator exceptionTranslator;
  public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
    this(sqlSessionFactory, sqlSessionFactory.getConfiguration().getDefaultExecutorType());
  }

SqlSessionTemplate 组合了SqlSession。

  • Mapper:只要我们写的操作mybatis的接口标注了@Mapper就会被自动扫描进来
    接下来找到:
  @Import(AutoConfiguredMapperScannerRegistrar.class)
  @ConditionalOnMissingBean({ MapperFactoryBean.class, MapperScannerConfigurer.class })
  public static class MapperScannerRegistrarNotFoundConfiguration implements InitializingBean {

@ConditionalOnMissingBean:当容器中没有MapperFactoryBean.class, MapperScannerConfigurer.class的时候会给容器中导入AutoConfiguredMapperScannerRegistrar.class自动导入接口的配置,点进去AutoConfiguredMapperScannerRegistrar:

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

会拿到AnnotationMetadata注解,会找到所有标注了@Mapper注解的接口,都认为是操作mybatis注解的接口。

配置mybatis的全局配置文件:

#mybatis的全局配置文件
mybatis:
#config-location: classpath:mybatis/mybatis-config.xml
#mybatis的SQL映射文件
  mapper-locations: classpath:mybatis/mapper/*.xml
#指定mybatis配置文件中的相关配置项
  configuration:
#开启驼峰命名自动映射
    map-underscore-to-camel-case: true

当在application.yaml中配置了mybatis的全局配置文件后,就不能在mybatis-config里配置了,检疫在application.yaml中配置

  • 导入mybatis官方starter
  • 编写mapper接口。标准@Mapper注解
  • 编写sql映射文件并绑定mapper接口
  • 在application.yaml中指定Mapper配置文件的位置,以及指定全局配置文件的信息 (建议;配置在mybatis.configuration)
    2.注解模式、混合模式
@Mapper
public interface CityMapper {
    @Select("select * from city where id=#{id}")
    public City getById(Long id);

    public void insert(City city);

}
  • 引入mybatis-starter
  • 配置application.yaml中,指定mapper-location位置即可
  • 编写Mapper接口并标注@Mapper注解
  • 简单方法直接注解方式
  • 复杂方法编写mapper.xml进行绑定映射
  • @MapperScan(“com.atguigu.admin.mapper”) 简化,其他的接口就可以不用标注@Mapper注解
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值