适配不同数据库厂商方案

背景

在对国产化数据有要求的时候,我们会做对 达梦、海量等数据库的配置。

有些SQL 以前没有写成标准SQL;

那么适配的时候怎么办呢?改成标准SQL。

如果不好改呢?比如SQL比较复杂等,需要判断 当前是哪个厂商的数据库,执行哪个厂商认识的SQL。

发现

发现mybatis已经支持 识别不同数据库厂商 mybatis文档

步骤一:配置dataBaseID

mybatis可以通过 databaseId识别数据库厂商,那么怎么配置呢?

方案一

使用mybatis的配置

XML 复制代码
mybatis:
  configuration:
    database-id: dm

方案二

声明 databaseIdProvider。给每个厂商重命名。

java 复制代码
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;

/**
 * @author: dong
 * @date: 2024/6/15
 * @Description:
 */
@Configuration
public class MyBatisConfig {
	@Bean
	public DatabaseIdProvider databaseIdProvider() {
		VendorDatabaseIdProvider provider = new VendorDatabaseIdProvider();
		Properties props = new Properties();
		props.setProperty("Oracle", "oracle");
		props.setProperty("MySQL", "mysql");
		props.setProperty("PostgreSQL", "postgresql");
		props.setProperty("DB2", "db2");
		props.setProperty("SQL Server", "sqlserver");
		props.setProperty("DM DBMS", "dm");
		provider.setProperties(props);
		return provider;
	}
}

系统不能自己读吗?

如果不声明 databaseIdProvider,就不进行databaseId的配置了

步骤二:xml写不同数据库厂商的实现SQL

使用相同的id,不同的databaseId

不用区分的厂商:不用写databaseId

需要区分:databaseId='厂商简写'(方案二 DatabaseIdProvider 中配置的简写)

XML 复制代码
<!-- 对接Oracle的时候 -->
<select id="dmtest" databaseId="Oracle" resultType="map">
        select 'oracle' from dual
</select>
<!-- 可以通用的时候 -->
<select id="dmtest" resultType="map">
    select 'default' from dual
</select>
<!-- 对接达梦的时候 -->
<select id="dmtest" databaseId="dm" resultType="map">
    select 'dm' from dual
</select>

直接使用databaseId判断

如果某个SQL语句,只有一个条件不能通用,可以使用if语句判断_databaseId 参数

XML 复制代码
    <select id="dmtest"  resultType="map">
        <if test="_databaseId=='oracle'" >
            select 'oracle1' from dual
        </if>
        <if test="_databaseId==null or _databaseId=='' " >
            select 'default1' from dual
        </if>
        <if test="_databaseId=='dm'" >
            select 'dm1' from dual
        </if>
        <if test="_databaseId=='d23'" >
            select 'd231' from dual
        </if>
    </select>

源码

实现获取 不同厂商名字的源码,在文件 DatabaseIdProvider 中

相关推荐
凡人叶枫2 分钟前
Effective C++ 条款40:明智而审慎地使用多重继承
java·数据库·c++·嵌入式开发·effective c++
至此流年莫相忘17 分钟前
Spring 依赖注入三剑客:@Autowired、@Resource 与 @RequiredArgsConstructor 深度对比与实战指南
java·数据库·spring
Rain50918 分钟前
2.2 数据基础:数据库集成与 ORM(TypeORM / Prisma)
数据库·人工智能·ai·数据分析·node.js·自动化·ai编程
杨云龙UP29 分钟前
Oracle/ODA RAC /u01 空间告警处理指南:grid 用户监听日志清理_2026-06-15
linux·数据库·oracle·oracle linux·oda·监听日志·在线清理
IT新视界36 分钟前
从多平台割裂到湖仓集一体,星环科技ArgoDB助力金融机构迈向实时智能
数据库·科技
master33638 分钟前
达梦数据库常用语句示例
数据库·达梦
Elastic 中国社区官方博客41 分钟前
Elasticsearch:使用向量搜索构建现代应用的最佳实践
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
Volunteer Technology1 小时前
Flink状态管理与容错(一)
大数据·数据库·flink
CIO_Alliance1 小时前
(企业AI化转型)选对iPaaS系统集成厂家是制造业数字化转型的生死线
大数据·数据库·人工智能·企业数字化转型·ipaas·系统集成
南部余额1 小时前
Canal解决MySQL与Redis数据一致性问题
数据库·redis·mysql·canal·数据·数据同步