最近項目(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這確實做得比較好,工作量大大減少。
暫時就這么多了