数据访问整合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注解