用java写相同属性的接口的时候
比如修改实体A的属性b和属性c,之前往往会有两种方案
1写两个接口
2是写一个接口,传递多个参数,加上非空判断。
看到spring mvc可以很方便利用 视图,控制器,模型,view视图自动给model实例对象赋值保存。
但是如果网站是前后端分离的,这种接口形式也要实现这一种保存方式,可以利用泛型完成。
实现思路:
1从前台组装实体类的一部分属性值构成JSON字符串传回后台接口,利用mvc @RequestBody 自动给实体类A赋值
2 这个实体类A在JSON字符串的属性不存在时候,属性值为空
3 这个实体类必须含有一个主键ID,通过这个ID从数据库获取数据库之前的实体类B
4 判断A的所有属性的属性值是否为空,不为空就赋值给实体类B相应属性的属性值,保存到数据库
步骤
1前台使用ajax技术,传递json字符串到后台;
前台字符串形式可以是多种,都能新增和修改成功
{"id":1,"name":"test"}
{"id":1,"sort":1,"name":"test"}
2 后台使用Spring MVC注解@RequestBody 接受前台传递的json字符串
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public String post(HttpServletRequest req, @RequestBody T model) {
baseService.saveOrUpdatePartial(model);
return "";
}
3 后台传入需要修改的实体类toObj,通过反射获取实体类属性Id的属性值,再通过id值获取此ID在数据库的实体类formObj,再通过反射去遍历实体类toObj的所有属性值,找到不为空的值,赋值给数据库的实体类formObj,保存formObj,就能完成通过一个方法修改多个属性值
1获取实体类,修改实体类,保存实体类。
public <T> void saveOrUpdatePartial(T toObj) {
int id=(int)JkdMapConvertHelp.getValueByFieldName(toObj,"id");
T formObj=this.get(id);
if(formObj!=null)
{
JkdMapConvertHelp.tryUpdate(formObj,toObj);
saveOrUpdateClear(formObj);
}
}
2 通过反射获取id值
public static Object getValueByFieldName(Object object, String fieldName) {
try {
Field field = object.getClass().getDeclaredField(fieldName);
// 设置对象的访问权限,保证对private的属性的访问
field.setAccessible(true);
return field.get(object);
} catch (Exception e) {
return null;
}
}
3 找到修改实体类不为空的值并且赋值给数据库的实体类
public static <T> void tryUpdate(T formObj, T toObj) {
// TODO Auto-generated method stub
Field[] f2 = toObj.getClass().getDeclaredFields();
for (Field field : f2) {
field.setAccessible(true);
try {
Object valueObject = field.get(toObj);
if (valueObject != null) {
Field formField = formObj.getClass().getDeclaredField(field.getName());
formField.setAccessible(true);
formField.set(formObj, valueObject);
}
} catch (IllegalArgumentException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4 保存此类
public <T> void saveOrUpdateClear(T obj) {
this.getHibernateTemplate().saveOrUpdate(obj);
getHibernateTemplate().flush();
getHibernateTemplate().clear();
}
代码上传CSDN
https://download.csdn.net/download/qq_25744257/10520315