声明:是将项目中的内容总结出来的。
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;
}
}
好了,基本就这些了,可以明确的支出这个工具就是为了两个类的对象相互赋值,没有其他的意思。