`
悲剧了
  • 浏览: 145312 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

类似model属性操作copy contrast

 
阅读更多

由于业务需要,可能存在以下类似model,比如正式表 零时表

那么在很多时候,正式表的model的属性要copy到零时表中,有时候又涉及到对比,如果只涉及一次这种类似的操作,自己set也就无所谓,但类似业务多了,就需要抽象了,反射式比较好的方式,能抽象提取这些操作

 

用commons的beanUtils 与spring的工具类封装了一个BeanUtilss

public class BeanUtilss {

	/**
	 * 该方法对比不同Bean实例中具有相同属性值是否相等,只对比neww中的属性
	 * @param neww--系统对象
	 * @param old--目标对象
	 */
	public static boolean isChange(Object neww,Object old) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{
		if(neww==null||old==null){
			throw new IllegalArgumentException();
		}
		boolean chanage=false;
		Map newwMap=new PropertyUtilsBean().describe(neww);
		Map oldMap=new PropertyUtilsBean().describe(old);
		newwMap.remove("class");
		oldMap.remove("class");
		for(Object key:newwMap.keySet()){
			if(!equals(newwMap.get(key),oldMap.get(key))){
				return true;
			}
		}

		return chanage;
	}
	/**
	 * 该方法对比不同Bean实例中具有相同属性值是否相等,只对比neww中的属性
	 * old属性为neww属性加前缀在preFix
	 * @param neww--系统对象
	 * @param old--目标对象
	 */
	public static boolean isChange(Object neww,Object old,String PreFix) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{
		boolean chanage=false;
		Map newwMap=new PropertyUtilsBean().describe(neww);
		Map oldMap=new PropertyUtilsBean().describe(old);
		newwMap.remove("class");
		oldMap.remove("class");
		for(Object key:newwMap.keySet()){
			if(!equals(newwMap.get(key),oldMap.get(PreFix+key))){
				return true;
			}
		}
		return chanage;
	}
	/**
	 * spring的BeanUtils功能增强,增加属性规则,copy目标Bean属性加preFix
	 * @param orig
	 * @param dest
	 * @param PreFix
	 * @param ignoreProperties
	 */
	public static void CopyProperties(Object orig,Object dest,String PreFix,String[] ignoreProperties) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{
		Map<String,Object> newwMap=new PropertyUtilsBean().describe(orig);
		newwMap.remove("class");
		Map<String,Object> map=new HashMap<String,Object>();
		for(String key:newwMap.keySet()){
			map.put(PreFix+key, newwMap.get(key));
		}
		BeanUtils.copyProperties(map, dest, ignoreProperties);
	}
	private static boolean equals(Object orig,Object dest){
		if(orig==null&&dest!=null){
			return false;
		}
		if((orig instanceof String)&& (dest instanceof String)){
			if(StringUtils.isEmpty((String)orig)&&StringUtils.isEmpty((String)dest))
				return true;
		}
		return orig.equals(dest);
	}
}
 
分享到:
评论

相关推荐

    对sqlite的使用进行简单封装,仅涉及简单的单表 增删改查, 基于FMDB,操作基于model,数据库表字段与model属性

    对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 , 基于 FMDB,操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整体进行操作, 根据 model 对象自动建表,字段类型只支持 NSString , NSIteger ,...

    Maverick MVC Model 2

    但由于ControllerContext只有一个model属性可以传递数据,程序员必须把所有需要的数据都打包在一个对象里面设置到model属性里。这种麻烦自然而然会导致这样的可能用法,直接把Controller本身设置为model,这又回到了...

    JSONModel MVC demo

    只需定义一个Objective-C类,该类继承自JSONModel,并标注属性类型,然后就可以直接将JSON字符串转化为这个类的实例。这样,你就可以在Model层直接使用这些对象,无需手动解析JSON。 MJExtension是另一个常用的...

    填坑记录之Vue中v-model与:model区别

    :model是v-bind:model的缩写,是绑定自定义属性.它只是将父组件的数据传递给子组件,并没有实现父组件和子组件数据之间的双向绑定。 所以在form表单标签中,并没有向子组件传递数据,所以在input标签中获取不到数据...

    vue v-model动态生成详解

    1.input 输入框 v-model 绑定的字段名需要根据后台返回的数据动态生成,此时就不可以用 v-model绑定,而是用传统的方法 value 动态绑定,并且用子组件绑定向父组件传递值和事件。 代码如下: //子组件 &lt;input ...

    JSP的两种设计模式 Model1和Model2

    对于XML文件的解析,通常使用如Apache Commons Digester这样的库,它可以自动匹配XML结构并执行相应的操作,如创建对象、设置属性等,简化了代码编写。在上述的`digester-rules`示例中,定义了当解析到`action-...

    C#自动生成MODEL

    例如,对于一个数据库表,自动生成的MODEL类会包含该表的所有字段作为类的属性,并且可能还包括一些基本的CRUD(Create, Read, Update, Delete)操作。 在描述中提到的“部分数据存储数据结构”,这可能指的是特定...

    C#自动生成Model工具源码

    通过链接数据库并读取表结构,工具可以生成对应的Model类,这些类通常包含属性来映射数据库字段,并可能包含一些基本的CRUD(Create、Read、Update、Delete)操作方法。 在描述中提到,“可以在exe程序当前目录新建...

    (OC)Json自定生成Model(代码+视频讲解).zip

    在自定义Model时,有时JSON的键名与Model的属性名不一致,这时需要手动定义字段映射,例如使用`@property (nonatomic, strong) NSString * (^keyMapper)(NSString *)`来指定JSON键到Model属性的映射。 6. 类型转换...

    swift语言model的使用

    本项目以`ModelTest`为例,探讨了如何在Xcode环境中有效地使用Swift构建和操作Model。 首先,理解Model的基本概念。Model是应用中的数据模型,它封装了数据和相关的操作。在Swift中,你可以创建一个类或者结构体来...

    详解Backbone.js框架中的模型Model与其集合collection

    - 创建:类似Model,通过`Backbone.Collection.extend()`创建Collection类,实例化时传入一组Model或Model的JSON表示。 - 存储Model:Collection可以通过`add()`、`remove()`等方法添加、移除Model,或者通过`...

    CodeModel

    这些类通常包含属性,这些属性与数据库表的列相对应,以及可能的方法来处理数据操作。通过这种方式,CodeModel能够帮助开发者快速构建数据访问层(DAL)或实体框架(Entity Framework)。 实现IComparable接口是...

    vue 入门,v-model数据绑定

    在这个例子中,`v-model`被用来连接`&lt;input&gt;`元素和Vue实例的`inputValue`属性。当你在输入框中输入内容时,`inputValue`的值会实时更新,同时在页面下方的`&lt;p&gt;`元素中展示出来。 除了文本输入框,`v-model`还支持...

    Laravel开发-smartmodel

    其中,"SmartModel"是Laravel中ORM(对象关系映射)的一部分,用于简化数据库操作。 首先,让我们了解什么是ORM。ORM允许开发者使用面向对象的方式来处理数据库操作,无需编写SQL语句。在Laravel中,ORM主要由...

    Model2模块实现用户注册登录.zip

    1. **模型层(Model)**:这是应用的核心部分,负责处理业务逻辑和数据操作。在这个用户注册登录的场景中,Model可能会包含User类,该类定义了用户的属性如用户名、密码等,并提供相应的操作方法,如注册、验证、登录...

    tp5快速生成model文件.zip

    如果需要自定义,可以在Model类中定义`protected $table`属性。 5. **生成带有字段注释的Model**:某些IDE或插件支持根据数据库表结构自动生成带注释的Model文件,这可以帮助开发者快速了解Model对应表的字段信息。...

    iOS json一键转换Model

    在iOS开发中,经常需要将接收到的JSON数据转换为模型对象(Model),以便于操作和显示。"iOS json一键转换Model"是一个针对这个问题的工具库,它提供了方便快捷的方法,帮助开发者快速地将JSON字符串转化为自定义的...

    c#自动创建数据表model类

    4. **属性注解**:为了使生成的Model类与数据库更好地交互,你可能还需要添加特定的注解,比如`[Key]`标识主键,`[Column]`指定列名,`[Required]`表示非空约束等。这些注解来自于System.ComponentModel....

    Laravel开发-model-log

    对于`model-log`,命令可能类似于`composer require example/model-log`。 2. **配置**:安装完成后,需要配置扩展包,这可能涉及注册服务提供者、门面,以及定义日志存储的数据库表结构。 3. **事件监听**:...

Global site tag (gtag.js) - Google Analytics