Springboot整合mybatis實現多資料來源所遇到的問題

yang_56發表於2020-11-15

專案場景:

在專案中需要從多個資料庫中取資料時就需要配置多個資料來源,我們可以通過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;
    }

相關文章