一、源码分析
1.添加依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
2.源码
查看mybatis的配置MybatisAutoConfiguration源码,部分源码如下:
@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
//给创建的工厂设置数据源
factory.setDataSource(dataSource);
factory.setVfs(SpringBootVFS.class);
//判断properties对象的属性ConfigLocation值是否存在
//查看properties是MybatisProperties类的对象
/**
//根据上面的代码,以及下面的代码片段,可以看出来configLocation是设置MyBatis全局配置文件的路径
//从下面代码可以看出yml中设置的key值为:mybatis.config-location
@ConfigurationProperties(prefix = MybatisProperties.MYBATIS_PREFIX)
public class MybatisProperties {
public static final String MYBATIS_PREFIX = "mybatis";
//Location of MyBatis xml config file.
private String configLocation;
}
*/
//此处标记A
if (StringUtils.hasText(this.properties.getConfigLocation())) {
factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
}
//也是从MybatisProperties类的对象properties中获取configuration配置的值
//如果yml中没有配置mybatis.configuration值,则下面configuration获取为null
//此处标记B
Configuration configuration = this.properties.getConfiguration();
//如果yml中没有配置configuration的值,并且configLocation也未配置时,创建一个空的configuration对象
if (configuration == null && !StringUtils.hasText(this.properties.getConfigLocation())) {
configuration = new Configuration();
}
//由于上一步创建了一个空的configuration对象,则configuration != null
//configurationCustomizers这个List<ConfigurationCustomizer>是否不为空
//满足上面条件,则执行下面方法
/**
public interface ConfigurationCustomizer {
//Customize the given a {@link Configuration} object.
//@param configuration the configuration object to customize
void customize(Configuration configuration);
}
*/
//此处标记C
if (configuration != null && !CollectionUtils.isEmpty(this.configurationCustomizers)) {
for (ConfigurationCustomizer customizer : this.configurationCustomizers) {
customizer.customize(configuration);
}
}
//给工厂设置配置信息
factory.setConfiguration(configuration);
....................
}
3.实例
配置驼峰命名映射关系的方法
先找到控制驼峰命名的属性:
由下面代码可以看出:
控制驼峰命名的属性是在MybatisProperties类下的configuration对象中的mapUnderscoreToCamelCase属性
@ConfigurationProperties(prefix = MybatisProperties.MYBATIS_PREFIX)
public class MybatisProperties {
public static final String MYBATIS_PREFIX = "mybatis";
/**
* A Configuration object for customize default settings. If {@link #configLocation}
* is specified, this property is not used.
*/
@NestedConfigurationProperty
private Configuration configuration;
.........
}
public class Configuration {
protected Environment environment;
protected boolean safeRowBoundsEnabled;
protected boolean safeResultHandlerEnabled = true;
//控制是否开启驼峰命名
protected boolean mapUnderscoreToCamelCase;
..........
}
- 方法一
从上面MybatisAutoConfiguration源码片段分析:
标记A处如果在yml中设置了mybatis.config-location值,直接从mybatis的全局配置文件中取
mybatis:
config-location: classpath:mybatis-config.xml
以及根据上面找到的控制驼峰命名的属性位置,则可在mybatis全局配置文件进行如下赋值
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"></setting>
</settings>
</configuration>
- 方法二
标记A处未设置mybatis.config-location值,
则标记B处直接从MybatisProperties类下的configuration对象获取配置信息,这也就是直接通过yml配置
mybatis:
configuration:
mapUnderscoreToCamelCase: true
- 方法三
上面两种方法较为常见,最后一种方法:
当没有设置mybatis.config-location,也没有在yml中配置mybatis.configuration时,我们可以看出,
在标记B处,会走进if方法,创建一个空的configuration对象
而在标记C处,只要保证集合List不为空,也是能实现configuration的设值
从源码看出,ConfigurationCustomizer为一个接口,其customize方法的入参是configuration
那我们可以自己实现其方法,对configuration进行赋值
@Component
public class MyConfigurationCustomizer implements ConfigurationCustomizer {
@Override
public void customize(Configuration configuration) {
configuration.setMapUnderscoreToCamelCase(true);
}
}
注意:实现其方法后,要将实现类注入到IOC容器中,这样spring才会将这些对象放入到List