Javamysql语法转化oracle_MyBatis项⽬实战快速将MySQL转
换成Ora。。。
⼀、前⾔
因项⽬需求,⼩编要将项⽬从mysql迁移到oracle中 ~
现在将完成 基于MyBatis-Plus将项⽬中的MySQL语句全部转换成Oracle语句
⼤概实现步骤:
将项⽬改成⽀持双库配置(因项⽬基于mysql数据库已经全部完成,也不想直接替换掉,于是新增oracle库,让整个项⽬可⽀持多个数据库,这⾥不是多数据源哦!)
Oracle中创建常⽤函数
遍历项⽬中的l⽂件,到mysql与oracle语句的区别,然后替换绝⼤部分SQL
最后将⼀些特殊的mysql语句⼿动修改为oracle语句
⼆、MyBatis-Plus ⽀持双库配置 【mysql,oracle】
1、l中配置mybatis-plus的database-id
# mybatis-plus配置
mybatis-plus:
configuration:
jdbc-type-for-null: 'null' # 解决oracle更新数据为null时⽆法转换报错
database-id: oracle # ⽀持多库配置 mysql,oracle
2、MybatisPlus核⼼配置⽂件 -> 根据不同的数据库⼚商执⾏不同的SQL
@Configuration
@MapperScan("com.dules.**.mapper*")
public class MybatisPlusConfig {
/**
* `l`⽂件中的`databaseId`会⾃动识别使⽤的数据库类型与这⾥相对应
* 注: 如果没有指定`databaseId`则该SQL语句适⽤于所有数据库哦~
*
* databaseIdProvider:⽀持多数据库⼚商
* VendorDatabaseIdProvider: 得到数据库⼚商的标识(驱动getDatabaseProductName()),mybatis就能根据数据库⼚商标识来执⾏不同的sql;
* MySQL,Oracle,SQL Server,xxxx
*/
@Bean
public DatabaseIdProvider getDatabaseIdProvider(){
DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
Properties properties = new Properties();
// 为不同的数据库⼚商起别名
properties.setProperty("MySQL","mysql");
properties.setProperty("Oracle","oracle");
databaseIdProvider.setProperties(properties);
return databaseIdProvider;
}
}
3、l中通过databaseId指定数据库类型
SELECT * FROM 表名 LIMIT 1
SELECT * FROM 表名 WHERE ROWNUM <= 1
三、Oracle中创建常⽤函数
这⾥根据个⼈项⽬情况去实际应⽤即可~
mysql语句转oracle1、ORACLE_TO_UNIX
Oracle时间 Date类型转换为Unix时间戳,等同于mysql中的UNIX_TIMESTAMP
create or replace function ORACLE_TO_UNIX(in_date IN DATE) return number is
begin
return( ROUND( (in_date -TO_DATE('19700101','yyyymmdd'))*86400 -
TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))*3600, 0) );
end ORACLE_TO_UNIX;
2、FIND_IN_SET
CREATE OR REPLACE FUNCTION FIND_IN_SET(piv_str1 varchar2, piv_str2 varchar2, p_sep varchar2 := ',') RETURN NUMBER IS
l_idx number:=0; -- ⽤于计算piv_str2中分隔符的位置
str varchar2(500); -- 根据分隔符截取的⼦字符串
piv_str varchar2(500) := piv_str2; -- 将piv_str2赋值给piv_str
res number:=0; -- 返回结果
loopIndex number:=0;
BEGIN
-- 如果piv_str中没有分割符,直接判断piv_str1和piv_str是否相等,相等 res=1
IF instr(piv_str, p_sep, 1) = 0 THEN
IF piv_str = piv_str1 THEN
res:= 1;
END IF;
下了mysql安装包 然后怎么安装呢ELSE
linux命令网站-
- 循环按分隔符截取piv_str
LOOP
l_idx := instr(piv_str,p_sep);
loopIndex:=loopIndex+1;
-- 当piv_str中还有分隔符时
IF l_idx > 0 THEN
-- 截取第⼀个分隔符前的字段str
str:= substr(piv_str,1,l_idx-1);
-- 判断 str 和piv_str1 是否相等,相等 res=1 并结束循环判断
IF str = piv_str1 THEN
res:= loopIndex;
EXIT;
END IF;
piv_str := substr(piv_str,l_idx+length(p_sep));
ELSE
-- 当截取后的piv_str 中不存在分割符时,判断piv_str和piv_str1是否相等,相等 res=1 IF piv_str = piv_str1 THEN
res:= loopIndex;
END IF;
-- ⽆论最后是否相等,都跳出循环
EXIT;
END IF;
END LOOP;
-- 结束循环
END IF;
-- 返回res
RETURN res;
END FIND_IN_SET;
四、⼯具类(MySQL语句转换Oracle语句)
替换步骤:
在 l 中将所有sql语句上加⼊ databaseId="mysql"
复制⼀份mysql的sql(即 将替换的oracle语句)
在复制的sql上加⼊databaseId="oracle"
出mysql与oracle语句区别,然后替换sql
温馨⼩提⽰: 这⾥⼯具类只供参考,实际操作根据⾃⼰的项⽬做修改哦,操作前建议先备份⾃⼰的项⽬,以防操作不当丢失代码哦!
import org.apachemons.lang3.StringUtils;
import org.junit.Test;
import java.io.*;
import java.util.*;
/**
*
mysql迁移oracle 测试⼯具类
*
* @description :
* @author : zhengqing
* @date : 2020/1/08 10:10
*/
public class MySQLToOracleTest {
private final static String ORACLE_SQL = " ";
霹雳布袋戏最新一部2020@Test // 替换项⽬中的sql语句
public void testSQL() throws Exception {
String path = Property("user.dir") + "\\src\\main\\java\\com\\zhengqing\\xxx"; // TODO 这⾥替换为⾃⼰的项⽬路径
File file = new File(path);
HashMap fileMap = new HashMap<>();
getAllFileByRecursion(fileMap, file);
fileMap.forEach((key, value) -> {
String fileXmlName = (String) key;
File fileXml = (File) value;
String filePath = Path();bejson为什么进不去
if (fileXmlName.equals("l")) {
System.out.println(filePath);
try {
// 1、加⼊ databaseId="mysql"
addMysql(filePath);
// 2、复制⼀份oracle的sql
if (!checkHasOracle(filePath)) {
copyMysqlToOracle(filePath);
}
// 3、加⼊ databaseId="oracle"
addOracle(filePath);
// 4、替换mybatis `l` 中的sql语句
repalceSQL(filePath);
} catch (IOException e) {
e.printStackTrace();
}
}
});
System.out.println(fileMap);
}
/**
* 替换mybatis `l` 中的sql语句
*/
private static void repalceSQL(String path) throws IOException {
File file = new File(path);
FileReader in = new FileReader(file);
BufferedReader bufIn = new BufferedReader(in);
// 内存流, 作为临时流
CharArrayWriter tempStream = new CharArrayWriter();
// 替换
python怎么导入模块
String line = null;
int row = 0;
int rowOracle = 0;
while ((line = adLine()) != null) {
row++;
if (ains(ORACLE_SQL)) {
rowOracle = row;
}
if (rowOracle != 0 && row > rowOracle) {
// ① 替换 `LIMIT` -> `AND ROWNUM <= 1` TODO 【注: 部分包含`ORDER BY` 关键字,需单独处理】if (ains("limit") || ains("LIMIT")) {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论