1. MyBatis版本:
3.4.6
2. 批量新增代码:
int insertBatch(@Param("dataList")List<Object> dataList);
<insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
insert into test(name) values
<foreach collection="dataList" item="item" index="index" separator=",">
(#{item.name, jdbcType=VARCHAR})
</foreach>
</insert>
3. 返回结果没有id,Jdbc3KeyGenerator部分源码:
判断入参getParameters()
if (parameter instanceof Collection) {
parameters = (Collection)parameter;
} else if (parameter instanceof Map) {
if (parameterMap.containsKey("collection")) { parameters = (Collection)parameterMap.get("collection");
} else if (parameterMap.containsKey("list")) { parameters = (List)parameterMap.get("list");
} else if (parameterMap.containsKey("array")) { parameters = Arrays.asList((Object[])((Object[])parameterMap.get("array"))); }
}
if (parameters == null) {
parameters = new ArrayList();
((Collection)parameters).add(parameter);
}
由代码可知Mybatis通过指定参数名获取数据,例如:list、array等,当自定义参数名,则强转为集合类型,后续转化会出现异常,导致id为空,部分getTypeHandlers代码
TypeHandler th;
try {
Class<?> keyPropertyType = metaParam.getSetterType(keyProperties[i]);
} catch (BindingException var9) {
th = null;
}
4. 解决方法
将形参名称修改为list
int insertBatch(@Param("list")List<Object> dataList);