当前位置: 代码迷 >> Web前端 >> web施用oracle迁移mysql开发版(三)
  详细解决方案

web施用oracle迁移mysql开发版(三)

热度:184   发布时间:2012-08-03 00:12:14.0
web应用oracle迁移mysql开发版(三)


?万事俱备只欠东风

?

1、查看表结构是必须的

?

先看一下你的所有表的主键id是否是类似于int这样类型,而且是否是主键(这不是废话,逻辑上的主键在数据库上不一定设置成了主键),还有是否是自增的

?

a)在Navicat下
选中一个表,点击“设计表”,看图中的是否有红色部分,且数据是int类型。

?



?

?

b)还是在Navicat下(这不是废话,因为不排除某些牛B的开发拥有各种权限,当然这里指的是命令行模式了)

?

?

?

如果不是,帮忙更改下类型。

?

2、先跑一下你的一个单元测试文件。


当然,是跑不过的了。这不是有病么?不是的……我们前期做了这么多准备工作,谁来验证它的正确性呢??
是单元测试的报错,仔细看一下报错信息,如果能确定是sqlmap里的错。例如无法识别to_date函数等,如果还有类似于权限什么的问题,就要具体问题具体分析了。

?

我们最关心的――Sqlmap的改写问题

?

1、关于id的改写


mysql和oracle的sql语法是不一样的,在ibatis里,关于主键id的取法也是不一样的。

我们原来看到的是,这样的:

?

<selectKey resultClass="long" keyProperty="id">
    <![CDATA[
        select SEQ_AP_ACCOUNT_STATUS.NEXTVAL as id from DUAL
    ]]>
</selectKey>

?

?

我们需要改写成,这样的:

?

<selectKey keyProperty="id" resultClass="Long" type="post">
    select last_insert_id()
</selectKey>

?

?

为什么需要这样改呢?


在oracle中,对于id是从预先创建的sequence.nextval中取得的。
在mysql中,则是通过在数据库中,定义主键,并设置成自增。通过last_insert_id()取得的。

?

我们新加了选项type="post",为什么呢?


支付宝的人给出的答案是“ 我们在数据库插入一条数据的时候,经常是需要返回插入这条数据的主键。但是数据库供应商之间生成主键的方式都不一样。

有些是预先生成(pre-generate)主键的,如Oracle和PostgreSQL;有些是事后生成(post-generate)主键的,如MySQL和SQL Server。但是不管是哪种方式,我们都可以用iBATIS的节点来获取语句所产生的主键。

而ibatis中默认是pre的类型,所以我们在oracle中不写正好支持。而mysql需要用post形式,因此不写用默认的pre类型时会报错,需要手动改写成post方式。

?

2、SYSDATE的改写


在oracle中,当前时间用SYSDATE;在mysql中,则需要用now()来代替。

?

3、to_date函数


我们原来看到的是,这样的:

?

to_date(#dateStart#,'YYYY-MM-DD HH24:mi:ss')

?

?

我们需要改成,这样的

?

DATE_FORMAT(#dateStart#,'%Y-%m-%d %H:%i:%s')

?

?

如果还有任何mysql的时间操作,请参考这篇文章 http://dev.mysql.com/doc/refman/5.1/zh/functions.html#date-and-time-functions

?

4、分页写法


我们原来看到的是,这样的:

?

select sw.*,rowline from
         (
	select st.* ,ROWNUM as rowline from
		(
		select
		a.*
		from
		AP_EPIBOLY_TASK a
		<include refid="searchEpibolyTaskConditionWhereClause"/>
		order by a.id desc
		) st  where <![CDATA[  ROWNUM <= #offset# + #length# ]]>
	) sw
<![CDATA[where   sw.rowline > #offset# ]]>

?

?

需要改成,这样的:

?

select
    	a.*
    	from
    	ap_epiboly_task a
	<include refid="searchEpibolyTaskConditionWhereClause"/>
	order by a.id desc
limit #offset#,#length#

?

?

看了mysql和oracle的分页后,我们就能总结出分页的规律。一般我们只会考虑2个因素,a)当前页 b)每页大小
这就相当于一个数轴,如图:



?

D点是原点,当前页就是每一个刻度,例如A,每页大小就是原点到某一个刻度的距离。例如D点到A点的距离。
因此得出:offset(偏移量)= (currentPage - 1)*length
由于我们从0开始算,因此currentPage需要减1

?

5、oracle中CLOB字段的处理


如果是新产生的数据,那么在ibatis中对列不要绑定jdbc类型,它会自己处理。我们把它当成普通的varchar或int属性就可以了。
在Navicat中可以查看BLOB字段的内容,但是中文乱码(虽然以UTF-8)的方式编码。可以通过右键另存为到本地,这样就可以看到具体内容了。

?

6、like查询时字符串拼接


在oracle时,我们的ibatis的sqlmap文件字符串拼接用的是这样的:

?

SELECT * FROM user WHERE username like '%' || #username# || '%'

?

?

但在mysql时,我们需要改写成这样的:

?

SELECT * FROM user WHERE username like CONCAT('%', #username#, '%')

?

1 楼 aliahhqcheng 2012-02-11  
这也都是很实在的实践记录吧!平常工作中也会用到这些。


有一篇指导性的文章:http://wenku.baidu.com/view/49b27a305a8102d276a22fd2.html
如果你学习了,欢迎分享呀!


最后提一个需求:mysql和oracle就是各有什么有点,为什么要做迁移,有时候还是来回迁移。
2 楼 aliahhqcheng 2012-02-11  
这也都是很实在的实践记录吧!平常工作中也会用到这些。


有一篇指导性的文章:http://wenku.baidu.com/view/49b27a305a8102d276a22fd2.html
如果你学习了,欢迎分享呀!


最后提一个需求:mysql和oracle就是各有什么有点,为什么要做迁移,有时候还是来回迁移。[size=medium][/size][color=red][/color]
3 楼 aliahhqcheng 2012-02-11  
这也都是很实在的实践记录吧!平常工作中也会用到这些。


有一篇指导性的文章:http://wenku.baidu.com/view/49b27a305a8102d276a22fd2.html
如果你学习了,欢迎分享呀!


最后提一个需求:mysql和oracle就是各有什么有点,为什么要做迁移,有时候还是来回迁移。
[size=medium][/size]
4 楼 aliahhqcheng 2012-02-11  
原谅我吧!我只是想换换颜色,
5 楼 ccccccc2003 2012-02-11  
aliahhqcheng 写道
这也都是很实在的实践记录吧!平常工作中也会用到这些。


有一篇指导性的文章:http://wenku.baidu.com/view/49b27a305a8102d276a22fd2.html
如果你学习了,欢迎分享呀!


最后提一个需求:mysql和oracle就是各有什么有点,为什么要做迁移,有时候还是来回迁移。

mysql和oracle对于开发人员来说其实都一样的,毕竟我们不是DBA。至于为什么要迁移,是因为老大说要迁移,呵呵。oracle好像是按CPU来算钱的,主要是硬件上面的花费太大,我们可以用免费的mysql来减少支出。像买一个IBM的小型机器也是要几百万的,淘宝的大部分应用已经迁移到了mysql上,证明了mysql还是比较靠谱的。像核心交易这些东西,可能倒没有迁移mysql的紧急需求,像一般的App迁移就迁移吧,对老大来说反正能省钱。硬件的花费还是很大的。读一下这篇文章,可能能有些感觉 http://coolshell.cn/articles/6548.html
  相关解决方案