zoukankan      html  css  js  c++  java
  • mybatis项目数据库表迁移(不涉及数据迁移)

      最近项目(springmvc+mybatis搭建)要从mysql切到oracle中,解决了如下几个问题:

      1.oracle数据库和mysql数据库差异还是比较大的,比如别名的使用,mysql支持   “表名 as”的形式,而oracle不支持;mysql中sql语句后面可以有“;”,而oracle中有sql语句后面有“;”会报错。

      2.mysql支持主键自增,而oracle不支持,只能通过序列+触发器的形势实现类似mysql中组建自增的功能,具体如下:

      --添加自动增长主键
      create sequence 序列名 --序列名称
      start with 1 --主键从1开始,根据需要自己可修改该数值
      increment by 1   --每次增长1
      minvalue 1  --最小主键
      nomaxvalue ;  --不设置最大值
      --触发器
      create trigger 触发器名
      before insert on 表名 for each row
      begin
      select 序列名.nextval into :new.主键名 from dual;
      end 触发器名;

      3.在mysql中有 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,oracle中有DEFAULT CURRENT_TIMESTAMP

    但ON UPDATE CURRENT_TIMESTAMP貌似不支持,可通过如下触发器来实现更新时插入系统当前时间:

      --触发器更新添加默认值
      create trigger 触发器名
      before update on  表名 for each row  --
      begin
      select CURRENT_TIMESTAMP into :new.列名 from dual;--
      end 触发器名;

      4.在mysql中的表,建表语句的部分列采用了oracle的保留字,导致不能再oracle执行建表语句,如果更改字段的话,那在程序中的model、映射器文件也要做相应的更改,

    这无疑加大了工作量。

      可以在是oracle保留字的列上添加“”,然后,在oracle中可正常执行建表语句,在查询时select 的字段上也要加上""才能正常执行查询语句。

      5.映射器xml文件的更改

      a.useGeneratedKeys="true"  表示主键支持自增,oracle数据库虽然通过序列+触发器的形势实现了自增,毕竟oracle还是不支持主键自增的 true 改为 false;

      b.mysql和oracle中sql的差异性,比如像1中提到的情况;

      c.insert语句主键的返回问题,采用mysql数据库时xml文件中的insert标签上添加keyProperty="id"属性,在程序中可以返回id

        beanDao.insert(bean);
                  long id = bean.getId();

             在oracle不支持自增主键,所以在bean.getId();时会报错,这时我们可通过如下形势实现主键的返回,

        <insert id="insert" parameterType="com.lhz.User">
              <selectKey resultType="Long" order="AFTER" keyProperty="userId">  
                 SELECT USER_SEQUENCE.CURRVAL as userId   from DUAL   //USER_SEQUENCE是我们添加的序列
              </selectKey>
              insert into user (id,user_type)  values (#{id,jdbcType=INTEGER}, #{userType,jdbcType=INTEGER});
          </insert>

        这里有几个地方需要注意,加粗的地方必须用after,意思是在insert语句执行之后执行,SELECT USER_SEQUENCE.CURRVAL as userId   from DUAL 只有在查询  USER_SEQUENCE.NEXTVAL执行之后才能执行(详请请自行百度,不然就扯远了);

        必须采用查询USER_SEQUENCE.CURRVAL,查询USER_SEQUENCE.NEXTVAL会导致返回的主键与数据库中刚刚插入的记录的id不一致,相差1,是因为 SELECT USER_SEQUENCE.NEXTVAL as userId   from DUAL 每执行一次USER_SEQUENCE 就+1。

      6.xml文件中的jdbctype等不用更改,mybatis这确实做得比较好,工作量大大减少。

      暂时就这么多了

      

    by奋斗的小蘑菇
  • 相关阅读:
    【转】 Ubuntu安装jdk报错:-bash /usr/.../java:No such file or directroy
    sudo 出现unable to resolve host 解决方法
    C99 布尔
    面向对象?
    高斯消元
    白皮 Chapter 2
    白皮 Chapter 1
    开启暑假新生活( •̀ ω •́ )
    [vijos P1040] 高精度乘法
    [SCOI2007] 修车
  • 原文地址:https://www.cnblogs.com/liyuchen/p/7246372.html
Copyright © 2011-2022 走看看