web应用oracle迁移mysql开发版(三)
万事俱备只欠东风
1、查看表结构是必须的
先看一下你的所有表的主键id是否是类似于int这样类型,而且是否是主键(这不是废话,逻辑上的主键在数据库上不一定设置成了主键),还有是否是自增的。
a)在Navicat下
选中一个表,点击“设计表”,看图中的是否有红色部分,且数据是int类型。
http://dl.iteye.com/upload/attachment/0062/8831/2a6c90d8-bd4d-3512-92ed-8871f9e348ba.jpg
b)还是在Navicat下(这不是废话,因为不排除某些牛B的开发拥有各种权限,当然这里指的是命令行模式了)
http://dl.iteye.com/upload/attachment/0062/8833/9d9e6e15-9e52-3530-8848-b573cfc0ebf3.jpg
如果不是,帮忙更改下类型。
2、先跑一下你的一个单元测试文件。
当然,是跑不过的了。这不是有病么?不是的……我们前期做了这么多准备工作,谁来验证它的正确性呢??
是单元测试的报错,仔细看一下报错信息,如果能确定是sqlmap里的错。例如无法识别to_date函数等,如果还有类似于权限什么的问题,就要具体问题具体分析了。
我们最关心的——Sqlmap的改写问题
1、关于id的改写
mysql和oracle的sql语法是不一样的,在ibatis里,关于主键id的取法也是不一样的。
我们原来看到的是,这样的:
<selectKey resultClass="long" keyProperty="id"> <!]></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(selecta.*fromAP_EPIBOLY_TASK a<include refid="searchEpibolyTaskConditionWhereClause"/>order by a.id desc) stwhere <!]>) sw<!]>
需要改成,这样的:
select a.* from ap_epiboly_task a<include refid="searchEpibolyTaskConditionWhereClause"/>order by a.id desclimit #offset#,#length#
看了mysql和oracle的分页后,我们就能总结出分页的规律。一般我们只会考虑2个因素,a)当前页 b)每页大小
这就相当于一个数轴,如图:
http://dl.iteye.com/upload/attachment/0062/8839/b10cf5cd-b9d6-347c-b3c9-57c39314e703.jpg
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]