先吐槽一下csdn,博客写到一半居然卡死了,还没有保存,又得重新码字(微笑脸)。
这篇博客提供一个详细的批量插入例子和记录自己踩过的坑。刚开始使用mybatis不久,写的不对的地方还望大佬指正。
ibatis的单条插入操作这里不做累述,网上教程还是很多的,对于批量操作网上很多的教程是mybatis,没有办法公司还是用的ibatis(我有什么办法我也很无赖),ibatis里面是不支持foreach的,但是还好提供了iterate。
<insert id="savePersonalCallOutTaskInfo" parameterClass="java.util.List" >
insert into t_task_manage_info ( assigner_id, allocate_count, execute_count,
dial_count, callout_task_id, begin_time, end_time, account) values
<iterate conjunction="," >
(
#list[].assignerId#,
#list[].allocateCount#,
#list[].executeCount#,
#list[].dialCount#,
#list[].calloutTaskId#,
#list[].beginTime#,
#list[].endTime#,
#list[].account#
)
</iterate>
</insert>
这是一个很详细的例子,如果大家第一次尝试可以仿照。
我踩过的坑:
1.<iterate property> 如果你传入的参数是List,那么property属性是不用写(网上很多人说这是必填,坑爹啊),否则会报以下错误
Cause: com.ibatis.common.beans.ProbeException: Error getting ordinal list from JavaBean. Cause java.lang.StringIndexOutOfBoundsException: String index out of range: -1
是的你没有看错,越界问题。这里我也不清楚为什么会报这个错,还望大佬赐教。这个属性的作用在于你传参为Map的时候用。
2.<iterate open="(" close=")"> open和close分别是循环开始和结束的符号,这里加入的sql语句明显有错误,由于楼主手生第一次写加了以后报一下错误
Cause: java.sql.SQLException: Column count doesn't match value count at row 1
参数不匹配,刚开始还以为是自己少写参数或者少传参数了。去网上找了会,发现是自己对于open和close的意思误解了。
3.还有一点需要注意就是入参是需要判断是否为null的。这个问题我没遇到过,但是前辈特别交代过所以还是提一下吧。