![cover](https://img-blog.csdnimg.cn/img_convert/1f20816e15694cf3b56262c1f87e2a14.png)
mybatis多数据库兼容改造
##配置databaseiddatabaseId 是用于项目中存在多种数据库 SQL 时区分同一条 SQL 对应的数据库。可以这样认为,在 Mybatis 中 SQL 的 id 和 databaseId 组合才是一条 SQL 的唯一标识。实际上 MyBatis 只会选择性加载指定 databaseId 的 SQL ,还有一些没有指定 databaseId 的 SQL。这里说的有点不是很准确,我们来
配置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();
}
更多推荐
所有评论(0)