近日项目中使用到了SpringBoot+MyBatis,有些同学估计是来秀实力的,或者说我太菜了~~~
整了个批量insert map集合,还带嵌套的,具体情况如下:
params为入参集合,即Map<String, Object> params,包含入参十来项,下文从中提取其中两项range、id:
Map<String, Object> dataMap= new HashMap<>;
dataMap.put("range",params.get("range"));
dataMap.put("taskId",params.get("id"));
xxxService.addTaskRange(dataMap);//controller调用serviceImpl实现
实际,他是这么写的
xxxService.addTaskRange(new HashMap<String,Object>(){{
put("range",params.get("range"));
put("taskId",params.get("id"));
}});
MapUtil.addBaseField(snowflake_task,dataMap);//snowflake_task利用雪花算法取了个id,addBaseField通用字段追加(如创建人、创建时间等)。
注意:range中包含range_org对象集合和range_pc集合。
Mapper.xml文件里,向两张不同的表中insert数据:
<insert id="addTaskRange" parameterType="java.util.Map"> INSERT INTO tb_namea (f_taskId,f_orgId,f_allChildren,create_user,create_time,update_user,update_time,tenant_id) VALUES <foreach collection="range.range_org" item="org" separator="," > (#{taskId},#{org.orgId},#{org.allChildren},#{create_user},#{create_time},#{update_user},#{update_time},#{tenantId}) </foreach> ; INSERT INTO tb_nameb (f_taskId,f_compId,create_user,create_time,update_user,update_time,tenant_id) VALUES <foreach collection="range.range_pc" item="item" separator="," > (#{taskId},#{item},#{create_user},#{create_time},#{update_user},#{update_time},#{tenantId}) </foreach> ; </insert>
看这SQL写的,也没啥毛病,就是一执行就报错,还报的是sql拼写、传参的错,于是我就把SQL贴出来放数据库执行,然而并没有错,就是放程序里跑就报错。找了小半天不知道是什么问题,然后咱就单条入库试试,尽然成功了!!!!百度了一把,原来是数据库连接配置的时候需要设置mybatis需要支持批量操作,具体配置如下:
jdbc:mysql://127.0.0.1:3306/chksys?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true&allowMultiQueries=true
问了提交的同事,一口咬定自己全部提交了,自己那儿啥问题没有,咋就整到我这儿就不好使了呢~~~~~
自己还是得认真修炼呀!!!!