mybatis項目數據庫表遷移(不涉及數據遷移)


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

  暫時就這么多了

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM