背景原因就不介绍了,直接进入正题。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采用自增后这里不用手动管理的所以删除了,其它都是语法差异了