在真实的项目中可能存在同一个服务需要适配不同的数据库,但是不同数据库中对sql的写法不一样,就比如一个简单的结果拼接函数来说,达梦数据库中拼接函数是WM_CONCAT,mysql数据库中拼接函数是GROUP_CONCAT,而人大金仓和pgsql的拼接函数为array_agg,应对这样的情况我们需要想一个办法能够在一个sql中进行适配。所以就需要用到databaseId,用这个来判断不同的数据库执行属于自己的sql语句。
首先需要创建一个配置类:
import org.apache.ibatis.mapping.DatabaseIdProvider;
import org.apache.ibatis.mapping.VendorDatabaseIdProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;
@Configuration
public class MultiplyDataBaseConfig {
/**
* 根据数据库厂商名称配置数据库的dataid
* @return
*/
@Bean
public DatabaseIdProvider databaseIdProvider() {
VendorDatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
Properties properties = new Properties();
properties.put("KingbaseES","kingbase");
properties.put("MySQL","mysql");
properties.put("PostgreSQL","kingbase");
properties.put("DM DBMS","dm");
databaseIdProvider.setProperties(properties);
return databaseIdProvider;
}
}
上面的代码就是定义根据不同的数据库定义属于自己的标识,这样就可以在sql中进行判断。
sql中的使用如下:
<if test="_databaseId=='dm'">
WM_CONCAT(distinct client_name ) as clientName
</if>
<if test="_databaseId=='mysql'">
GROUP_CONCAT(distinct client_name ) as clientName
</if>
<if test="_databaseId=='kingbase'">
array_to_string(array_agg(distinct client_name), ',') as clientName
</if>
上面只是一个例子,这个判断可以写在sql语句的任意位置,这样就可以根据不同的数据库执行不同的sql语句,这样就能够实现同一套代码可以适配不同的数据库。