`

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

 
阅读更多

 

  

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

  

1.	插入主键生成
Oracle insert时主键id是使用sequence方式:
<insert id="MS-BRANDMEMBER-INSERT" parameterClass="TA-brandMember">
<selectKey resultClass="long" keyProperty="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" parameterClass="TA-brandMember">
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)
values (now(), now(), #memberId#, #mallId#, #active#, #brandId#, #catIds#, #authDateFrom#, #authDateTo#, #authLevel#, #area#, #status#, #operator#, #original#)
<selectKey resultClass="java.lang.Long" keyProperty="id">
      SELECT LAST_INSERT_ID() AS ID
</selectKey>
</insert>
2.	分页
Oracle采用三层嵌套的分页方式,用的是偏移量的最小值和最大值获取分页内容:
<select id="SELECT-BRANDIDLIST-BY-MALLID" resultClass="long" parameterClass="java.util.Map">
select brandId from(select brandId,rownum as no from(select distinct(brand_id) as brandId from industry_brand_member where 
<isNotNull property="mallId">
     bu = #mallId:VARCHAR# AND
</isNotNull>
<isNotNull property="status">
    status=#status:VARCHAR# AND
</isNotNull>
brand_id is not null order by brand_id asc))
<![CDATA[
   where no>=#start# and no<#end#
]]>
</select>
          Mysql分页采用limit,offset语法,使用偏移量和每页条数
<select id="SELECT-BRANDIDLIST-BY-MALLID" resultClass="long" parameterClass="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 asc
limit #start#,#pageSize# 
</select>

3.	日期函数
Oracle与mysql的日期API还是有很大差异的,对于日期的操作需要全部检查一遍。我们只用到下面三个日期的方法:
Oracle	Mysql	功能
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') + 1	date_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类型。

 

2
3
分享到:
评论

相关推荐

    数据库迁移及区别比较(Oracle,Sql Server,MySql).docx

    数据库迁移是IT领域中常见的任务,它涉及到将数据和应用程序从一个数据库系统迁移到另一个系统。本篇文章将探讨从SQL Server迁移到MySQL的过程,以及Oracle、SQL Server和MySQL之间的主要区别,这对于理解数据库管理...

    数据库迁移及区别比较(Oracle,Sql Server,MySql).pdf

    本文主要探讨的是数据库迁移的过程以及Oracle、SQL Server、MySQL这三种常见数据库之间的差异。在进行数据库迁移时,通常涉及以下几个关键步骤: 1. **数据库建表脚本的修改**: - 数据类型转换:由于不同数据库的...

    IBATIS连接多数据库参考文档

    本文档将深入探讨如何在IBATIS框架下连接和管理多个数据库,以便于在不同环境中灵活切换或同时操作多个数据源。 IBATIS是一个流行的Java和.NET平台上的数据访问层解决方案,它允许开发者编写SQL语句并与对象模型...

    Ibatis 2.3.4 数据库无关分页

    比如,对于MySQL,可以使用`LIMIT`和`OFFSET`,而对于Oracle,可能需要使用`ROWNUM`。 3. **参数传递**:在Java代码中创建一个封装分页参数的Java对象,如Page对象,包含当前页数、每页记录数等信息。然后将这个...

    [iBATIS]sql转换工具

    在开发过程中,我们常常需要处理各种不同格式的 SQL 语句,例如,从 Oracle 数据库迁移到 MySQL 或是统一不同开发人员的 SQL 风格。这时,一个高效的 SQL 转换工具就显得尤为重要。项目组自行编写的 "[iBATIS]sql...

    根据mybatis/ibatis sqlmapper文件解析生成数据库表

    标题 "根据mybatis/ibatis sqlmapper文件解析生成数据库表" 暗示了我们将会探讨一个关于MyBatis或iBatis框架的工具,它能够解析SQL映射文件并根据这些文件自动生成数据库表。这个过程对于快速构建数据库模型,尤其是...

    ibatis轻松入门

    此外,iBATIS支持多种数据库,如MySQL、Oracle、SQL Server等,只需在配置文件中更改数据库连接信息,就能实现跨数据库平台的迁移。 《iBATIS-SqlMaps-2_cn.pdf》和《iBATIS-SqlMaps-2-Tutorial_cn.pdf》这两份文档...

    ibatis net 指导 手册

    - 结果映射用于将数据库返回的结果集映射到Java对象上。 - **3.4.1 扩展结果映射** - 可以通过继承现有结果映射来创建新的结果映射。 - **3.4.2 parameterMap属性** - 在结果映射中引用参数映射。 - **3.4.3 ...

    ibatis学习笔记

    2. **简化开发工作**:通过封装底层JDBC API的调用细节,Ibatis能够自动将数据库查询结果转换为Java Bean对象,从而极大地减少了开发者在处理数据库操作时所需编写的代码量。 3. **易学易用**:Ibatis的学习曲线较为...

    互联网金融如何去Oracle-蚂蚁实战剖析.pptx

    9. **数据库存储**:在物理层,除了Oracle,还引入了OceanBase和MySQL等其他数据库,通过数据复制中心实现核心交易数据的分表分库和Failover。 10. **技术架构**:使用如IBatis和SpringDataSource等工具,构建逻辑...

    淘宝技术架构介绍_V3

    - **改进**:为了解决数据库性能问题并为后续版本做准备,淘宝将数据库从MySQL迁移到Oracle,并引入了SQLRelay中间件来提高数据处理能力。 - **挑战**:虽然解决了数据库性能问题,但在开发效率和维护性方面仍然存在...

    ibatisnettool

    5. **数据导出导入**:工具提供数据导出和导入功能,可以将数据库中的数据导出为CSV或其他格式,或者将数据导入到数据库中,对于数据迁移或备份具有重要作用。 6. **自动生成代码**:基于选定的数据库表,...

    mybatis文档

    MyBatis 使用简单的 XML 或注解进行配置和原始映射,能够将接口和 Java 的 POJOs 映射到数据库中的记录。 #### 2. MyBatis 入门与安装配置 - **安装与配置步骤**: - 创建数据库表。 - 导入必需的 Jar 包(包括 ...

    java面试宝典和学习必备

    MyBatis起源于Apache的iBatis项目,2010年后迁移到Google Code并更名。 3. **数据库**:MySQL、Oracle和SQL Server是最常见的关系型数据库。Oracle是大型企业级数据库,广泛用于复杂的企业级应用。 4. **服务器**...

    appfuse 2.0.2PDF格式文档

    - **数据库支持**:兼容多种数据库,包括Oracle、MySQL、PostgreSQL等,并提供数据库配置和优化指南。 - **国际化和本地化**:支持多语言环境,易于实现国际化和本地化应用。 - **自动化测试**:内置单元测试和集成...

    内容管理系统CMS20091214.doc

    GeiNuke 是一个基于 Java 开发的 CMS 系统,它以 HSQLDB 和 MySQL 为数据库,使用 iBatis 作为持久层框架,Spring 作为应用框架,Caucho Hessian 提高系统的可扩展性,Velocity 模板引擎处理 MVC 层的视图渲染。...

    java在淘宝广告中的应用和实现

    - **数据存储**:当前主要使用Oracle数据库存储数据,并计划迁移至MySQL,以提高性能和降低成本。 2. **应用二:消息通知引擎** - **功能需求**:每日处理千万级消息,高峰期达到每秒2000条消息。确保消息的可靠...

    某外企java笔试题

    3. 服务器与数据库选择:建立网站时,服务器选择可能包括Apache Tomcat、Nginx等,数据库则可能涉及MySQL、PostgreSQL、Oracle等。选择取决于项目需求,如性能、稳定性、成本等因素。 4. SQL查询: a) 要求分数...

    Spring+SpringMVC+MyBatis整合教程

    它的前身是 iBatis,后来从 Apache Software Foundation 迁移到了 Google Code,并更名为 MyBatis。MyBatis 主要有以下几个特点: - **动态 SQL**:MyBatis 支持动态 SQL 语句的编写,可以通过 XML 或注解的方式...

Global site tag (gtag.js) - Google Analytics