Springboot整合mybatis實現多資料來源所遇到的問題
專案場景:
在專案中需要從多個資料庫中取資料時就需要配置多個資料來源,我們可以通過jdbcTemplate來完成,但是需要將查詢的sql顯示在程式碼中,為了實現對以往程式碼結構不產生影響,所以使用了Springboot整合mybatis實現多資料來源。
問題描述:
配置好以後我出現的第一個問題就是在啟動的時候報錯,說找不到mapper1路徑下的xml檔案,因為沒有建立。然後我看專案中真的有啊。報錯資訊如下:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/rmp/config/DatabaseConfig.class]: Invocation of init method failed; nested exception is org.springframework.core.NestedIOException: Failed to parse mapping resource: 'class path resource [classpath*:/mapper/mapper1/*.xml]'; nested exception is java.io.FileNotFoundException: class path resource [classpath*:/mapper/mapper1/*.xml] cannot be opened because it does not exist
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:860) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878) ~[spring-context-5.2.3.RELEASE.jar:5.2.3.RELEASE]
原因分析:
然而我的專案中明明有這個路徑和xml檔案,根據錯誤找到配置mapper檔案路徑的地方。重點在給設定SqlSessionFactory配置mapper路徑那裡。
/** 建立SessionFactory */
@Primary
@Bean(name = "ds1SqlSessionFactory")
public SqlSessionFactory ds1SqlSessionFactory(@Qualifier("ds1DataSource") DataSource dataSource) throws Exception {
SqlSessionFactory bean = new SqlSessionFactory ();
bean.setDataSource(dataSource);
//設定mapper路徑
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResource(classpath*:mapper/mapper1/*.xml));
return bean.getObject();
}
解決方案:
為SqlSessionFactory設定mapper路徑時將getResources()寫成了getResource()。少寫了一個s。所以以此總結出能複製還是不要自己敲了的真理。
//獲取所有類路徑下的指定檔案
getResources()
//表示從當前類的根路徑去查詢資源,能獲取到同一個包下的檔案
getResource()
問題二:
從資料庫查詢到的值create_time獲取不到值,其餘資料均可以拿到值,剛開始以為是日期型別的問題,後來發現是配置多資料來源之後之前在properties路徑下的mybatis配置的資料庫與實體類的駝峰對映失效:
解決方案:
在設定多資料來源的配置檔案中的SqlSessionFactory中新增如下配置
@Primary
@Bean(name = "ds1SqlSessionFactory")
public SqlSessionFactory ds1SqlSessionFactory(@Qualifier("ds1DataSource") DataSource dataSource) throws Exception {
SqlSessionFactory bean = new SqlSessionFactory ();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));
//設定駝峰對映
bean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
return bean.getObject();
}
問題三:
之前使用到的mybatis-plus中mapper中的通用方法都失效了,查詢不到baseMapper中的方法,僅自己寫的方法有效,報錯如下:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.rmp.mapper.mapper1.TaskPlanMapper.selectPage
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235) ~[mybatis-3.5.5.jar:3.5.5]
at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:53) ~[mybatis-3.5.5.jar:3.5.5]
解決方法:
由於使用的mybatis中的原生SqlSessionFactory,所以Mybatis-plus中的方法都沒有被載入,僅需將SqlSessionFactory替換成MybatisSqlSessionFactoryBean即可成功使用
@Primary
@Bean(name = "ds1SqlSessionFactory")
public SqlSessionFactory ds1SqlSessionFactory(@Qualifier("ds1DataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));
//設定駝峰對映
bean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
return bean.getObject();
}
問題四:
使用mybatis-plus的分頁外掛發現獲取結果集有資料,但是總條數的getTotal()方法始終為0
解決辦法
/** 配置分頁外掛 */
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor page = new PaginationInterceptor();
page.setDialectType("mysql");
return page;
}
相關文章
- SpringBoot整合MyBatis-Plus實現多資料來源操作Spring BootMyBatis
- SpringBoot 整合多資料來源(MyBatis + Druid)Spring BootMyBatisUI
- springboot_mybatis_pageHelper所遇到的問題點Spring BootMyBatis
- SpringBoot 配置多資料來源 MyBatisSpring BootMyBatis
- SpirngBoot整合Mybatis Plus多資料來源bootMyBatis
- Springboot通過AOP整合多資料來源,分析@Transaction切換資料來源不生效問題Spring Boot
- 基於註解的springboot+mybatis的多資料來源元件的實現Spring BootMyBatis元件
- SpringBoot+Mybatis+ Druid+PageHelper 實現多資料來源並分頁Spring BootMyBatisUI
- springboot+druid+mybatis plus的多資料來源配置Spring BootUIMyBatis
- Springboot 配置多資料來源Mybatis的UnderScore不生效Spring BootMyBatis
- SpringBoot資料訪問(一) SpringBoot整合MybatisSpring BootMyBatis
- springboot 多資料來源,最簡單的整合方式Spring Boot
- SpringBoot整合mybatis出現時區問題Spring BootMyBatis
- MyBatis整合雙資料來源MyBatis
- Spring Boot 入門系列(二十三)整合Mybatis,實現多資料來源配置!Spring BootMyBatis
- springboot liquibase整合mysql與clickhouse多資料來源Spring BootUIMySql
- Springboot 多資料來源配置,結合tk-mybatisSpring BootMyBatis
- SpringBoot整合Druid資料來源Spring BootUI
- SpringBoot多資料來源Spring Boot
- springboot 2 Hikari 多資料來源配置問題(dataSourceClassName or jdbcUrl is required)Spring BootJDBCUI
- MyBatis配置多資料來源MyBatis
- SpringBoot 的多資料來源配置Spring Boot
- 全程解析,MyBatis在SpringBoot中的動態多資料來源配置MyBatisSpring Boot
- 基於SpirngBoot2.0+ 的 SpringBoot+Mybatis 多資料來源配置Spring BootMyBatis
- springboot整合Druid資料來源[springboot8]Spring BootUI
- Druid資料來源使用(一)---單獨使用與整合springboot+mybatisUISpring BootMyBatis
- SpringBoot配置多資料來源Spring Boot
- springBoot 多資料來源配置Spring Boot
- springboot多資料來源配置Spring Boot
- sqlhelper整合dynamic多資料來源的分頁問題(非教學向)SQL
- mybatis多資料來源踩坑,資料庫連線經常斷開問題MyBatis資料庫
- Spring Boot + Mybatis 多資料來源配置實現讀寫分離Spring BootMyBatis
- SpringBoot2 整合JTA元件,多資料來源事務管理Spring Boot元件
- springboot+mybatisplus+druid資料來源:SQLException問題Spring BootMyBatisUISQLException
- SpringBoot資料訪問之整合Mybatis配置檔案Spring BootMyBatis
- SpringBoot資料訪問之整合mybatis註解版Spring BootMyBatis
- SpringBoot 2.X 整合 RocketMQ遇到的問題2Spring BootMQ
- 實現多資料來源事務