java Spring mvc 新增和修改的泛型帮助类,用同一接口修改相同实体类的属性

用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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值