0


SpringBoot日常:MySQL数据库与达梦适配

文章目录

简介

现有一个已经以mysql作为数据源的项目,由于需要适配一套信创环境,这里将达梦数据库选作关系型数据库,本文主要介绍如何从mysql适配到达梦。达梦官网地址

安装下载

安装包地址 https://eco.dameng.com/download/
在这里插入图片描述

连接配置

这里使用阿里的数据库链接池druid以及达梦提供的数据驱动包进行数据库连接

pom文件

<dependency><groupId>com.dameng</groupId><artifactId>dm-jdbc</artifactId><version>1.8</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.20</version></dependency>

application.yml配置

spring:datasource:type: com.alibaba.druid.pool.DruidDataSource
    druid:driver-class-name: dm.jdbc.driver.DmDriver
      url: jdbc:dm://127.0.0.1:35236/SBOM1?serverTimezone=Asia/Shanghai
      username: TECENT_VIDEO
      password: 12345678901QWER
      initial-size:10max-active:100min-idle:10max-wait:60000pool-prepared-statements:truemax-pool-prepared-statement-per-connection-size:20time-between-eviction-runs-millis:60000min-evictable-idle-time-millis:300000validation-query: SELECT 1 FROM DUAL
      test-while-idle:truetest-on-borrow:falsetest-on-return:falsefilter:stat:log-slow-sql:trueslow-sql-millis:1000merge-sql:falsewall:config:multi-statement-allow:true

代码适配

这里以mybatis为例,重新复制一份mapper文件到新目录,配置文件直接将sql方法的实现指向该新目录,接着将xml里面的sql按照达梦的语法方式适配,大多数情况是不需要改写的。

改写的方法可以参照本文注意事项中提到的事项点

注意事项

mysql适配达梦数据库时,有许多语法和函数需要我们去留意适配,本章内容总结了一些主要的问题处理方案,基本可以满足大家的适配需求,若有更多的问题,可以到达梦社区搜索->达梦社区

1、创建表结构语法

创建表的时候,不支持在列的后面直接加comment注释,使用

COMMENT ON IS 

代替,如下:

CREATETABLE role_biz_t
(
    account_id BIGINTNOTNULL,
    role_id    BIGINTNOTNULL,PRIMARYKEY(account_id, role_id)-- 在达梦数据库中,不需要指定USING BTREE,因为B树索引是默认的)STORAGE(INITIAL 64,NEXT64);COMMENTONTABLE role_biz_t IS'前台用户角色关系表';

2、索引名唯一问题

mysql中我们对索引的唯一性限制在某张表,但是达梦索引名字的唯一性是限制范围是整个模式,所以创建索引的时候最好加上表名来保证唯一性

CREATEINDEX idx_aa_code_create_user ON aa_code(create_user);CREATEUNIQUEINDEX idx_sca_lib_uk_license_id ON sca_lib("license_id");

3、新增字段

新增字段和创建表的时候,不支持在列的后面直接加comment注释,同样使用使用

COMMENT ON IS 

代替,如下:

ALTERTABLE test_item_t ADD service_name varchar(100)DEFAULTNULL;COMMENTONCOLUMN test_item_t.service_name IS'服务名称';

4、切换模式名

在mysql中我们常常用

USE database_name; 

来完成切换数据库,但是实际上达梦切换模式的语法不是这个。

解决方案:

-- TECENT_VIDEO是模式名 表示切换到该模式下,类似与mysql的切换库SETSCHEMA TECENT_VIDEO;

5、工具客户端更新数据

在一些常见的工具客户端执行插入或更新数据时,记得在末尾加上

commit; 

否则你会发现表中数据并没更新。

UPDATE sca_lib SET grade_a=-1WHERE grade_name='未知';commit;

6、group by语法

mysql group by后面可以填写查询后的结果别名,但是达梦必须得跟上原本的字段名
在这里插入图片描述
解决方案:

SELECT t1.developer as mydeveloper,t1.id as myid
FROM test t1
groupby t1.developer,t1.id

7、加解密函数替换

若原本mysql 用的是AES_DECRYPT(UNHEX(phone),密钥) ,则需要替换成达梦特有的加解密函数,如下

-- 插入一条数据INSERTINTO TASK (cust_id,cust_name,sex)VALUES(12225,
BINTOCHAR (
        UTL_ENCODE.BASE64_ENCODE (
            DBMS_CRYPTO.ENCRYPT(
                UTL_I18N.STRING_TO_RAW ('李四','UTF8'),
                DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5,
                UTL_I18N.STRING_TO_RAW ('2112122121212121222','UTF8')))),1);-- 模糊查询select*from TASK t  where 
UTL_I18N.RAW_TO_CHAR (
        DBMS_CRYPTO.DECRYPT (
            UTL_ENCODE.BASE64_DECODE (
            CHARTOBIN ( cust_name)),
            DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5,
            UTL_I18N.STRING_TO_RAW ('2112122121212121222','UTF8')),'UTF8')like'%李四%';

8、删除符号`

达梦sql不支持符号` 需要去掉,否则会报语法有误,处理的范围包括实体类、代码中的sql拼接以及xml文件
在这里插入图片描述
解决方案:

SELECT developer id FROM test

-- 或者SELECT developer id FROM"test"

9、separator分隔替换成LISTAGG函数

在这里插入图片描述
解决方案:

select LISTAGG(field_name ,',')as fieldName from sys_dict_detail_t 

10、函数now()替换成SYSDATE()

now()函数在达梦不存在,需要替换成SYSDATE()

INSERTINTO sys_job (create_time, update_time)VALUES( sysdate(), sysdate());

11、函数GROUP_CONCAT替换成wm_concat

在这里插入图片描述
解决方案:

SELECT wm_concat(app.id)as scaIds FROM  task app

12、函数STR_TO_DATE替换成TO_DATE

在这里插入图片描述
解决方案:

SELECT*FROM  task t
where(t.start_time between TRUNC(TO_DATE('2024-07-28','YYYY-MM-DD HH24:MI:SS'))and TRUNC(TO_DATE('2024-08-28','YYYY-MM-DD HH24:MI:SS'))+1)

13、函数替换 CURDATE()

解决方案:

DATE_FORMAT(create_time,'%Y-%m-%d')>= CURDATE()-INTERVAL1DAY 

替换成

DATE_FORMAT(create_time,'%Y-%m-%d')>= DATE_FORMAT(SYSDATE -1,'YYYY-MM-DD')

14、函数ANY_VALUE()替换成FIRST_VALUE

在这里插入图片描述
解决方案:

select FIRST_VALUE(id)as aid from sca_app_component_license   
groupby license_str

15、函数REGEXP()替换成REGEXP_LIKE

在这里插入图片描述
解决方案:

select*from task_fun_item_t where  REGEXP_LIKE(code_url,'^[0-9]+$');

16、函数 if 替换成COALESCE

在这里插入图片描述
解决方案:

SELECT
     t1.developer,COALESCE(t1.first_vul_json ==null, t1.last_vul_json, t1.first_vul_json)AS vul_json
FROM task_vul_repair_statistic_t t1

在这里插入图片描述

17、空值排序问题

达梦使用order by对存在空值的列项排序时,会出现升序空值在前,降序 空值在后,这个和我们平时在使用musql默认的排序规则不一致
在这里插入图片描述

解决方案:
登录sysdba用户修改,或者直接修改dm.ini 文件:将配置参数

ORDER_BY_NULLS_FLAG

修改为2
可以通过查询语句查询配置项目参数,如下

SELECT para_name,para_type,para_value FROM V$DM_INI WHERE PARA_NAME ='ORDER_BY_NULLS_FLAG';
ORDER_BY_NULLS_FLAG 参数说明
控制排序时 NULL 值返回的位置,取值 0、1、2。 
0 表示 NULL 值始终在最前面返回;
1 表示ASC 升序排序时 NULL 值在最后返回,DESC 降序排序时 NULL 值在最前面返回, 在参数等于 1的情况下,NULL 值的返回与 ORACLE 保持一致;
2 表示 ASC 升序排序时 NULL 值在最前面返回,DESC 降序排序时 NULL 值在最后返回, 在参数等于 2 的情况下,NULL 值的返回与MYSQL 保持一致

本文转载自: https://blog.csdn.net/qq_32590535/article/details/141634028
版权归原作者 码至终章 所有, 如有侵权,请联系我们删除。

“SpringBoot日常:MySQL数据库与达梦适配”的评论:

还没有评论