一、源码分析

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