最近项目(springmvc+mybatis搭建)要从mysql切到oracle中,解决了如下几个问题:
1.oracle数据库和mysql数据库差异还是比较大的,比如别名的使用,mysql支持 “表名 as”的形式,而oracle不支持;mysql中sql语句后面可以有“;”,而oracle中有sql语句后面有“;”会报错。
2.mysql支持主键自增,而oracle不支持,只能通过序列+触发器的形势实现类似mysql中组建自增的功能,具体如下:
--添加自动增长主键
create sequence 序列名 --序列名称
start with 1 --主键从1开始,根据需要自己可修改该数值
increment by 1 --每次增长1
minvalue 1 --最小主键
nomaxvalue ; --不设置最大值
--触发器
create trigger 触发器名
before insert on 表名 for each row
begin
select 序列名.nextval into :new.主键名 from dual;
end 触发器名;
3.在mysql中有 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,oracle中有DEFAULT CURRENT_TIMESTAMP
但ON UPDATE CURRENT_TIMESTAMP貌似不支持,可通过如下触发器来实现更新时插入系统当前时间:
--触发器更新添加默认值
create trigger 触发器名
before update on 表名 for each row --
begin
select CURRENT_TIMESTAMP into :new.列名 from dual;--
end 触发器名;
4.在mysql中的表,建表语句的部分列采用了oracle的保留字,导致不能再oracle执行建表语句,如果更改字段的话,那在程序中的model、映射器文件也要做相应的更改,
这无疑加大了工作量。
可以在是oracle保留字的列上添加“”,然后,在oracle中可正常执行建表语句,在查询时select 的字段上也要加上""才能正常执行查询语句。
5.映射器xml文件的更改
a.useGeneratedKeys="true" 表示主键支持自增,oracle数据库虽然通过序列+触发器的形势实现了自增,毕竟oracle还是不支持主键自增的 true 改为 false;
b.mysql和oracle中sql的差异性,比如像1中提到的情况;
c.insert语句主键的返回问题,采用mysql数据库时xml文件中的insert标签上添加keyProperty="id"属性,在程序中可以返回id
beanDao.insert(bean);
long id = bean.getId();
在oracle不支持自增主键,所以在bean.getId();时会报错,这时我们可通过如下形势实现主键的返回,
<insert id="insert" parameterType="com.lhz.User">
<selectKey resultType="Long" order="AFTER" keyProperty="userId">
SELECT USER_SEQUENCE.CURRVAL as userId from DUAL //USER_SEQUENCE是我们添加的序列
</selectKey>
insert into user (id,user_type) values (#{id,jdbcType=INTEGER}, #{userType,jdbcType=INTEGER});
</insert>
这里有几个地方需要注意,加粗的地方必须用after,意思是在insert语句执行之后执行,SELECT USER_SEQUENCE.CURRVAL as userId from DUAL 只有在查询 USER_SEQUENCE.NEXTVAL执行之后才能执行(详请请自行百度,不然就扯远了);
必须采用查询USER_SEQUENCE.CURRVAL,查询USER_SEQUENCE.NEXTVAL会导致返回的主键与数据库中刚刚插入的记录的id不一致,相差1,是因为 SELECT USER_SEQUENCE.NEXTVAL as userId from DUAL 每执行一次USER_SEQUENCE 就+1。
6.xml文件中的jdbctype等不用更改,mybatis这确实做得比较好,工作量大大减少。
暂时就这么多了
by奋斗的小蘑菇