mybatis中mysql和oracle的區別

 

   mysql和oracle語法有必定的差別,咱們將服務由部署mysql的服務器遷移到部署oracle的服務器上時,須要修改sql語句。下面說說mybatis中由mysql轉爲oracle須要修改的語句。html

1.批量插入

mysql:

 

[html]  view plain  copy
  1. <span style="font-size:14px;">  
  2. <insert id="insertBatch" parameterType="List">    
  3.         insert into black_list    
  4.         (uuid,type,value,delete_flag,gmt_create,gmt_modified) values    
  5.         <foreach collection="list" item="item" index="index"    
  6.             separator=",">    
  7.             (#{item.uuid},#{item.type},#{item.value}    
  8.             #{item.deleteFlag},#{item.gmtCreate},#{item.gmtModified})    
  9.         </foreach>    
  10.     </insert>   
  11.   
  12. </span>  
oracle:
[html]  view plain  copy
  1. <span style="font-size:14px;">  
  2.  <insert id="insertBatch">    
  3.         <selectKey keyProperty="id" resultType="Long" order="BEFORE">    
  4.             select seq_black_list.nextval as id from dual    
  5.         </selectKey>    
  6.         insert into black_list    
  7.         (id,uuid,type,value,delete_flag,gmt_create,gmt_modified)    
  8.         select seq_black_list.nextval, A.* FROM (    
  9.         <foreach collection="list" item="item" index="index"    
  10.             separator="union all">    
  11.             select    
  12.             #{item.uuid,jdbcType=VARCHAR},    
  13.             #{item.type,jdbcType=VARCHAR},    
  14.             #{item.value,jdbcType=VARCHAR},    
  15.             #{item.deleteFlag,jdbcType=INTEGER},    
  16.             #{item.gmtCreate,jdbcType=DATE},    
  17.             #{item.gmtModified,jdbcType=DATE}    
  18.             from    
  19.             dual    
  20.         </foreach>    
  21.         ) A    
  22.     </insert> </span>  
其中,oracle在執行foreach以前,必須使用select語句。

 

2.批量更新

mysql:

 

[html]  view plain  copy
  1. <span style="font-size:14px;">  
  2. <update id="batchUpdate"  parameterType="java.util.List">  
  3.        
  4.           <foreach collection="list" item="item" index="index" open="" close="" separator=";">  
  5.                 update test   
  6.                 <set>  
  7.                   test=${item.test}+1  
  8.                 </set>  
  9.                 where id = ${item.id}  
  10.          </foreach>  
  11.            
  12.     </update>  
  13.   
  14. </span>  

oracle:java

 

[html]  view plain  copy
  1. <update id="batchUpdate"  parameterType="java.util.List">  
  2.        
  3.        <foreach collection="list" item="item" index="index" open="begin" close="end;" separator=";">  
  4.                 update test   
  5.                 <set>  
  6.                   test=${item.test}+1  
  7.                 </set>  
  8.                 where id = ${item.id}  
  9.        </foreach>  
  10.            
  11.     </update>  
其中,oracle的foreach語句須要用begin和end包起來。

 

3.limit

mysql:mysql

 

[html]  view plain  copy
  1. SELECT * FROM tablename LIMIT 100,15  
 

oracle:sql

 

 

[html]  view plain  copy
  1. select * from   
  2.     (select A.*,rownum rn from  
  3.            (     
  4.                   原mysql的語句,注意去掉limit  
  5.             )A   
  6.            where rownum > 100  
  7.      )  
  8.      where rn <= 115  
 

因爲oracle中沒有limit,所以能夠經過rownum來實現相同的效果。服務器

4.自增主鍵

mysql:mybatis

 

[html]  view plain  copy
  1. <insert id="insert" parameterType="Role" useGeneratedKeys="true" keyProperty="roleId">  
  2.     insert into role (name, create_time, update_time) values (#{name,jdbcType=VARCHAR}, now(), now())  
  3. </insert>  

oracle:

在執行插入以前,須要建立一個序列:oracle

 

[sql]  view plain  copy
  1. create sequence SEQ_T_USER_ID  
  2.        minvalue 1  
  3.        maxvalue 9999999999999999999999999999  
  4.        start with 1  
  5.        increment by 1  
  6.        cache 20;  

序列生成後,就能夠始終該序列實現主鍵自增的效果:函數

 

[html]  view plain  copy
  1. <insert id="insert" parameterClass="ROLE">  
  2. <selectKey resultType="java.lang.Long" order="AFTER" keyProperty="roleId">   
  3.        SELECT SEQ_T_USER_ID.currval as ROLEID from DUAL   
  4.   
  5.   </selectKey>  
  6.  insert into ROLE(ID, NAME, CREATE, MODIFY) values (#{id}, #{name}, sysdate, sysdate)  
  7. </insert>  

mysql能夠經過設置useGeneratedKeys爲true來實現主鍵自增,oracle的語法不支持。爲解決mysql和oracle的主鍵自增問題,能夠用另一張表TEMP記錄其餘表的主鍵,在插入時,由TEMP獲取相應表的主鍵值,將其插入。

 

5.時間操做

mysql:ui

 

[sql]  view plain  copy
  1. 返回系統日期,輸出 2009-12-25 14:38:59  
  2. select now();  
  3. 輸出 09-12-25  
  4. select date_format(now(),'%y-%m-%d');  
  5.   
  6. 得到當前 UTC 日期時間函數:utc_date(), utc_time(), utc_timestamp()  
  7.   
  8. 當前時間減去7分鐘的時間 :select date_sub(now(),interval 7 minute);  
  9.   
  10. 獲取時間戳:select unix_timestamp('2008-08-08'); -- 1218124800  
 

oracle:spa

 

 

[sql]  view plain  copy
  1. 獲取系統日期:  SYSDATE()  
  2. 格式化日期:     TO_CHAR(SYSDATE(),'YY/MM/DD HH24:MI:SS')  
  3. 返回系統日期,輸出 25-12月-09  
  4. select sysdate from dual;  
  5. mi是分鐘,輸出 2009-12-25 14:23:31  
  6. select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;  
  7. 當前時間減去7分鐘的時間   
  8. select sysdate,sysdate - interval '7' MINUTE from dual;   
  9. 獲取時間戳:SELECT (SYSDATE - TO_DATE('1970-1-1 8','YYY-MM-DD HH24'))*86400 FROM DUAL;  
  10. 用當前的時間減去1970年1月1日8時,獲得的天數乘以24小時乘以3600秒,獲得的結果就是系統時間戳。  
  11. 這裏用8時的緣由時系統所處時區爲東8區  
  12.   
  13. 含義解釋:   
  14. Dual僞列  
  15.       Dual 是 Oracle中的一個實際存在的表,任何用戶都可讀取,經常使用在沒有目標表的select語句塊中。  
  16.       不一樣系統可能返回日期的格式不同。  
  17.       返回當前鏈接的用戶:select user from dual;  
相關文章
相關標籤/搜索