当在业务服务中需要支持多数据库时,虽然尽量使用标准sql,但还是难免出现多数据库不兼容的情况。例如对于达梦数据库在like时对于匹配字符串中的如果有通配符_或%需要转义改写为\_或\%,这在mysql、oracle、sql server都是没有问题的,但在达梦数据库中需要在之后加ESCAPE '\'才行。这时就需要能够知道当前连接的数据库是那种,如果是达梦数据库需要使用这种模式like #{var1} ESCAPE ‘\’
创建DatabaseIdProvider bean设置各数据库的别名
/**
* 自动识别使用的数据库类型,注意,此处的key为驱动自带的驱动名,不能更改,value可以更改
* 在mapper.xml中_databaseId的值就是跟这里对应
*/
@Bean
public DatabaseIdProvider databaseIdProvider() {
DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
Properties properties = new Properties();
//key为固有名字,更改后无法匹配,后面的value可以自定义
properties.setProperty("Oracle", "oracle");
properties.setProperty("MySQL", "mysql");
properties.setProperty("DB2", "db2");
properties.setProperty("Derby", "derby");
properties.setProperty("H2", "h2");
properties.setProperty("HSQL", "hsql");
properties.setProperty("Informix", "informix");
properties.setProperty("MS-SQL", "ms-sql");
properties.setProperty("PostgreSQL", "postgresql");
properties.setProperty("Sybase", "sybase");
properties.setProperty("Hana", "hana");
properties.setProperty("DM DBMS", "dm");
properties.setProperty("Microsoft SQL Server", "mss");
databaseIdProvider.setProperties(properties);
return databaseIdProvider;
}
- 属性配置的key是数据库的产品名,可以通过如下方式获取到
String databaseProductName = connection.getMetaData().getDatabaseProductName();
- 配置属性的value对应给数据库产品设置的别名。此别名的值对应到mybatis的内置参数_databaseId
在mapper.xml中判断当前连接的数据库使用特定sql
<if test="_databaseId == 'dm'">
AND rtt.table_name LIKE #{tableNameLike} ESCAPE '\'
</if>
<if test="_databaseId != 'dm'">
AND rtt.table_name LIKE #{tableNameLike}
</if>