数据库国产化——mybatis完成多数据源配置(兼容达梦、高斯)简记

文章目录

  • 问题简述
  • 解决步骤
    • 增加高斯数据库依赖
    • 配置多数据源配置
    • 查询高斯对应的dataId以及确认productName
      • 确认productName
      • 确认dataId
      • 增加数据源配置类添加多数据源配置映射
    • 编写兼容的同一个方法的不同sql
    • 测试
    • 代码优雅化
  • 参考文献

问题简述

最近开发遇到一个数据库国产化且兼容多数据源的问题,由于项目原本是使用Oracle实现,后来又用了达梦,现在为响应不同的情况,还需要兼容高斯。这使得我们不得不增加数据源配置去兼容各种情况。
经过商议我们最终需要得到这样一个效果,即根据不同的数据源找到对应的sql语句完成相同的查询效果。
由于笔者是第一次接触这个问题,故以此文章记录笔者推断排查问题的过程。

解决步骤

增加高斯数据库依赖

<!-- 高斯数据库驱动 -->
<dependency><groupId>gauss-jdbc</groupId><artifactId>gsjdbc4</artifactId><version>1.0.0.0</version>
</dependency>

配置多数据源配置

笔者参考多方解决方案,最终得到以下两个步骤

查询高斯对应的dataId以及确认productName

确认productName

由于笔者知道高斯的productName是多少,于是使用以下代码连接高斯数据库查看productName

@Testpublic void getDataBaseProductName() throws Exception {String driver = "org.postgresql.Driver";String url = "jdbc:xx://xxxxxxx";String username = "xx";String password = "xx";Class.forName(driver);Connection con = (Connection) DriverManager.getConnection(url,username,password);String dbVersion = con.getMetaData().getDatabaseProductVersion();DatabaseMetaData metaData = (DatabaseMetaData) con.getMetaData();System.out.println("数据库的产品名称:" + metaData.getDatabaseProductName()+"version "+dbVersion);

最后输出结果为PostgreSQL

确认dataId

这里笔者通过 mybatis dataId搜索查询到了相关源码,通过debug找到以下片段得知高斯的dataId,具体源码可以去下述代码类中查看

org.apache.ibatis.builder.xml.XMLStatementBuilder 

在这里插入图片描述

增加数据源配置类添加多数据源配置映射

@Configuration
public class DataSourceConfig {@Bean@ConditionalOnMissingBeanpublic 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");databaseIdProvider.setProperties(properties);return databaseIdProvider;}}

编写兼容的同一个方法的不同sql

由于笔者不了解高斯和达梦语法的区别,故百度了查询语句得知达梦偏Oracle
高斯偏mysql,所以查找相关答案在数据库客户端中调试后,编写相关sql

<!-- 当数据库为达梦,下列sql起作用 -->
<insert id="" databaseId="dm" useGeneratedKeys="" keyProperty=""></insert>
<!-- 当数据库为高斯,下列sql起作用 -->
<insert id="xx" databaseId="postgre" useGeneratedKeys="xx" keyProperty="xx"></insert>

测试

配置好对应数据源的配置,这里笔者测试通过了,不多赘述

代码优雅化

我们完成上述任务后发现,两条相同id在idea中会报红,虽然无关痛痒,但不太优雅,于是我们就对此语法进行优雅化,得到如下方案

<!--兼容高斯、达梦--><select id="query" resultType="java.lang.Integer" ><if test="_databaseId == 'postgre'">SELECT COUNT(*)FROM INFORMATION_SCHEMA.TABLESWHERE TABLE_SCHEMA = 'xxxx'AND TABLE_NAME = 'xxxx'</if><if test="_databaseId == 'dm'">SELECT COUNT(1)FROM ALL_TABLESWHERE OWNER = 'xxx'AND TABLE_NAME = 'xxxxxx'</if></select>

参考文献

mybatis多数据库兼容改造
mybatis关于databaseid属性的配置

MyBatis 源码阅读之 databaseId


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部