一、前言
之前除了實(shí)習(xí)的時(shí)候用了oracle之外叶组,一直都是在使用mysql的拯田,但是對于批量插入oracle的支持還是挺特別,其實(shí)最后看來甩十,都是支持勿锅,只是我們不常這么寫。下面進(jìn)入重點(diǎn)枣氧;
二溢十、mybatis中oracle的批量操作
1、oracle批量插入
最初寫的時(shí)候如下:
<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é)果很明顯酪劫,就是報(bào)錯(cuò)
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多個(gè)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>
實(shí)際上就是語法覆糟,insert into table(**) select ....刻剥。
2:mysql對于批量插入的支持注意點(diǎn)
Error code 1064, SQL state 42000: You have an error in your SQL syntax;
此時(shí)需要修改你的數(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報(bào)錯(cuò)如下:
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ù)庫漓藕,最后會將這個(gè)值賦值到對象中去,所以在代碼中用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é)果又提示錯(cuò)誤
; nested exception is java.sql.SQLDataException: ORA-01849: 小時(shí)值必須介于 1 和 12 之間
to_date函數(shù)享钞,其格式化的參數(shù)分為兩類,一為12小時(shí)制诀蓉,一為24小時(shí)制,默認(rèn)是12小時(shí)
to_date需要做進(jìn)一步修改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