一年没写博客了,准备记录一下。
1.java 实体的移植
主键生成策略有JPA 提供与Hibernate 提供之分
JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.
TABLE:使用一个特定的数据库表格来保存主键。
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
IDENTITY:主键由数据库自动生成(主要是自动增长型)
AUTO:主键由程序控制。
这里如果是mysql数据库一般使用Identity,Oracle 使用Sequence。 当使用Auto时,如果使用Oracle且配置了Sequence则使用Sequence,Mysql则使用Identity 。主键生成策略应该配置为Auto 并配置Squeuence,Oracle转mysql 则不会有问题。
2.DDL的问题
Orcale 里可以写 create or replace table Table_name
Mysql 需要变换为 Drop Table Table_name if exists table_name
create table table_name
3.Mysql需要对自增主键添加 auto_increment
Oracle中一般会先建立表然后通过 alter table 设置表的 主键,这时需要注意,我们需要将主键定义在create table语句中进行。
4.Mysql引擎的选择
Mysql5.*默认为Innodb,支持事物以及行锁表锁,所以应选择Innodb ,但是对于使用空间数据的情况需要使用MyISAM,因为Innodb不支持空间数据
5.数据类型的转换
下表是数据类型映射的表
MySQL Data Type
Oracle Data Type
BIGINT
NUMBER(19, 0)
BIT
RAW
BLOB
BLOB, RAW
CHAR
CHAR
DATE
DATE
DATETIME
DATE
DECIMAL
FLOAT (24)
DOUBLE
FLOAT (24)
DOUBLE PRECISION
FLOAT (24)
ENUM
VARCHAR2
FLOAT
FLOAT
INT
NUMBER(10, 0)
INTEGER
NUMBER(10, 0)
LONGBLOB
BLOB, RAW
LONGTEXT
CLOB, RAW
MEDIUMBLOB
BLOB, RAW
MEDIUMINT
NUMBER(7, 0)
MEDIUMTEXT
CLOB, RAW
NUMERIC
NUMBER
REAL
FLOAT (24)
SET
VARCHAR2
SMALLINT
NUMBER(5, 0)
TEXT
VARCHAR2, CLOB
TIME
DATE
TIMESTAMP
DATE
TINYBLOB
RAW
TINYINT
NUMBER(3, 0)
TINYTEXT
VARCHAR2
VARCHAR
VARCHAR2, CLOB
YEAR
NUMBER
主要关注date,number,varchar2 的转换。其中需要注意 varchar2 的转换,因为在oracle 中varchar2表示存储的字节数,与编码有关,而mysql中varchar则没有,mysql中varchar(30)表示存储30个字符,所以此处需要注意。至于date 因为不需要支持微妙,所以我使用timestamp储存了。
6.常用的系统函数变化
to_date --> char_to_date to_char-->date_to_char ||-->concat
7. hql 中需要注意,避免使用原始sql尽量使用hql,尤其是日期处理。对于空串的处理,在oracle中 varchar2下传入空串则oracle作为 null处理,所以你搜索空串是无结果的
但是mysql中是有空串的. mysql中需要为子查询设置别名要么也会报错。分页查询,mysql中没有rownum,可以使用limit实现,建议使用hql。
8.注意切换hibernate方言
9.触发器与存储过程
oracle的触发器比较高端,对于行触发器支持到按照某列改变触发,而mysql只支持行触发。 oracle中可以判断当前操作类型update,delete 还是 insert,mysql只能分开写 了。变量声明的语法也不相同,需要注意(会详细写一篇)
10。获取当前使用的数据库
我的方法比较屌丝根据Hibernate方言判断使用哪种
11.一些语法上的限制
1). Every derived table must have its own alias
遇到这个问题驱动表需要有一个别名,比如 select sum(money) sum from (select * from guest limit 0,10) t;
2)delete from decode_resource re where re.decode_resource_id=1
这个地方原因未知,delete 中不可以表的别名?去掉re即可