項目從Oracle遷到Mysql數據庫

        背景原因就不介紹了,直接進入正題。spring boot 項目從oracle數據要遷移的mysql數據庫,要做哪些準備,以及遷移過程中遇到的坑。

一.修改數據庫驅動配置

原oracle的驅動 

driverClassName: oracle.jdbc.driver.OracleDriver

 替換爲

driverClassName: com.mysql.cj.jdbc.Driver

mysql的驅動現在有兩種選擇,一種是

driverClassName: com.mysql.cj.jdbc.Driver,這個版本較高,另外一種是

driverClassName: com.mysql.jdbc.Driver。這兩種的去吧可以參考https://www.cnblogs.com/liaojie970/p/8916568.html

 

二.數據庫連接的修改

原oracle的連接

url: jdbc:oracle:thin:@//host:port/instance

修改爲mysql

url: jdbc:mysql://host:port/dbname

三.如果用到的pagehelper組件記得這裏也要改下

mapper:
   not-empty: false
   identity: oracle
   before: true
pagehelper:
    helperDialect: oracle
    returnPageInfo: check
    supportMethodsArguments: false
    reasonable: false
    params: count=countSql

把裏面的oracle都改成mysql

 

四.項目中的數據驅動的依賴也要換一下

 

五.MySQL默認是表明區分大小寫的,所以,代碼中的表名需要和數據庫中的一致,以爲oracle表名都是大寫,轉到mysql自然也都是大寫,所以建議統一大寫。另外值得注意的是,表別名也是區分大小寫,所以都要統一,個人建議都統一成大寫不會有錯。

 

六.對於主鍵的區別,oracle採用序列,mysql則更爲簡單的可以作爲主鍵自增,但是注意,如果用工具從oracle直接轉到mysql時,oracle的主鍵爲number類型但是到mysql就變成了decimal了,而decimal是無法自增的,所以需要手動改下類型。另外在dto對象中使用了

@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "select SEQ_TB__LIMIT.nextval from dual"),以獲取更新後的主鍵值,但是在mysql中需要使用

@GeneratedValue(strategy = GenerationType.TABLE, generator = "jdbc")

 

七.關鍵字佔用,在oracle轉到mysql的時候回發現有寫字段名其實是mysql的關鍵字或着i保留字,這個時候可以使用`key`這種方式來解決避免改字段帶來的麻煩。同時也可以應用在@Colume(name = "`key`")的註解上面

 

八.對於批量插入的修改

<insert id="batchInsert" parameterType="java.util.List">
    insert into TB_FILE
    (ID, PAY_CHANNEL, TRADE_NO, ORDER_AMOUNT, STATUS, ORDER_DETAIL, MCHNTCD, ORDER_DATE,
    BATCH_NO, THIRD_TRADE_NO,FINISH_TIME)
    select SEQ__FILE.nextval,A.* from(
    <foreach collection="list" index="index" item="dto" separator="UNION ALL">
      select
      #{dto.payChannel,jdbcType=DECIMAL},
      #{dto.tradeNo,jdbcType=VARCHAR},
      #{dto.orderAmount,jdbcType=DECIMAL},
      #{dto.status,jdbcType=DECIMAL},
      #{dto.orderDetail,jdbcType=VARCHAR},
      #{dto.mchntcd,jdbcType=VARCHAR},
      #{dto.orderDate,jdbcType=VARCHAR},
      #{dto.batchNo,jdbcType=VARCHAR},
      #{dto.thirdTradeNo,jdbcType=VARCHAR},
      #{dto.finishTime,jdbcType=TIMESTAMP}
      from dual
    </foreach>
    ) A
  </insert>

改爲

<insert id="batchInsertFiles" parameterType="java.util.List">
    insert into TB__FILE
    (PAY_CHANNEL, TRADE_NO, ORDER_AMOUNT, STATUS, ORDER_DETAIL, MCHNTCD, ORDER_DATE,
    BATCH_NO, THIRD_TRADE_NO,FINISH_TIME)
    values
    <foreach collection="list" index="index" item="dto" separator=",">
      (
      #{dto.payChannel,jdbcType=DECIMAL},
      #{dto.tradeNo,jdbcType=VARCHAR},
      #{dto.orderAmount,jdbcType=DECIMAL},
      #{dto.status,jdbcType=DECIMAL},
      #{dto.orderDetail,jdbcType=VARCHAR},
      #{dto.mchntcd,jdbcType=VARCHAR},
      #{dto.orderDate,jdbcType=VARCHAR},
      #{dto.batchNo,jdbcType=VARCHAR},
      #{dto.thirdTradeNo,jdbcType=VARCHAR},
      #{dto.finishTime,jdbcType=TIMESTAMP}
      )
    </foreach>
  </insert>

注意id採用自增後這裏不用手動管理的所以刪除了,其它都是語法差異了

 

九.語法差異

參考裏這篇博客https://www.cnblogs.com/wlzjdm/p/10420727.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章