读书人

施用ibatis将数据库从oracle迁移到mys

发布时间: 2013-06-25 23:45:41 作者: rapoo

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

?

??

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

??

1.插入主键生成Oracle insert时主键id是使用sequence方式:<insert id="MS-BRANDMEMBER-INSERT" parameterkeyProperty="id">      SELECT seq_industry_brand_member.nextval FROM DUAL</selectKey>     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#)</insert>        mysql需要修改为:<insert id="MS-BRANDMEMBER-INSERT" parameterkeyProperty="id">      SELECT LAST_INSERT_ID() AS ID</selectKey></insert>2.分页Oracle采用三层嵌套的分页方式,用的是偏移量的最小值和最大值获取分页内容:<select id="SELECT-BRANDIDLIST-BY-MALLID" resultparameterresultparameterClass="java.util.Map">select distinct(brand_id) as brandId from industry_brand_member where <isNotNull property="mallId">    mall_id = #mallId:VARCHAR# AND</isNotNull><isNotNull property="status">    status=#status:VARCHAR# AND</isNotNull>brand_id is not null order by brand_id asclimit #start#,#pageSize# </select>3.日期函数Oracle与mysql的日期API还是有很大差异的,对于日期的操作需要全部检查一遍。我们只用到下面三个日期的方法:OracleMysql功能to_char(last_offer_paytime,'yyyy/MM/dd')date_format(last_offer_paytime,'%Y/%m/%d')日期转为字符串to_date(#searchDate#, 'yyyy/MM/dd')str_to_date(#searchDate#, '%Y/%m/%d')字符串转为日期to_date(#searchDate#, 'yyyy/MM/dd') + 1date_add(str_to_date(#searchDate#, '%Y/%m/%d'),interval 1 day)日期相加  4.质量保证可能大部分sql都会做或多或少的修改,如何保证质量,我们这边对每个sql都做了单元测试,之前可能一些没做的也全部补起来了,辛苦袁飞,程达做了很充分的单元测试,极大的保证了迁移质量,甚至发现了原来隐藏的一些问题。对于迁移来说,单元测试是最好的质量保证方法。使用jtester封装的DbFit来做DAO的单元测试@Test@DbFit(when="wiki/sampleshow/BuyerDAO.insert.when.wiki", then="wiki/sampleshow/BuyerDAO.insert.then.wiki")public void TestInsertSampleShowBuyer() {    SampleShowBuyer SampleShowBuyer = new SampleShowBuyer();    SampleShowBuyer.setMemberId("yanhandle");    SampleShowBuyer.setPhoneNumber("13512345678");    Long id = sampleShowBuyerDAO.insertSampleShowBuyer(SampleShowBuyer);    want.object(id).notNull();    want.number(id).greaterThan(0l);}       单元测试的工作量占了去O工作量的2/3,平均每个表需要0.8人日,当然这个还要看sql的数量和复杂度。建议还是需要做单元测试来保证质量。5.数据类型的差异,建表通过idb就可以完成。不过brand有一个配置字段用到了Oracle的CLOB类型,mysql则需要使用text类型。

?

读书人网 >其他数据库

热点推荐