需要给项目添加批量处理操作,之前没有做过ssm框架的批量,在这个过程中遇到好几个坑,记录下来,避免下次再犯错误。
可以把数组序列化成Json字符串提交,后台springmvc里用@ RequestBody String 方式接收,然后把这个接收到的json串用json工具转换为数组,这样就解决了springmvc不能绑定对象数组的问题了。
将对象数组用{“list”:JSON.stringify(array)}绑定到后台,后台用@RequestBody String configs接收,接收的是json数据,然后用jackson把configs转为数组List configList。
var configList= JSON.stringify([
{configName: "sgs-demo", configId: "1"},
{configName: "sgs-demo-1", configId: "2"}
]);
$.ajax({
type: "post",
url: "doRedistribution.do",
data:configList ,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response, ifo) {
alert("success");
}, error: function () {
alert("error");
}
})
dataType:‘json’,//预期的服务器响应的数据类型。
contentType: “application/json; charset=utf-8”,//发送数据到服务器时所使用的内容类型。默认是:“application/x-www-form-urlencoded”。
如果不加contentType,configs接收的数据为类似%7B%22id%22%3A243%2C%name%22%3A4%2C%22age%22%3A1048%2C%22格式,json转换会报错,
controller层
@RequestMapping(value="doRedistribution.do")
@ResponseBody
public Map<String, Object> doRedistribution(HttpServletRequest request,RedirectAttributes attr,@RequestBody String CustAdminuser){
Map<String, Object> resultMap = new HashMap<>();
try{
Gson gson = new Gson();
List<CustAdminuser> list = gson.fromJson(CustAdminuser, new TypeToken<ArrayList<CustAdminuser>>() {}.getType());
//这个地方特别注意,将json转换成 list
for(int i = 0;i<list.size();i++){//循环list
list.get(i).setHistory(Constant.history_new); //获取list 中对象,给对象添加相应的对象
list.get(i).setAssigner(LUser.getRyId());
list.get(i).setDeptid(LUser.getRyDeptId());
list.get(i).setCustAdminuserId(SequenceUtil.getSerial());
list.get(i).setCause(Constant.Redistribution);
list.get(i).setHistory(Constant.history_new);
list.get(i).setIsLocked(Constant.state_old);
list.get(i).setView(Constant.state_old);
list.get(i).setPicked(Constant.state_old);
list.get(i).setCommed(Constant.state_old);
list.get(i).setInterviewed(Constant.state_old);
}
custAdminuserService.doAddCustAdminuserByBatch(list);
resultMap.put("status", 200);
resultMap.put("message", "成功!");
}catch(Exception e){
resultMap.put("status", 500);
resultMap.put("message", "失败!");
}
return resultMap;
}
批量在新增mapper.xml
<!-- 批量新增 -->
<insert id="addCustAdminuserByBatch" parameterType="java.util.List">
insert into CustAdminuser
(CustAdminuserId,custid,adminuserID,assigner,assignedTime,createTime,cause,history,deptid,isLocked,View,picked,Commed,interviewed)
values
<foreach collection="list" item="item" index="index" separator="," >
(#{item.CustAdminuserId},#{item.custid},#{item.adminuserID},#{item.assigner},now(),now(),#{item.cause},#{item.history},#{item.deptid},#{item.isLocked},#{item.View},#{item.picked},#{item.Commed},#{item.interviewed})
</foreach>
</insert>
批量在修改mapper.xml
<if test="list!=null">
update CustAdminuser set
history='1'
where 1 = 1 and CustAdminuserId in
<foreach collection="list" item="item" index="index" separator="," open="(" close=")">
#{item.CustAdminuserId}
</foreach>
</if>
</update>
这个地方写了一个SQL语句 条件 放在了in中 (update set xx=? where id in(?,?,?,?,?,?))
写成多个SQL出现事务问题,解决不了只能用上边的方法。
当同时执行多条SQL语句的时候,需要在Mybatis配置文件中进行allowMultiQueries配置:
url = jdbc:mysql://xxxxxxx:3306/fg_test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true