现在的位置: 首页 > 综合 > 正文

java Vo和Model的转换工具

2014年02月16日 ⁄ 综合 ⁄ 共 7290字 ⁄ 字号 评论关闭

声明:是将项目中的内容总结出来的。

Model类的属性和数据表中的字段是一一对应的,Vo首先属性值也是要和Model类中的属性一一对应,其次Vo也可以有自己的额外属性。

下面先将工具贴出:

package test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @CLASS:BeanUtils
 * @DESCRIPTION:vo和model相互转换(说白了就是相互赋值的问题)
 * @AUTHOR:yehui
 * @VERSION:v1.0
 * @DATE:2013-4-15 下午2:56:02
**/
public class BeanUtils {
	private static final Set<Class<?>>	SIMPLE_TYPE_SET	= new HashSet<Class<?>>();

	static {
		SIMPLE_TYPE_SET.add(Character.class);
		SIMPLE_TYPE_SET.add(String.class);
		SIMPLE_TYPE_SET.add(Integer.class);
		SIMPLE_TYPE_SET.add(Long.class);
		SIMPLE_TYPE_SET.add(Float.class);
		SIMPLE_TYPE_SET.add(Double.class);
		SIMPLE_TYPE_SET.add(Boolean.class);
		SIMPLE_TYPE_SET.add(java.util.Date.class);
		SIMPLE_TYPE_SET.add(java.sql.Date.class);
		SIMPLE_TYPE_SET.add(java.sql.Timestamp.class);
		SIMPLE_TYPE_SET.add(BigDecimal.class);
	}

	/**
	 * model转换为vo
	 * 
	 * @param vo
	 *            vo的class
	 * @param model
	 *              model对象
	 * @return vo对象
	 */
	public static <T extends Object> T copyModelToVo(Class<T> vo,
			BaseModel model) {
		T v = null;
		try {
			v = vo.newInstance();
			copy(model, v);
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return v;
	}

	/**
	 * model转换为vo的list
	 * 
	 * @param vo
	 *           vodeclass
	 * @param models
	 *            model的list
	 * @return vo的list
	 */
	public static <T extends Object> List<T> copyModelToVo(Class<T> vo,
			List<? extends BaseModel> models) {
		List<T> list = new ArrayList<T>();
		if (models != null) {
			for (BaseModel model : models) {
				list.add(copyModelToVo(vo, model));
			}
		}
		return list;
	}

	/**
	 * vo转换为model
	 * 
	 * @param model
	 *            model的class
	 * @param vo
	 *            vode对象
	 * @return model的对象
	 */
	public static <T extends BaseModel> T copyVoToModel(Class<T> model,
			Object vo) {
		T m = null;
		try {
			m = model.newInstance();
			copy(model, m);
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return m;
	}

	/**
	 * vo转换为model list
	 * 
	 * @param model
	 *            model的class
	 * @param vos
	 *            vo的list
	 * @return model的list
	 */
	public static <T extends BaseModel> List<T> copyVoToModel(Class<T> model,
			List<? extends Object> vos) {
		List<T> list = new ArrayList<T>();
		if (vos != null) {
			for (Object vo : vos) {
				list.add(copyVoToModel(model, vo));
			}
		}
		return list;
	}

	private static Object copy(Object source, Object target) {
		if (target == null || source == null)
			return null;
		// 获得源文件的class
		Class<?> sourceClass = source.getClass();
		// 获得要转换后的目标文件的class
		Class<?> targetClass = target.getClass();
		// 获得源文件的的fields
		Field[] sourceFields = sourceClass.getDeclaredFields();

		for (int i = 0; i < sourceFields.length; i++) {
			try {
				// 获得目标文件的Field
				Field temp = targetClass.getDeclaredField(sourceFields[i]
						.getName());
				// 根据field获得属性名称
				String fieldName = temp.getName();
				// 获得属性的类型
				Class<?> fieldType = temp.getType();
				// 获得属性的get,set方法
				String getMethodName = "get"
						+ fieldName.substring(0, 1).toUpperCase()
						+ fieldName.substring(1);
				String setMethodName = "set"
						+ fieldName.substring(0, 1).toUpperCase()
						+ fieldName.substring(1);
				Method getMethod = sourceClass.getMethod(getMethodName);
				Method setMethod = targetClass.getMethod(setMethodName,
						new Class[] { fieldType });
				Object value = getMethod.invoke(source);
				// 判断value的类型
				if (value != null) {
					if (SIMPLE_TYPE_SET.contains(value.getClass())) {
						if (value instanceof String) {
							String s = (String) value;
							value = s != null ? s.trim() : null;
						}
						if (value instanceof String
								&& !fieldType.equals(String.class)) {
							value = stringToObj(fieldType, (String) value);
						}
						if (!(value instanceof String)
								&& fieldType.equals(String.class)) {
							value = objToString(value);
						}
						setMethod.invoke(target, new Object[] { value });
					} else if (value instanceof Collection) {
					} else {
						Object obj = copy(value, fieldType.newInstance());
						setMethod.invoke(target, new Object[] { obj });
					}
				} else {
					setMethod.invoke(target, new Object[] { null });
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return target;
	}

	private static Object stringToObj(Class<?> clazz, String value) {
		Object obj = null;
		if (value == null)
			return null;
		if (clazz.equals(Integer.class)) {
			obj = Integer.valueOf(value);
		} else if (clazz.equals(Long.class)) {
			obj = Long.valueOf(value);
		} else if (clazz.equals(Float.class)) {
			obj = Float.valueOf(value);
		} else if (clazz.equals(Double.class)) {
			obj = Double.valueOf(value);
		} else if (clazz.equals(Boolean.class)) {
			obj = Boolean.valueOf(value);
		} else if (clazz.equals(BigDecimal.class)) {
			obj = new BigDecimal(value);
		} else if (clazz.equals(java.util.Date.class)) {
			try {
				if (value.length() == 19) {
					java.text.DateFormat df = new java.text.SimpleDateFormat(
							"yyyy-MM-dd HH:mm:ss");
					obj = df.parse(value);
				} else if (value.length() == 16) {
					java.text.DateFormat df = new java.text.SimpleDateFormat(
							"yyyy-MM-dd HH:mm");
					obj = df.parse(value);
				} else {
					java.text.DateFormat df = new java.text.SimpleDateFormat(
							"yyyy-MM-dd");
					obj = df.parse(value);
				}
			} catch (Exception e) {
			}
		} else if (clazz.equals(Character.class)) {
			obj = value.charAt(0);
		}

		return obj;
	}

	private static String objToString(Object obj) {
		String value = null;
		if (obj == null)
			return null;
		if (obj instanceof java.util.Date) {
			java.text.DateFormat df = new java.text.SimpleDateFormat(
					"yyyy-MM-dd");
			value = df.format((java.util.Date) obj);
		} else {
			value = obj.toString();
		}
		return value;
	}

	public static void main(String[] args) {

		VoUsers resUser = new VoUsers();
		ResUser user = new ResUser();
		user.setUSER_ID("12");
		user.setUSER_NAME("hh");
		user.setUSER_PASSWORD("123");
		// 将model转换为vo
		resUser = BeanUtils.copyModelToVo(resUser.getClass(), user);
		// 输出vo的值
		System.err.println(resUser.toString());
	}
}

Model的基础类,model类必须继承这个类和Vo也可以继承这个类

/**
 * @FILE:BaseModel.java
 * @AUTHOR:hui-ye
 * @DATE:2013-5-14 下午4:43:30
 **/
package test;

import java.io.Serializable;
import java.lang.reflect.Field;

/**
 * @CLASS:BaseModel
 * @DESCRIPTION:model的基础类
 * @AUTHOR:yehui
 * @VERSION:v1.0
 * @DATE:2013-4-15 8:46:11
**/

public class BaseModel implements Serializable {
	public static final String	FUNCTION_COMPILE	= "compile";

	@Override
	public String toString() {
		Field[] field = this.getClass().getDeclaredFields();
		String s = "";
		try {
			for (Field f : field) {
				f.setAccessible(true);
				s += ","
						+ f.getName()
						+ "="
						+ (f.get(this) == null ? "null" : f.get(this)
								.toString());
			}
			// if (!StringUtils.isEmpty(s)) {
			// s = s.substring(1);
			// }
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return s;
	}

}

Model类

/**
 * @FILE:片段.java
 * @AUTHOR:hui-ye
 * @DATE:2013-5-14 下午4:45:19
 **/
package test;

import java.io.Serializable;

/*******************************************
 * 
 * @CLASS:ResUser
 * @DESCRIPTION:	
 * @AUTHOR:hui-ye
 * @VERSION:v1.0
 * @DATE:2013-5-14 下午4:45:19
 *******************************************/
public class ResUser  extends BaseModel{

	private String USER_ID; //id
	private String USER_NAME; //name
	private String USER_PASSWORD; //password

	public String getUSER_ID() {
		return USER_ID;
	}
	public void setUSER_ID(String uSER_ID) {
		USER_ID = uSER_ID;
	}
	public String getUSER_NAME() {
		return USER_NAME;
	}
	public void setUSER_NAME(String uSER_NAME) {
		USER_NAME = uSER_NAME;
	}
	public String getUSER_PASSWORD() {
		return USER_PASSWORD;
	}
	public void setUSER_PASSWORD(String uSER_PASSWORD) {
		USER_PASSWORD = uSER_PASSWORD;
	}

}

Vo类

/**
 * @FILE:VoUsers.java
 * @AUTHOR:hui-ye
 * @DATE:2013-5-14 下午4:49:16
 **/
package test;

import java.io.Serializable;

/*******************************************
 * 
 * @CLASS:VoUsers
 * @DESCRIPTION:	
 * @AUTHOR:hui-ye
 * @VERSION:v1.0
 * @DATE:2013-5-14 下午4:49:16
 *******************************************/
public class VoUsers extends BaseModel{

	private String USER_ID; //id
	private String USER_NAME; //name
	private String USER_PASSWORD; //password

	public String getUSER_ID() {
		return USER_ID;
	}
	public void setUSER_ID(String uSER_ID) {
		USER_ID = uSER_ID;
	}
	public String getUSER_NAME() {
		return USER_NAME;
	}
	public void setUSER_NAME(String uSER_NAME) {
		USER_NAME = uSER_NAME;
	}
	public String getUSER_PASSWORD() {
		return USER_PASSWORD;
	}
	public void setUSER_PASSWORD(String uSER_PASSWORD) {
		USER_PASSWORD = uSER_PASSWORD;
	}
	
}

好了,基本就这些了,可以明确的支出这个工具就是为了两个类的对象相互赋值,没有其他的意思。

抱歉!评论已关闭.