Mysql数据库切换成Oracle数据库,使用Mybatis+Oracle整合项目,Mysql与Oracle差别总结

最近公司给我一个任务,把现有项目由Mysql切换成Oracle,而且还要求兼容Mysql和Oracle数据库。网上有很多类似的资源,说了这两个数据库的差别,但是没有进行完整的总结。在这个任务完成后,我在这里总结一下。

1.原有的mysql的insert语句,没有做空判断,也没有指定jdbc类型,当换成Oracle时,插入数据就报错了,总是提示“索引错误,不能将null值插入到某个字段中”。意思就是如果插入的某个对象的某个字段值为空是,insert语句就会报错了。

解决办法:

网上总结说,values值指定jdbc类型就可以了

Mysql数据库切换成Oracle数据库,使用Mybatis+Oracle整合项目,Mysql与Oracle差别总结_第1张图片

但是这个始终不是最终解决办法,当把null值insert的时候,又会报不能给null值指定jdbc类型。所以最好的办法,就是字段和value值都做非空判断!

Mysql数据库切换成Oracle数据库,使用Mybatis+Oracle整合项目,Mysql与Oracle差别总结_第2张图片

2.Oracle的mapper文件中,insert的sql语句不要写useGeneratedKeys="true" 和 keyProperty="id",首先Oracle是不支持主键生成的,所以useGeneratedKeys肯定会报错。要兼容Mysql和Oracle,id最好通过代码来生成,插入的时候给id设置。entity.setId(UUIDUtils.getUUID());那么也就用不上返回刚刚插入的id的用途了,直接通过代码得到刚刚的id即可。而且keyProperty属性也不能写,否则会改变id的值。

比如,如果insert语句使用了keyProperty="id":

String id = UUIDUtils.getUUID();

entity.setId(id );

userDao.insert(entity);

System.out.println(id);

此时,System.out.println(id);输出的id值就跟上面第一句代码的id不一样了。

3.Mybatis+Oracle二次插入有问题

当数据库为Mysql的时候,数据插入是没有问题的。但是切换至Oracle的时候,第一次插入无异常,第二次插入的时候就提示索引异常,但是id明明是有的,且不重复的。

解决办法:

注释PSCache配置代码

       
       
       

4.Mysql和Oracle的一些sql函数差异

4.1 UUID(); Mysql是可以使用这个函数的,并通过sql语句生成ID,但是Oracle是无法识别的,所以为了兼容两个数据库,最好通过代码生成id,然后直接insert对应的id即可

4.2 DATE_FORMAT()  很多时候关于表单查询都会有时间范围查询,比如查询开始时间到结束时间的某些数据。这时候如果数据库字段存储的是字符串类型的时间戳,那么比较时间时候就要进行格式转化。

Msql就是通过DATE_FORMAT()进行转换的。

Select * From user Where DATE_FORMAT(birthday,'%m-%d') >= '06-03' and DATE_FORMAT(birthday,'%m-%d') <= '07-08';

但是Oracle是通过to_date()函数转换的

SELECT * FROM testdatetime t WHERE 1=1 AND to_date(t.createdate,'yyyy-MM-dd') between to_date('2011-06-01','yyyy-MM-dd') and to_date('20110705','yyyymmdd') ;  

所以为了进行兼容处理,要使用CDATA函数,那么两者都可以兼容了

 
  

4.3  CONCAT()函数,模糊查询为了防止sql注入,Mysql+Mybaits是用CONCAT()函数,但是Oracle用的是instr()函数。所以为了两者都可以使用,所有的模糊查询只能用like来解决了

4.4 limit 分页查询。Mysql的分页是limit,但是Oracle的是rownumber,所以分页不要在sql语句中做处理。通过拦截器即可

Map page = etlTaskService.getPage(params, new PageBounds(currentPageNo,pageSize, true));

在Mybatis的配置文件中,加入此插件。每个公司的分页拦截器用的可能都不一样,不过大同小异

Mysql数据库切换成Oracle数据库,使用Mybatis+Oracle整合项目,Mysql与Oracle差别总结_第3张图片

4.5 获取当前时间的差异。很多时候,当我们做新增和修改时候,创建时间和修改时间都喜欢取系统时间,在sql中指定即可,但是。Mysql用的是select now();函数,Oracle则是select sysdate from dual;所以鉴于两者的差异,这种时间处理也要跟id一样,通过代码来进行处理,不要在sql中处理。

以上,为Mysql切换Oracle数据库,并且系统要求兼容Mysql+Oracle的一些技术总结。欢迎大家点评,后续可以继续补充!

你可能感兴趣的:(技术总结)