springboot之mybatis整合配置源碼過程分析
源碼分析
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();
//給創(chuàng)建的工廠設(shè)置數(shù)據(jù)源
factory.setDataSource(dataSource);
factory.setVfs(SpringBootVFS.class);
//判斷properties對(duì)象的屬性ConfigLocation值是否存在
//查看properties是MybatisProperties類的對(duì)象
/**
//根據(jù)上面的代碼,以及下面的代碼片段,可以看出來configLocation是設(shè)置MyBatis全局配置文件的路徑
//從下面代碼可以看出yml中設(shè)置的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;
}
*/
//此處標(biāo)記A
if (StringUtils.hasText(this.properties.getConfigLocation())) {
factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
}
//也是從MybatisProperties類的對(duì)象properties中獲取configuration配置的值
//如果yml中沒有配置mybatis.configuration值,則下面configuration獲取為null
//此處標(biāo)記B
Configuration configuration = this.properties.getConfiguration();
//如果yml中沒有配置configuration的值,并且configLocation也未配置時(shí),創(chuàng)建一個(gè)空的configuration對(duì)象
if (configuration == null && !StringUtils.hasText(this.properties.getConfigLocation())) {
configuration = new Configuration();
}
//由于上一步創(chuàng)建了一個(gè)空的configuration對(duì)象,則configuration != null
//configurationCustomizers這個(gè)List<ConfigurationCustomizer>是否不為空
//滿足上面條件,則執(zhí)行下面方法
/**
public interface ConfigurationCustomizer {
//Customize the given a {@link Configuration} object.
//@param configuration the configuration object to customize
void customize(Configuration configuration);
}
*/
//此處標(biāo)記C
if (configuration != null && !CollectionUtils.isEmpty(this.configurationCustomizers)) {
for (ConfigurationCustomizer customizer : this.configurationCustomizers) {
customizer.customize(configuration);
}
}
//給工廠設(shè)置配置信息
factory.setConfiguration(configuration);
....................
}
3.實(shí)例
配置駝峰命名映射關(guān)系的方法
先找到控制駝峰命名的屬性:
由下面代碼可以看出:
控制駝峰命名的屬性是在MybatisProperties類下的configuration對(duì)象中的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源碼片段分析:
標(biāo)記A處如果在yml中設(shè)置了mybatis.config-location值,直接從mybatis的全局配置文件中取
mybatis: config-location: classpath:mybatis-config.xml
以及根據(jù)上面找到的控制駝峰命名的屬性位置,則可在mybatis全局配置文件進(jìn)行如下賦值
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"></setting>
</settings>
</configuration>
方法二:
標(biāo)記A處未設(shè)置mybatis.config-location值,
則標(biāo)記B處直接從MybatisProperties類下的configuration對(duì)象獲取配置信息,這也就是直接通過yml配置
mybatis:
configuration:
mapUnderscoreToCamelCase: true
方法三:
上面兩種方法較為常見,最后一種方法:
當(dāng)沒有設(shè)置mybatis.config-location,也沒有在yml中配置mybatis.configuration時(shí),我們可以看出,
在標(biāo)記B處,會(huì)走進(jìn)if方法,創(chuàng)建一個(gè)空的configuration對(duì)象
而在標(biāo)記C處,只要保證集合List不為空,也是能實(shí)現(xiàn)configuration的設(shè)值
從源碼看出,ConfigurationCustomizer為一個(gè)接口,其customize方法的入?yún)⑹莄onfiguration
那我們可以自己實(shí)現(xiàn)其方法,對(duì)configuration進(jìn)行賦值
@Component
public class MyConfigurationCustomizer implements ConfigurationCustomizer {
@Override
public void customize(Configuration configuration) {
configuration.setMapUnderscoreToCamelCase(true);
}
}
注意:實(shí)現(xiàn)其方法后,要將實(shí)現(xiàn)類注入到IOC容器中,這樣spring才會(huì)將這些對(duì)象放入到List
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot?+?Druid?+?MyBatis?Plus整合配置實(shí)現(xiàn)
- SpringBoot 整合MyBatis、Junit5的實(shí)踐過程
- SpringBoot和MyBatis環(huán)境下實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換過程
- SpringBoot+MyBatis報(bào)錯(cuò):Invalid bean definition的原因排查與解決
- SpringBoot+MyBatis Plus實(shí)現(xiàn)用戶登錄認(rèn)證
- SpringBoot中的Ajax和MyBatis究竟是什么
- springboot+mybatis按條件分頁查詢多張表的項(xiàng)目實(shí)踐
相關(guān)文章
java 實(shí)現(xiàn)微信服務(wù)器下載圖片到自己服務(wù)器
這篇文章主要介紹了 java 實(shí)現(xiàn)微信服務(wù)器下載圖片到自己服務(wù)器的相關(guān)資料,需要的朋友可以參考下2017-05-05
Java編程之如何通過JSP實(shí)現(xiàn)頭像自定義上傳
之前做這個(gè)頭像上傳功能還是花了好多時(shí)間的,今天我將我的代碼分享給大家,下面這篇文章主要給大家介紹了關(guān)于Java編程之如何通過JSP實(shí)現(xiàn)頭像自定義上傳的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
Java try catch finally異常處理組合詳解
這篇文章主要介紹了Java try catch finally異常處理組合詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Java時(shí)間處理第三方包Joda?Time使用詳解
這篇文章主要為大家介紹了Java時(shí)間處理第三方包Joda?Time使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
spring cloud alibaba Nacos 注冊(cè)中心搭建過程詳解
這篇文章主要介紹了spring cloud alibaba Nacos 注冊(cè)中心搭建過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Java中List.contains(Object?object)方法使用
本文主要介紹了Java中List.contains(Object?object)方法,使用List.contains(Object?object)方法判斷ArrayList是否包含一個(gè)元素對(duì)象,感興趣的可以了解一下2022-04-04
selenium高效應(yīng)對(duì)Web頁面元素刷新的實(shí)例講解
今天小編就為大家分享一篇selenium高效應(yīng)對(duì)Web頁面元素刷新的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Mybatis-plus foreach拼接字符串查詢無數(shù)據(jù)返回問題
這篇文章主要介紹了Mybatis-plus foreach拼接字符串查詢無數(shù)據(jù)返回問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03

