ibatis 批量插入
CreationTime--2018年7月2日10點21分
Author:Marydon
1.說明
基於oracle的sql語句
2.主鍵id有默認值,比如:sys_guid()
id有默認值的情況下,插入的時候,不再聲明該字段,當插入一條數據的時候,oracle會自動生成id。
<insert id="insertCONSULT_SCHEDULE_batch" parameterClass="java.util.List"> INSERT ALL <iterate conjunction=" "> INTO CONSULT_SCHEDULE (ORG_CODE,DEPENT_ID,DEPENT_NAME,DOCTOR_ID,DOCTOR_NAME,DOCTOR_PHONE,SCHEDULE_DATE,WEEK_TXT,WB_TYPE,CLOSE_TZ,REPLACE_TZ,REMARK) VALUES <![CDATA[ (#list[].ORG_CODE:VARCHAR#, #list[].DEPENT_ID:VARCHAR#, #list[].DEPENT_NAME:VARCHAR#, #list[].DOCTOR_ID:VARCHAR#, #list[].DOCTOR_NAME:VARCHAR#, #list[].DOCTOR_PHONE:VARCHAR#, TO_DATE(#list[].SCHEDULE_DATE#,'yyyy-MM-dd'), #list[].WEEK_TXT:VARCHAR#, #list[].WB_TYPE:VARCHAR#, #list[].CLOSE_TZ:VARCHAR#, #list[].REPLACE_TZ:VARCHAR#, #list[].REMARK:VARCHAR#) ]]> </iterate> SELECT 1 FROM DUAL </insert>
字符串需要聲明jdbc類型為VARCHAR,可以做數據類型轉換;
當表字段設有默認值時,可以不插入該字段,數據庫在插入該條記錄時,會自動為設有默認值的字段插入默認值。
3.主鍵id使用序列
id使用序列,需要先查出來序列的值作為id,手動插入到數據庫。
<!-- 圖像表 批量插入sql --> <insert id="insertIMAGE_INFOBatch" parameterClass="java.util.List"> INSERT INTO IMAGE_INFO (ID,FORM_LIST_ID,IMAGE_NAME) SELECT SEQ_IMAGE_INFO.NEXTVAL,FORM_LIST_ID,IMAGE_NAME FROM ( <iterate conjunction="UNION ALL" prepend=""> <![CDATA[ SELECT #list[].FORM_LIST_ID:DECIMAL# AS FORM_LIST_ID, #list[].IMAGE_NAME:VARCHAR# AS IMAGE_NAME FROM DUAL ]]> </iterate> ) </insert>
由於oracle的序列的數據類型是number,因此其對應的jdbc類型為DECIMAL。
4. 注意
iBATIS使用這種批量插入操作,局限性在於:
每次插入的總數據不能超過1000(插入字段數*插入行數<=1000),使用大集合拆分成小集合的方式來限制每次插入數量不超過1000即可。
2020/04/21
效果展示
實際執行的sql

插入結果:id字段是序列,上面已經對序列進行了查詢;createtime字段默認值為系統時間

