配置databaseid

databaseId 是用于项目中存在多种数据库 SQL 时区分同一条 SQL 对应的数据库。可以这样认为,在 Mybatis 中 SQL 的 id 和 databaseId 组合才是一条 SQL 的唯一标识。实际上 MyBatis 只会选择性加载指定 databaseId 的 SQL ,还有一些没有指定 databaseId 的 SQL。

databaseId配置说明
mybatis在进行mapper注入时,会出现3种情况
1.该sql的databaseId和当前数据源的databaseId一样。
2.该sql的databaseId和当前数据源的databaseId不一样。
3.该sql没有配置databaseId

当同一方法被找到多个sql时,会优先使用databaseId相同的sql, 如果没有databaseId相同的sql,再使用没有配置databaseId的sql,databaseId不对应的sql是不会被使用。

使用过程中的问题

然后我给其中一个sql添加了databaseid的配置,样例如下:

<sql id="selectTestVo"  databaseId="mysql">
       select *
   from sys_menu
   </sql>

结果在项目启动时却报错了,提示没有找到这个sql

Could not find SQL statement to include with refid 'com.system.mapper.selectTestVo'

根据上边的配置说明,由于给这个sql配置了databaseid,但是没有匹配上,即项目在启动时的databaseid应该不是mysql,或者是没有配置上。

那就需要给它加上配置,在yml文件中mybatis相关配置里加上

mybatis:
    configuration:
        database-id: mysql

找到mybatis的配置类,本项目中是MyBatisConfig.java,添加配置如下

 @Bean
    public DatabaseIdProvider databaseIdProvider() {
        VendorDatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
        Properties properties = new Properties();
        properties.setProperty("Oracle", "oracle");
        properties.setProperty("MySQL", "mysql");
        properties.setProperty("PostgreSQL", "postgre");
        properties.setProperty("DM DBMS", "dm");
        properties.setProperty("POLARDB Database Compatible with Oracle", "polardb");//key需要与数据库产品名称对应
        databaseIdProvider.setProperties(properties);
        return databaseIdProvider;
    }

然后修改sqlSessionFactory,增加DatabaseIdProvider的配置,如下

 @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource, DatabaseIdProvider databaseIdProvider) throws Exception
    {
        String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
        String mapperLocations = env.getProperty("mybatis.mapperLocations");
        String configLocation = env.getProperty("mybatis.configLocation");
        typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
        VFS.addImplClass(SpringBootVFS.class);

        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
        sessionFactory.setDatabaseIdProvider(databaseIdProvider);
        return sessionFactory.getObject();
    }

更多推荐