记录一次mysql 与orcale 适配过程

记录一次mysql 与orcale 适配过程

1.mysql表导入orcale 使用navicat传输工具

2.导出的.sql文件中 表名和字段名自动加了” ” 去除双引号,去除navicat中多余的注释,我这边导出的sql文件中没有默认值,加上默认值。注意orcale中date的默认值是sysdate,plsql中执行文件建表。表建好以后发现很多坑:
(1) 主键不能自增

###创建sequence
 create sequence t_user_autoinc_seq
         minvalue 1
         maxvalue 99999999
         start with 1
         increment by 1
         nocycle
         nocache
         order;
  
  ###t_user 是表名 t_user_trigger是新建的触发器 
 create or replace trigger t_user_trigger
	before insert on t_user for each row
begin
	select t_user_autoinc_seq.nextval into :new.id from dual;
end t_user_autoinc_tg;
###每张表都得创建sequence和trigger
(2)更新时间不能自动更新
###更新时间创建触发器就好了
create or replace trigger t_user_info_trigger
before update on t_user for each row
begin
     :new.MODIFIED_DATE := sysdate;
end;

3.到这表这块没啥问题了,这边项目中用的mybatis,下边是mybatis中遇到的坑以及解决方案
(1)配置mybatis默认值

<!--设置当JDBC类型为空时,某些驱动程序 要指定值,default:OTHER -->
        <setting name="jdbcTypeForNull" value="NULL"/> 

(2)sql差异

a.不能用as 做别名
b.cancat只能拼接2个字符,需要多个  需要多个concat拼接
c.orcale中group by 分组字段必须在select中
d.单条insert返回主键问题
 <selectKey resultType="java.lang.Integer" order ="AFTER" keyProperty="id" keyColumn="id">
            select T_DATASOURCE_AUTOINC_SEQ.Currval from dual
  </selectKey>
  ### T_DATASOURCE_AUTOINC_SEQ创建主键自增的seq
e.批量插入
<insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="false" keyProperty="id">
        INSERT ALL
        <foreach collection="list" item="item" index="index" >
            into t_XXX (creater, modifier )
            values
            (
            #{item.creater,jdbcType=VARCHAR}, #{item.modifier,jdbcType=VARCHAR}
            )
        </foreach>
        select 1 from dual
    </insert>

f.批量insert or update

<insert id="batchInsertOrUpdate" parameterType="java.util.List" useGeneratedKeys="false" keyProperty="id">
		MERGE INTO t_user t USING(
		<foreach collection="list" item="item" index="index" separator="UNION ALL" >
			SELECT
			#{item.userId,jdbcType=VARCHAR} user_id, #{item.age,jdbcType=INTEGER} age
			 FROM DUAL
		</foreach>)
		### 唯一键约束
		 t1 on (t.user_id=t1.user_id)
		WHEN MATCHED THEN
		UPDATE SET
			t.age=t1.age
		WHEN NOT MATCHED THEN
			insert(user_id, age)
			values(t1.user_id, t1.age)
	</insert>

orcale 分页差异 mysql limit orcale使用rownum
项目中可以使用开源的pagehelper适配mysql与orcale。

ps. 后续肯定还有很多问题,目前暂时就发现这些。

本文地址:https://blog.csdn.net/qq_36275012/article/details/107104397

THE END
喜欢就支持一下吧
点赞5分享