mybatis中mysql和oracle的区别

   mysql和oracle语法有一定的差异,我们将服务由部署mysql的服务器迁移到部署oracle的服务器上时,需要修改sql语句。下面说说mybatis中由mysql转为oracle需要修改的语句。

1.批量插入

mysql:


<insert id="insertBatch" parameterType="List">  
        insert into black_list  
        (uuid,type,value,delete_flag,gmt_create,gmt_modified) values  
        <foreach collection="list" item="item" index="index"  
            separator=",">  
            (#{item.uuid},#{item.type},#{item.value}  
            #{item.deleteFlag},#{item.gmtCreate},#{item.gmtModified})  
        </foreach>  
    </insert> 

oracle:

 <insert id="insertBatch">  
        <selectKey keyProperty="id" resultType="Long" order="BEFORE">  
            select seq_black_list.nextval as id from dual  
        </selectKey>  
        insert into black_list  
        (id,uuid,type,value,delete_flag,gmt_create,gmt_modified)  
        select seq_black_list.nextval, A.* FROM (  
        <foreach collection="list" item="item" index="index"  
            separator="union all">  
            select  
            #{item.uuid,jdbcType=VARCHAR},  
            #{item.type,jdbcType=VARCHAR},  
            #{item.value,jdbcType=VARCHAR},  
            #{item.deleteFlag,jdbcType=INTEGER},  
            #{item.gmtCreate,jdbcType=DATE},  
            #{item.gmtModified,jdbcType=DATE}  
            from  
            dual  
        </foreach>  
        ) A  
    </insert> 
其中,oracle在执行foreach之前,必须使用select语句。

2.批量更新

mysql:


<update id="batchUpdate"  parameterType="java.util.List">
	 
	      <foreach collection="list" item="item" index="index" open="" close="" separator=";">
				update test 
				<set>
				  test=${item.test}+1
				</set>
				where id = ${item.id}
		 </foreach>
		 
    </update>

oracle:

<update id="batchUpdate"  parameterType="java.util.List">
	 
	   <foreach collection="list" item="item" index="index" open="begin" close="end;" separator=";">
				update test 
				<set>
				  test=${item.test}+1
				</set>
				where id = ${item.id}
	   </foreach>
		 
    </update>
其中,oracle的foreach语句需要用begin和end包起来。

3.limit

mysql:

SELECT * FROM tablename LIMIT 100,15

oracle:


 select * from 
     (select A.*,rownum rn from
            (   
                   原mysql的语句,注意去掉limit
             )A 
            where rownum > 100
      )
      where rn <= 115

由于oracle中没有limit,因此可以通过rownum来实现相同的效果。

4.自增主键

mysql:

<insert id="insert" parameterType="Role" useGeneratedKeys="true" keyProperty="roleId">
    insert into role (name, create_time, update_time) values (#{name,jdbcType=VARCHAR}, now(), now())
</insert>

oracle:

在执行插入之前,需要创建一个序列:

create sequence SEQ_T_USER_ID
       minvalue 1
       maxvalue 9999999999999999999999999999
       start with 1
       increment by 1
       cache 20;

序列生成后,就可以始终该序列实现主键自增的效果:

<insert id="insert" parameterClass="ROLE">
<selectKey resultType="java.lang.Long" order="AFTER" keyProperty="roleId"> 
       SELECT SEQ_T_USER_ID.currval as ROLEID from DUAL 

  </selectKey>
 insert into ROLE(ID, NAME, CREATE, MODIFY) values (#{id}, #{name}, sysdate, sysdate)
</insert>

mysql可以通过设置useGeneratedKeys为true来实现主键自增,oracle的语法不支持。为解决mysql和oracle的主键自增问题,可以用另外一张表TEMP记录其他表的主键,在插入时,由TEMP获取相应表的主键值,将其插入。


5.时间操作

mysql:

返回系统日期,输出 2009-12-25 14:38:59
select now();
输出 09-12-25
select date_format(now(),'%y-%m-%d');

获得当前 UTC 日期时间函数:utc_date(), utc_time(), utc_timestamp()

当前时间减去7分钟的时间 :select date_sub(now(),interval 7 minute);

获取时间戳:select unix_timestamp('2008-08-08'); -- 1218124800

oracle:


获取系统日期:  SYSDATE()
格式化日期:     TO_CHAR(SYSDATE(),'YY/MM/DD HH24:MI:SS')
返回系统日期,输出 25-12月-09
select sysdate from dual;
mi是分钟,输出 2009-12-25 14:23:31
select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;
当前时间减去7分钟的时间 
select sysdate,sysdate - interval '7' MINUTE from dual; 
获取时间戳:SELECT (SYSDATE - TO_DATE('1970-1-1 8','YYY-MM-DD HH24'))*86400 FROM DUAL;
用当前的时间减去1970年1月1日8时,得到的天数乘以24小时乘以3600秒,得到的结果就是系统时间戳。
这里用8时的原因时系统所处时区为东8区

含义解释: 
Dual伪列
      Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的select语句块中。
      不同系统可能返回日期的格式不一样。
      返回当前连接的用户:select user from dual;




  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JavaSE、Redis和JavaWeb、Spring、Hibernate、MyBatisMySQLOracle都是Java开发非常常用的技术,每个技术都有着不同的难点和学习曲线。 JavaSE是Java标准版,是Java编程的基础,包括了Java的基本语法、面向对象编程、集合框架、输入输出、多线程、网络编程等内容。对于初学者来说,JavaSE的学习难度较低。 Redis是一款基于内存的高性能键值存储系统,用于缓存、消息队列和实时数据处理等场景。Redis的学习难度较低,但要深入了解其底层原理和使用场景,需要更多的实践和经验。 JavaWeb是指在Java平台上进行Web开发,包括了Servlet、JSP、JDBC、HTML等内容。JavaWeb的学习难度较低,但需要掌握一些基本的Web开发技能和常用的Web框架。 Spring是一个开源的企业级应用开发框架,主要用于简化企业级应用的开发。Spring的学习难度较高,需要深入理解其设计思想和核心原理,同时需要掌握许多Spring相关的技术和工具。 Hibernate是一个开源的对象关系映射框架,用于将Java对象映射到关系数据库。Hibernate的学习难度较高,需要掌握一些ORM相关的基础知识和Hibernate的使用方法。 MyBatis是一个开源的持久层框架,用于将SQL语句和Java对象进行映射。MyBatis的学习难度较高,需要掌握一些基本的ORM相关知识和MyBatis的使用方法。 MySQLOracle都是关系型数据库管理系统,用于存储和管理数据。MySQL的学习难度较低,但需要掌握一些基本的SQL语句和MySQL的使用方法。Oracle的学习难度较高,需要掌握一些高级SQL语句和Oracle的使用方法,同时还需要了解Oracle的体系结构和底层原理。 综上所述,每个技术都有着不同的难点和学习曲线,没有哪个技术一定比其他技术更难。学习Java开发需要全面掌握这些技术,并且注重理论和实践的结合,才能够成为一名优秀的Java程序员。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值