最近项目(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奋斗的小蘑菇