项目从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

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