注册
MySQL项目适配达梦数据库工具
培训园地/ 文章详情 /

MySQL项目适配达梦数据库工具

贝多芬不出新歌了 2023/09/14 4697 3 1

mysql2dm-spring-boot-starter

项目地址:Gitee搜索mysql2dm-spring-boot-starter,作者Jackie Chan

介绍

用于基于MySQL的项目适配达梦数据库。

软件架构

基于Druid里提供的AST工具和Filter实现。在数据库连接层拦截, 上层无感知, 可以用mybatis、jpa甚至jdbcTemplate都可以拦截到。

Druid提供的AST开发简单、灵活、并且性能达到生产级别。

安装教程

前提

项目需要使用 druid-spring-boot-starter

是通过DruidDataSourceWrapper类注册Filter的, 如果不想使用druid-spring-boot-starter,
可以模仿DruidDataSourceWrapper自行注册Filter

安装

将本工程install到本地maven仓库后, 在待改造的项目引入pom即可

<dependency>
      <groupId>com.myth</groupId>
      <artifactId>mysql2dm-spring-boot-starter</artifactId>
      <version>1.0.0-SNAPSHOT</version>
</dependency>

使用说明

  1. 工具中会自动判断当前数据库环境是否是达梦数据库, 是的时候才会拦截修改

扩展说明

若发现有新的语法需要适配, 可以在DmSupportVisitor类里添加

详细文档

已支持功能

`替换为"

说明

  • MySQL用`包裹关键字,而达梦中用的是"
  • MySQL和达梦关键字集并不一样,遇到的时候加上`即可
  • 目前支持
  1. 数据库名、表名和列名
  2. 表别名和列别名
  3. 属性名, 形如 tab1.col1、schema1.tab1, col1、tab1即属性名

GROUP_CONCAT转LISTAGG

说明

仅支持一个参数的情况, 例如GROUP_CONCAT(col1, col2)是不支持的, 但是可以修改sql改成GROUP_CONCAT(CONCAT(col1, '_', col2))

IF转CASE WHEN

** 说明

达梦IF中类型校验严格, 需要转换写法

CONVERT转CAST

说明

达梦不支持前者

json_unquote转TRIM

说明

达梦不支持前者

st_contains转dmgeo.ST_CONTAINS

说明

达梦不支持前者

st_distance_sphere转dmgeo.ST_Distance

说明

达梦不支持前者

POINT转dmgeo.ST_GeomFromText(CONCAT('POINT(',arg0,arg1,)'))

说明

达梦不支持前者

geometry_from_text转dmgeo.ST_GeomFromText

说明

达梦不支持前者

boolean转0/1

说明

达梦类型校验严格, 并且不支持boolean类型

除法分母为0校验

说明

需要在数据库中添加函数

CREATE FUNCTION FUNC_OP_MY_DIVIDE( C1 IN NUMBER,
                                   C2 IN NUMBER )
    RETURN NUMBER AS
    BEGIN
        RETURN
        CASE
        WHEN C1 is null then
            null
        when C2 is null or C2 = 0 then
            null
        else
            C1/C2
        END;
    END;
/

bit/int等去除长度

说明

DDL

JSON操作符->替换为JSON_EXTRACT

说明

JSON操作符->>替换为JSON_VALUE

说明

b'0/1'替换为'0/1'

说明

INTERVAL expr unit中expr转字符

说明

expr若是非数字或字符串等特殊表达式, 将会得到错误的形式

date_format格式处理

说明

达梦一个schema下索引名不能重复

说明

创建索引时, 将索引名改为表名_索引名

已知不支持的功能

is [not] val[非null]

说明

例如 col1 is false、col1 is not 0

str_to_date函数

说明

代码中去掉,由数据库自动转换

case when中条件表达式作为where条件或者if条件或者select列等

说明

不支持的写法

  • where case when t>0 then a>0 else b>0 end
  • if(case when t>0 then a>0 else b>0 end,1,0)
  • select case when t>0 then a>0 else b>0 end

换写法

例如 where case when t>0 then a>0 else b>0 end可以改成where case when t>0 then a else b end >0
或者改成where ((t>0 and a>0) or b>0)

information_schema、show tables、show index等不支持

说明

使用DataSourceUtil替换

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服