基于MySQL项目适配达梦数据库工具
这是个人根据公司达梦适配改造经验封装的一个starter
原理
基于Druid里提供的AST工具和Filter实现。在数据库连接层拦截, 上层无感知, 可以用mybatis、jpa甚至jdbcTemplate都可以拦截到。
Druid提供的AST开发简单、灵活、并且性能达到生产级别。
项目地址
已支持的功能
`替换为"
说明
- MySQL用`包裹关键字,而达梦中用的是"
- MySQL和达梦关键字集并不一样,遇到的时候加上`即可
- 目前支持
- 数据库名、表名和列名
- 表别名和列别名
- 属性名, 形如 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格式处理
说明
已知不支持的功能
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)