springboot之mybatis整合配置源码过程分析

 更新时间:2025年11月03日 08:47:10   作者:0和1搭建网络世界  
文章介绍了如何在MyBatis中进行源码分析,特别是关于如何配置驼峰命名映射关系,文章详细解释了三种配置方法,包括使用`mybatis.config-location`、直接在`yml`文件中配置以及通过实现`ConfigurationCustomizer`接口进行自定义配置

源码分析

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java 实现微信服务器下载图片到自己服务器

    java 实现微信服务器下载图片到自己服务器

    这篇文章主要介绍了 java 实现微信服务器下载图片到自己服务器的相关资料,需要的朋友可以参考下
    2017-05-05
  • java字符串的大写字母右移实现方法

    java字符串的大写字母右移实现方法

    下面小编就为大家带来一篇java字符串的大写字母右移实现方法。小编觉得听不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Java编程之如何通过JSP实现头像自定义上传

    Java编程之如何通过JSP实现头像自定义上传

    之前做这个头像上传功能还是花了好多时间的,今天我将我的代码分享给大家,下面这篇文章主要给大家介绍了关于Java编程之如何通过JSP实现头像自定义上传的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Java try catch finally异常处理组合详解

    Java try catch finally异常处理组合详解

    这篇文章主要介绍了Java try catch finally异常处理组合详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java 字符串截取及常见场景与方法详解

    Java 字符串截取及常见场景与方法详解

    在 Java 开发中,截取字符串是一个非常常见的操作,无论是获取文件名还是提取某些特定内容,本文详细介绍了截取字符串最后一位及其他常见截取操作的多种方法,帮助开发者快速上手,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • Java时间处理第三方包Joda Time使用详解

    Java时间处理第三方包Joda Time使用详解

    这篇文章主要为大家介绍了Java时间处理第三方包Joda Time使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • spring cloud alibaba Nacos 注册中心搭建过程详解

    spring cloud alibaba Nacos 注册中心搭建过程详解

    这篇文章主要介绍了spring cloud alibaba Nacos 注册中心搭建过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java中List.contains(Object object)方法使用

    Java中List.contains(Object object)方法使用

    本文主要介绍了Java中List.contains(Object object)方法,使用List.contains(Object object)方法判断ArrayList是否包含一个元素对象,感兴趣的可以了解一下
    2022-04-04
  • selenium高效应对Web页面元素刷新的实例讲解

    selenium高效应对Web页面元素刷新的实例讲解

    今天小编就为大家分享一篇selenium高效应对Web页面元素刷新的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Mybatis-plus foreach拼接字符串查询无数据返回问题

    Mybatis-plus foreach拼接字符串查询无数据返回问题

    这篇文章主要介绍了Mybatis-plus foreach拼接字符串查询无数据返回问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03

最新评论