由于页面表单内容实在太多(提交一个表单的数据需要存放到多张数据库表里面,页面每个tag内容对应一个数据表),所以在springMvc的Controller方法中使用Map进行接收页面表单参数(此时需要保证多个Entity里面的属性互不相同,否则在表单参数封装到Map里面时会出现覆盖现象),表单页面如下:
前端ajax代码如下:
//获取所有tag里面包含name属性的dom元素内容,汇总到 ajaxData中
var ajaxData = $("#formData").serialize();
$.ajax({
type : "POST",
url : "/chinalco/tenderProject/api/saveOrUpdate",
data : ajaxData,
dataType : "json",
success : function(result) {
if (result.result == "success") {
layer.close(index);
layer.msg("操作成功",{icon:1});
setTimeout(function() {
location.href = "/chinalco/tenderProject/index";
}, 2000)
} else if (result.result == "failed") {
layer.alert("保存失败!");
layer.close(index);
}
},
error : function() {
layer.alert("保存失败!");
layer.close(index);
}
});
前端的ajax请求提交到后台SpringMVC的controller中使用的是@RequestParam Map<String,String> paramsMap参数接收ajax的序列化参数,后台方法如下:
@RequestMapping(value = "/saveOrUpdate", produces = "application/json; charset=UTF-8")
public String saveOrUpdate(@RequestParam Map<String,String> paramsMap) {
Map<String, Object> resultMap = new HashMap<String, Object>();
Subject subject = SecurityUtils.getSubject();
Session session = subject.getSession();
User user = (User) session.getAttribute(Constants.SESSION_USER);
paramsMap.put("insert_people", user.getUserId());
try {
tenderProjectService.saveOrUpdate(paramsMap);
resultMap.put("result", "success");
} catch (Exception e) {
e.printStackTrace();
resultMap.put("message", e.getMessage());
resultMap.put("result", "failure");
}
return JsonKit.toJson(resultMap);
}
在后台的Map参数paramsMap里面包含了多张数据表的内容,那么如何将其转换为每张表对应的Entity呢?如果表单内容较少的话可使用map.get("key")的方式获取值然后使用entity.setter方法放到Entity里面,但是我遇到的表单内容实在太多了,所以还是使用反射来实现Map转Entity吧,代码如下:
public void mapToEntity(Object entity,Map<String, String> paramsMap) throws Exception {
Field[] tenderProjectFields = entity.getClass().getDeclaredFields();
for (int i = 0; i < tenderProjectFields.length; i++) {
String fieldName = tenderProjectFields[i].getName();
String paramsMapVlue = paramsMap.get(fieldName);
if (StringUtils.isEmpty(paramsMapVlue)) {
continue;
}
tenderProjectFields[i].setAccessible(true);
tenderProjectFields[i].set(entity, paramsMapVlue);
//System.out.println(fieldName + " = " + paramsMapVlue);
}
}
业务层代码就是分别封装各个Entity并且向数据表执行insert操作了:
@Override
@Transactional(rollbackForClassName = "Exception")
public void saveOrUpdate(Map<String, String> paramsMap) throws Exception {
TenderProject tenderProject = new TenderProject();
mapToEntity(tenderProject,paramsMap);// chinalco_tender_project主表数据
TenderProjectScore tenderProjectScore = new TenderProjectScore();
mapToEntity(tenderProjectScore,paramsMap);// chinalco_tender_project_score从表数据
TenderProjectNotice tenderProjectNotice = new TenderProjectNotice();
mapToEntity(tenderProjectNotice,paramsMap);//chinalco_project_notice表赋值
TenderProjectBidGeneral tenderProjectBidGeneral = new TenderProjectBidGeneral();
mapToEntity(tenderProjectBidGeneral,paramsMap);//chinalco_project_bid_general表赋值
TenderProjectBidDoc tenderProjectBidDoc = new TenderProjectBidDoc();
mapToEntity(tenderProjectBidDoc,paramsMap);//chinalco_project_bid_doc表赋值
TenderProjectBidOpen tenderProjectBidOpen = new TenderProjectBidOpen();
mapToEntity(tenderProjectBidOpen,paramsMap);//chinalco_project_bid_doc表赋值
tenderProject.setUpdatePeople(paramsMap.get("insert_people"));
tenderProject.setUpdateTime(sdf.format(new Date()));// 创建时间
if (StringUtils.isEmpty(tenderProject.getId()))
//chinalco_tender_project主表操作
tenderProject.setIsDelete(DeleteNormalType.NORMAL);
tenderProject.setId(RandomKit.randomStr());
tenderProject.setInsertPeople(paramsMap.get("insert_people"));
tenderProject.setInsertTime(sdf.format(new Date()));
tenderProjectMapper.insertSelective(tenderProject);
//chinalco_tender_project_score从表操作
tenderProjectScore.setId(RandomKit.randomStr());
tenderProjectScore.setProjectId(tenderProject.getId());
tenderProjectScoreMapper.insertSelective(tenderProjectScore);
//chinalco_project_notice从表操作
tenderProjectNotice.setId(RandomKit.randomStr());
tenderProjectNotice.setProjectId(tenderProject.getId());
tenderProjectNoticeMapper.insertSelective(tenderProjectNotice);
//chinalco_project_bid_general从表操作
tenderProjectBidGeneral.setId(RandomKit.randomStr());
tenderProjectBidGeneral.setProjectId(tenderProject.getId());
tenderProjectBidGeneralMapper.insertSelective(tenderProjectBidGeneral);
//chinalco_project_bid_doc从表操作
tenderProjectBidDoc.setId(RandomKit.randomStr());
tenderProjectBidDoc.setProjectId(tenderProject.getId());
tenderProjectBidDocMapper.insertSelective(tenderProjectBidDoc);
//chinalco_project_bid_open从表操作
tenderProjectBidOpen.setId(RandomKit.randomStr());
tenderProjectBidOpen.setProjectId(tenderProject.getId());
tenderProjectBidOpenMapper.insertSelective(tenderProjectBidOpen);
} else {// 执行update
//chinalco_tender_project主表操作
tenderProjectMapper.updateByPrimaryKeySelective(tenderProject);
String projectId = tenderProject.getId();
//chinalco_tender_project_score从表操作
tenderProjectScoreMapper.deleteByProjectId(projectId);// 删除从表旧数据
tenderProjectScore.setId(RandomKit.randomStr());
tenderProjectScore.setProjectId(projectId);
tenderProjectScoreMapper.insertSelective(tenderProjectScore);// 保存从表新数据
//chinalco_project_notice从表操作
tenderProjectNoticeMapper.deleteByProjectId(projectId);
tenderProjectNotice.setId(RandomKit.randomStr());
tenderProjectNotice.setProjectId(projectId);
tenderProjectNoticeMapper.insertSelective(tenderProjectNotice);
//chinalco_project_bid_general从表操作
tenderProjectBidGeneralMapper.deleteByProjectId(projectId);
tenderProjectBidGeneral.setId(RandomKit.randomStr());
tenderProjectBidGeneral.setProjectId(projectId);
tenderProjectBidGeneralMapper.insertSelective(tenderProjectBidGeneral);
//chinalco_project_bid_doc从表操作
tenderProjectBidDocMapper.deleteByProjectId(projectId);
tenderProjectBidDoc.setId(RandomKit.randomStr());
tenderProjectBidDoc.setProjectId(projectId);
tenderProjectBidDocMapper.insertSelective(tenderProjectBidDoc);
//chinalco_project_bid_open从表操作
tenderProjectBidOpenMapper.deleteByProjectId(projectId);
tenderProjectBidOpen.setId(RandomKit.randomStr());
tenderProjectBidOpen.setProjectId(projectId);
tenderProjectBidOpenMapper.insertSelective(tenderProjectBidOpen);
}
}