SpringBoot+MyBatis: databaseId的用法

2023-12-15 15:18:00

在真实的项目中可能存在同一个服务需要适配不同的数据库,但是不同数据库中对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语句,这样就能够实现同一套代码可以适配不同的数据库。

文章来源:https://blog.csdn.net/qq_39990869/article/details/135015013
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。