首页 > 数据库开发 > 使用ibatis将数据库从oracle迁移到mysql的几个修改点

使用ibatis将数据库从oracle迁移到mysql的几个修改点

我们项目在公司的大战略下需要从oracle迁移到mysql,我们的项目使用的是ibatis,在ibatis层上需要的一些修改点如下:单元测试框架我们用的是jtester。

  1. 1.  插入主键生成
  2. Oracle insert时主键id是使用sequence方式:
  3. <insert id="MS-BRANDMEMBER-INSERT" parameterClass="TA-brandMember">
  4. <selectKey resultClass="long" keyProperty="id">
  5.       SELECT seq_industry_brand_member.nextval FROM DUAL
  6. </selectKey>
  7.      insert into industry_brand_member (id, gmt_create, gmt_modified, member_id, bu, active, brand_id, cat_ids, auth_date_from, auth_date_to, auth_level, area,      status, operator, original) values (#id#, sysdate, sysdate, #memberId#, #mallId#, #active#, #brandId#, #catIds#, #authDateFrom#, #authDateTo#, #authLevel#, #area#, #status#, #operator#, #original#)
  8. </insert>
  9.         mysql需要修改为:
  10. <insert id="MS-BRANDMEMBER-INSERT" parameterClass="TA-brandMember">
  11. insert into industry_brand_member (gmt_create, gmt_modified, member_id, mall_id, active, brand_id, cat_ids, auth_date_from, auth_date_to, auth_level, area, status, operator, original)
  12. values (now(), now(), #memberId#, #mallId#, #active#, #brandId#, #catIds#, #authDateFrom#, #authDateTo#, #authLevel#, #area#, #status#, #operator#, #original#)
  13. <selectKey resultClass="java.lang.Long" keyProperty="id">
  14.       SELECT LAST_INSERT_ID() AS ID
  15. </selectKey>
  16. </insert>
  17. 2.  分页
  18. Oracle采用三层嵌套的分页方式,用的是偏移量的最小值和最大值获取分页内容:
  19. <select id="SELECT-BRANDIDLIST-BY-MALLID" resultClass="long" parameterClass="java.util.Map">
  20. select brandId from(select brandId,rownum as no from(select distinct(brand_id) as brandId from industry_brand_member where
  21. <isNotNull property="mallId">
  22.      bu = #mallId:VARCHAR# AND
  23. </isNotNull>
  24. <isNotNull property="status">
  25.     status=#status:VARCHAR# AND
  26. </isNotNull>
  27. brand_id is not null order by brand_id asc))
  28. <![CDATA[
  29.    where no>=#start# and no<#end#
  30. ]]>
  31. </select>
  32.           Mysql分页采用limit,offset语法,使用偏移量和每页条数
  33. <select id="SELECT-BRANDIDLIST-BY-MALLID" resultClass="long" parameterClass="java.util.Map">
  34. select distinct(brand_id) as brandId from industry_brand_member where
  35. <isNotNull property="mallId">
  36.     mall_id = #mallId:VARCHAR# AND
  37. </isNotNull>
  38. <isNotNull property="status">
  39.     status=#status:VARCHAR# AND
  40. </isNotNull>
  41. brand_id is not null
  42. order by brand_id asc
  43. limit #start#,#pageSize#
  44. </select>
  45. 3.  日期函数
  46. Oracle与mysql的日期API还是有很大差异的,对于日期的操作需要全部检查一遍。我们只用到下面三个日期的方法:
  47. Oracle  Mysql   功能
  48. to_char(last_offer_paytime,'yyyy/MM/dd')    date_format(last_offer_paytime,'%Y/%m/%d')  日期转为字符串
  49. to_date(#searchDate#, 'yyyy/MM/dd') str_to_date(#searchDate#, '%Y/%m/%d')   字符串转为日期
  50. to_date(#searchDate#, 'yyyy/MM/dd') + 1 date_add(str_to_date(#searchDate#, '%Y/%m/%d'),interval 1 day)  日期相加
  51. 4.  质量保证
  52. 可能大部分sql都会做或多或少的修改,如何保证质量,我们这边对每个sql都做了单元测试,之前可能一些没做的也全部补起来了,辛苦袁飞,程达做了很充分的单元测试,极大的保证了迁移质量,甚至发现了原来隐藏的一些问题。对于迁移来说,单元测试是最好的质量保证方法。
  53. 使用jtester封装的DbFit来做DAO的单元测试
  54. @Test
  55. @DbFit(when="wiki/sampleshow/BuyerDAO.insert.when.wiki", then="wiki/sampleshow/BuyerDAO.insert.then.wiki")
  56. public void TestInsertSampleShowBuyer() {
  57.     SampleShowBuyer SampleShowBuyer = new SampleShowBuyer();
  58.     SampleShowBuyer.setMemberId("yanhandle");
  59.     SampleShowBuyer.setPhoneNumber("13512345678");
  60.     Long id = sampleShowBuyerDAO.insertSampleShowBuyer(SampleShowBuyer);
  61.     want.object(id).notNull();
  62.     want.number(id).greaterThan(0l);
  63. }
  64.        单元测试的工作量占了去O工作量的2/3,平均每个表需要0.8人日,当然这个还要看sql的数量和复杂度。建议还是需要做单元测试来保证质量。
  65. 5.  数据类型的差异,建表通过idb就可以完成。不过brand有一个配置字段用到了Oracle的CLOB类型,mysql则需要使用text类型。

 


本文固定链接: http://www.devba.com/index.php/archives/389.html | 开发吧

报歉!评论已关闭.