一、前提
需求新加了个bean修改的方法,因为不想使用公司的轮子,就自己写了个多参数动态提交的方法,项目的框架是EJB3+JPA,这里记录一下给需要用的人。
三、思路
1.前端根据页面单个表单传递的数据和修改后的表单数据做对比,只将更改过的表单数据传递到后台中;
2.后台得到前端传递的数据,转型为map,根据map的key与value动态的交给JPA Query拼接sql并执行;
3.这里需要注意的是,因为是根据map中的key与value,所以前端传递的key需要与库中的bean表中的属性名称相同。
二、代码
1.dao层
@Override
public String updateManifestByCode(String code,Map<String, String> map) {
JSONObject jobj = new JSONObject();
try {
StringBuffer keys = new StringBuffer("");
List<String> values = new ArrayList<String>();
//遍历map参数添加到sql参数中
for(Entry<String, String> entry : map.entrySet()){
if(keys.length()>0){//非第一次添加
keys.append(" , "+entry.getKey()+" = ?");
}else{//第一次添加
keys.append(entry.getKey()+" = ?");
}
values.add(entry.getValue());
}
StringBuffer sql = new StringBuffer("update DPS_MANIFEST_APPLY set ");
sql.append(keys+" where code = ?");
System.out.println("当前拼接的sql为:\n"+sql.toString());
Query query = em.createNativeQuery(sql.toString());
for (int i = 0; i < values.size(); i++) {
query.setParameter(i+1, values.get(i));
}
query.setParameter(values.size()+1,code);
int num = query.executeUpdate();
if(num>0){
jobj.put("Success", "true");
jobj.put("Info", "修改成功!正在跳转...");
}else{
jobj.put("Success", "false");
jobj.put("Info", "修改失败!正在返回...");
}
} catch (Exception e) {
jobj.put("Error", "false");
jobj.put("Info", "发生错误!请重试...");
}
return jobj.toString();
}
2.servlet里定义了好了json的格式,所以只对需要处理的数据进行处理就行了
String code = jsonObject.getString("code");
Map<String,String> map = new HashMap<String,String>();
String jmap = jsonObject.getString("manifest");
map = (Map<String, String>) JSON.parse(jmap);
3.soa前后台分离,所以前台js不是我写的,但是也学到一点东西,对于定义好的对象,是可以直接obj.prop = prop的,我一直以为是需要先定义属性再添加的。
-end-