开发者

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

开发者 https://www.devze.com 2025-11-05 11:31 出处:网络 作者: 0和1搭建网络世界
目录源码分析1.添加依赖2.源码3.实例总结源码分析 1.添加依赖 <dependency> <groupId>org.myBATis.spring.boot</groupId>
目录
  • 源码分析
    • 1.添加依赖
    • 2.源码
    • 3.实例
  • 总结

    源码分析

    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 = "mybawww.devze.comtis";
    	  
    	  //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(Configuratiojsn configuration);
      	
    	}
    	*/
    	//此处标记C
        if (configuration != null && !CollectionUtils.isEmpty(this.configurationCustomizers)) {
          for (ConfigurationCustomizer customizer : this.configurationCustomizers) {
            customizer.customize(configuration);
          }
        }
        //给工厂设置配置信息
        factory.setConf编程iguration(configuration);
       ...php.................
      }
    

    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 = truphpe;
      //控制是否开启驼峰命名
      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

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号