ibatis 批量插入
1.说明
基于oracle的sql语句
2.主键id有默认值,比如:sys_guid()
id有默认值的情况下,插入的时候,不再声明该字段,当插入一条数据的时候,oracle会自动生成id。
<insert id="insertCONSULT_SCHEDULE_batch" parameterClass="java.util.List">
<!--说明: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,可以做数据类型转换;
当表字段设有默认值时,可以不插入该字段,数据库在插入该条记录时,会自动为设有默认值的字段插入默认值。
当使用iterate进行批量插入时,在标签外必须加上一个select语句。
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字段默认值为系统时间
2022年4月16日18:55:09
业务调用示例
/**
* 批量插入检测结果及报告(自动)
* @explain
* @param paramMap
* @return
* @throws SaveException
*/
public Object insertWJ_PATIENT_DETAILINFO_RESULTSearch(List<Map<String, String>> paramsList, String CONSULT_APPLY_ID) throws SaveException{
try {
if (null == paramsList || paramsList.isEmpty) {
throw new RuntimeException("保存失败:检测结果不能为空");
}
// 批量插入
daoWJ_PATIENT_DETAILINFO_RESULT.insertWJ_PATIENT_DETAILINFO_RESULTSearch(paramsList);
Map<String, String> consultMap = new HashMap<>(2);
consultMap.put("CONSULT_APPLY_ID", CONSULT_APPLY_ID);
// 会诊状态(已填报)
consultMap.put("CONSULT_STATUS", String.valueOf(ConsultStatusEnum.TIANBAO.getStatus()));
// 更新会诊状态
daoWJ_CONSULT_INFO.updateWJ_CONSULT_INFODynamic(consultMap);
} catch (Exception e) {
log.error(e.getMessage());
// 抛出运行异常,spring会自动进行事务回滚(已配置好)
throw new RuntimeException(e.getMessage(), e);
}
return null;
}
相关推荐:
哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/9252768.html