背景原因就不介紹了,直接進入正題。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採用自增後這裏不用手動管理的所以刪除了,其它都是語法差異了