MyBatis使用問題記載

一、前言

之前除了實習(xí)的時候用了oracle之外,一直都是在使用mysql的,但是對于批量插入oracle的支持還是挺特別,其實最后看來,都是支持,只是我們不常這么寫。下面進入重點;

二、mybatis中oracle的批量操作

1、oracle批量插入
最初寫的時候如下:

<insert id="insertBatchInfo" parameterType="java.util.List">
  insert into t_share_time (id,com_id,week,start_time,end_time,create_time)  values
  <foreach collection="list" item="item" index="index" separator=",">
    (#{item.id},#{item.pileId},#{item.week},#{item.startTime},#{item.endTime},now())
  </foreach>
</insert>

所以很明顯,照葫蘆畫瓢,oracle下也這么寫,結(jié)果很明顯,就是報錯

org.springframework.jdbc.BadSqlGrammarException:
### Error updating database. Cause: java.sql.SQLException: ORA-00933: SQL 命令未正確結(jié)束
###the error  occured while setting parameters
###SQL:insert t_custom(custom_id,  create_time, state,  remark,name,custom_type) values (?,?,?,   ?,?,?),(?,?,?,?,?,?),(?,?,?,?,?,?)
Caused by: java.sql.SQLException: ORA-00933: SQL 命令未正確結(jié)束

這可就把我給弄到了,最后搜呀,得到的結(jié)果是

    由于oracle不支持insert多個values的方式

最后寫的方式如下:

  <insert id="insertCommonCustom" parameterType="java.util.List">
           insert  into t_custom(custom_id,  create_time, state,  remark,name,custom_type,
           select seq__custom.nextval, a.*  from(
           <foreach collection="list" item="item" separator=" union all ">
              select 
              #{item.createTime,jdbcType=DATE},
              #{item.state,jdbcType=VARCHAR},
              #{item.remark,jdbcType=VARCHAR},
              #{item.name,jdbcType=VARCHAR},
              #{item.customType,jdbcType=VARCHAR}
               from dual
           </foreach>
           ) a
  </insert>

實際上就是語法,insert into table(**) select ....。
2:mysql對于批量插入的支持注意點

Error code 1064, SQL state 42000: You have an error in your SQL syntax;

此時需要修改你的數(shù)據(jù)庫url,需要加url上加上

allowMultiQueries=true

三,oracel中null的處理

mapper.java層
public Integer updateStus(@Param("sn") String sn,@Param("stus") String stus);

mapper.xml
<update id="updateStus">
    update t_user  t set t.STUS=#{stus} where t.sn=#{sn}
</update>

經(jīng)過測試
如果傳入的sn或者stus都是此"",則不用指定jdbcType;如果傳入null則需要指定jdbcType。但是在mysql中使用mybatis處理則不需要如此的問題。
null報錯如下:

org.mybatis.spring.MyBatisSystemException: nested exception is 
org.apache.ibatis.type.TypeException: Could not set parameters for 
mapping: ParameterMapping{property='types', mode=IN, 
javaType=class java.lang.Long, jdbcType=null, numericScale=null, 
resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: 
org.apache.ibatis.type.TypeException: Error setting null for parameter 
#2 with JdbcType OTHER . Try setting a different JdbcType for this 
parameter or a different jdbcTypeForNull configuration property. Cause: 
java.sql.SQLException: 無效的列類型

四:oracle中插入并返回主鍵數(shù)據(jù)

<insert id="EmailCreate"  parameterType="com.mouse.pojo.Email">
    <selectKey resultType="java.lang.Long" order="BEFORE" keyProperty="emailId">
        SELECT SEQ_MOUSE_EMAIL_ID.NEXTVAL FROM DUAL
    </selectKey>
    insert into t_email_validate (email_id,
                sign_code, status, type, create_by,
                create_time, update_by, update_time) 
                values (#{emailId,jdbcType=BIGINT},
                 #{signCode,jdbcType=VARCHAR},
                #{status,jdbcType=VARCHAR}, #{type,jdbcType=VARCHAR},
                #{createBy,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP},
                #{updateBy,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP})
</insert>   
使用selectKey來對主鍵賦值插入到數(shù)據(jù)庫,最后會將這個值賦值到對象中去,所以在代碼中用Email的對象email.getEmailId()來獲取數(shù)據(jù)。

五:nested exception is java.sql.SQLDataException: ORA-01810: 格式代碼出現(xiàn)兩次
我得插入代碼中寫的sql是to_date('${create_date}','YYYY-MM-DD HH:mm:ss'),
oracle MM和mm是一樣的,所以使用mi去代mm,然后我傳入數(shù)據(jù)"2017-01-09 13:12:00",結(jié)果又提示錯誤

; nested exception is java.sql.SQLDataException: ORA-01849: 小時值必須介于 1 和 12 之間

to_date函數(shù),其格式化的參數(shù)分為兩類,一為12小時制,一為24小時制,默認(rèn)是12小時
to_date需要做進一步修改to_date('${create_date}','YYYY-MM-DD HH24:mm:ss'),

六:無效的列類

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.UncategorizedSQLException: Error setting null for parameter #1 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 無效的列類型: 1111
; uncategorized SQLException for SQL []; SQL state [99999]; error code [17004]; 無效的列類型: 1111; nested exception is java.sql.SQLException: 無效的列類型: 1111

如果插入的數(shù)據(jù)有空的話需要指定數(shù)據(jù)類型

{userName,jdbcType=VARCHAR}或者使用'${userName}'

七:浩語

                                          __                                                        
                            __  _  ____ __|  |__ _____    ___
                            \ \/ \/ /  |  \  |  \\__  \  /  _ \   
                             \     /|  |  /   Y  \/ __ \(  <_> )
                              \/\_/ |____/|___|  (____  /\____/ 
                                                    \/     \/          
                         2016,To Work Hard,To Adapter,To Change Myself
                                                       
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 什么是數(shù)據(jù)庫? 數(shù)據(jù)庫是存儲數(shù)據(jù)的集合的單獨的應(yīng)用程序。每個數(shù)據(jù)庫具有一個或多個不同的API,用于創(chuàng)建,訪問,管理...
    chen_000閱讀 4,124評論 0 19
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 6,219評論 0 4
  • 它靜下來時是空氣 跑起來就成風(fēng)了 嗯 我愛上了你跑來跑去的樣子。
    留子堯閱讀 199評論 0 0
  • 小時候,要是你做事情不聽人勸,總固執(zhí)己見,大人們會說你“犟得像頭驢”,對于驢,能讓人聯(lián)想到的最多的都是“蠢驢...
    奔跑ing的蝸牛閱讀 360評論 0 4

友情鏈接更多精彩內(nèi)容