目录
一、数据库迁移
1.1Mysql、Oracle迁移OpenGauss
1.1.1使用navicat链接openGauss数据库
二、通用流程改造
2.1、application.yml的设置
2.1.1JDBC链接
2.1.2activiti的配置
2.2、databaseIdProvider多数据库配置
2.2.1得到OpenGauss数据库的ProductName
2.2.2增加数据源配置类添加多数据源配置映射
2.2.3Mysql语句转OpenGauss
1.1.1使用navicat链接openGauss数据库
1.1.1选择postgresql
OpenGauss可以使用Postgresql的驱动,所以直接选择PostgreSQL就可以。
前提条件:已经建好OpenGauss的初始数据库、模式
1.1.2输入连接信息
点击菜单栏工具-数据传输
选择源为mysql或Oracle
一直下一步即可。
由于迁移后的表中所有字段没有默认值,需要对比Mysql数据库手动添加默认值。
二、通用流程改造
2.1、application.yml的设置
2.1.1JDBC链接
OpenGauss是基于postgresql开发的,可以使用org.postgresql.Driver也可以使用org.opengauss.Driver。
要注意schema的设置
url: jdbc:postgresql://127.0.0.1:5432/数据库名?currentSchema=模式名 |
spring: datasource: username: fy passWord: ***** url: jdbc:postgresql://XXXXX:5432/fy?currentSchema=fy driver-class-name: org.postgresql.Driver hikari: connection-timeout: 30000 idle-timeout: 60000 max-lifetime: 1800000 minimum-idle: 2 maximum-pool-size: 5
2.1.2activiti的配置
要注意的是database-schema的设置
database-schema: 模式名
spring: activiti: db-history-used: true #使用历史表,如果不配置,则工程启动后可以检查数据库,只建立了17张表,历史表没有建立 history-level: full #记录全部历史操作 #自动建表 # flase: 默认值。activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常。 # true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建。 # create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)。 # drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎 check-process-definitions: false # 自动部署验证设置:true-开启(默认)、false-关闭 在resource目录下添加processes文件夹,并且文件夹不能为空 # main: # allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册 database-schema: fyjr_sunam #置建表策略,如果没有表,自动创建表 修改这个地方为大写
2.2、databaseIdProvider多数据库配置
2.2.1得到OpenGauss数据库的ProductName
通过下放代码可以得到OpenGauss数据库的ProductName为:PostgreSQL
@Test public void getDataBaseProductName() throws Exception { String driver = "org.opengauss.Driver"; String url = "jdbc:opengauss://XXXX:5432/fy?currentSchema=fy"; String username = "fy"; String password = ""; 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); }
2.2.2增加数据源配置类添加多数据源配置映射
得到opengauss的ProductName后将p.setProperty("PostgreSQL", "opengauss");加到配置中。
其中:
p.setProperty("PostgreSQL", "**");**随便写,**用于xxxMapper.xml中指定databaseId="**",ProductName为PostgreSQL |
@Configuration@EnableTransactionManagement@MapperScan({ "com.zzz.yyy.mapper", "com.zzz.yyy.mapper.extend" })public class mybatisConfig { @Bean public DatabaseIdProvider getDatabaseIdProvider() { DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider(); Properties p = new Properties(); p.setProperty("MySQL", "mysql"); p.setProperty("Oracle", "oracle"); p.setProperty("PostgreSQL", "opengauss"); p.setProperty("TiDB", "tidb"); p.setProperty("DB2", "db2"); p.setProperty("SQL Server", "sqlserver"); databaseIdProvider.setProperties(p); return databaseIdProvider; }}
2.2.3Mysql语句转OpenGauss
替换步骤:
-
在 xxxMapper.xml 中将所有sql语句上加入 databaseId="mysql"
-
复制一份mysql的sql(即 将替换的opengauss语句)
-
在复制的sql上加入databaseId="opengauss"
-
找出mysql与opengauss语句区别,然后替换sql
凡是PostgreSQL的东西openGauss都兼容。而openGauss扩展了部分语法类似Oracle 的,反过来PostgreSQL无法用。所以为了统一和简化,都使用PostgreSQL的标准。
-
大小写
-
PostgreSQL的数据库内核对大小写敏感。数据库名,数据表名,列名区分大小写。
-
在PostgreSQL中,执行SQL语句时,在不加双引号的情况下,会把所有表示关键字,库名,表名,列名的字符串转换成小写。所以又说PostgreSQL不区分大小写的。
-
在书写SQL时,为了便于理解,默认:关键字大写,表名首字母大写,列名全部小写。
-
分页
-
如果从第一条开始取记录 , PostgreSQL与mysql都支持 select * from tb limit A;
-
当从至少第二条数据取记录时 , PostgreSQL仅支持 limit A offset B , 而 mysql 除了支持 pg 的分页之外 , 还支持 limit B,A
-
日期转字符串
-
Oracle : To_Char(DATE,'YYYY-MM-DD')
-
PostgreSQL : To_Char(DATE,'YYYY-MM-DD'),同上
-
MySQL : date_fORMat(DATE,'%Y-%m-%d')
-
字符串拼接
-
Oracle : Field1 || '_' || Field2 || '_' ||...,也可以用CONCAT()
-
PostgreSQL : Field1 || '_' || Field2 || '_' ||...,也可以用CONCAT(),同上
-
MySQL : CONCAT(Field1,'_',Field2,'_',...)
-
字符串转日期
-
Oracle : select to_date('2022-06-01 23:45:59','yyyy-mm-dd hh24:mi:ss') from dual
-
PostgreSQL : select to_timestamp('2022-06-01 23:45:59','yyyy-mm-dd hh24:mi:ss')
-
MySQL : select str_to_date('2022-06-01 23:45:59','%Y-%m-%d %T')
-
PostgreSQL和OpenGauss中不能使用“ ` ”符号
以下代码自行修改
package com.zzz.yyy;import org.apache.commons.lang3.StringUtils;import org.junit.Test;import java.io.*;import java.util.*;public class MySQLToOracleTest { private final static String ORACLE_SQL = " "; @Test // 替换项目中的sql语句 public void testSQL() throws Exception {//src/main/resources/mapper String path = System.getProperty("user.dir") + "\\src\\main\\resources\\mapper"; // TODO 这里替换为自己的项目路径 File file = new File(path); HashMap
0