登录 注册

【JAVA】Map与对象转换的工具类

通过映射对Map和对象转换的工具代码
时间:2016-08-12 14:29:41 作者:Mr.d

上一篇文章里说了,俺们用的JDBC,然后取出来的结果集是List<Map<String,Object>>,然后把这个map转换成对象,需要手动去写,好吧,我懒了,我写了一个工具类,一劳永逸,写的也不好,今天也不想写太多,只发代码.


代码通过映射得到转换对象的字段属性,根据属性和表字段名(默认数据库字段命名是以下划线命名法命名,对象命名以字段去掉下划线,并以驼峰命名法命名),去Map中获取,并对属性进行保存,在List转换时,只获取一次属性

public class ConvertUtil {
	
	/**
	 * List转换
	 * @param list 
	 * @param clazz
	 * @return
	 */
	public static <T> List<T> convertList (List<Map<String,Object>> list ,Class clazz){
		
		if (list == null || list.size() <= 0) {
			return null;
		}
		List<T> resultList = new ArrayList<T>();
		Map<String,PropertyDescriptor> descMap = new HashMap<String,PropertyDescriptor>();
		try {
			for (Map<String,Object> map : list) {
				T t = convert(map,clazz,descMap);
				if (t == null) {
					continue;
				}
				resultList.add(t);
			}
		} catch (Exception e) {
			return null;
		}
		return resultList;
	} 
	
	/**
	 * 单个map转换成bean
	 * @param map
	 * @param clazz
	 * @return
	 */
	public static <T> T convert(Map<String,Object> map, Class clazz){
		
		if (map == null)
			return null;
		
		try {
			return convert(map,clazz,null);
		} catch (Exception e) {
			Logs.geterrorLogger().error(e);
		}
		return null;
	}
	
	/**
	 * 单个map转换bean私有方法
	 * @param map
	 * @param clazz
	 * @param descMap
	 * @return
	 * @throws Exception
	 */
	private static <T> T convert(Map<String,Object> map, Class clazz,Map<String,PropertyDescriptor> descMap) throws Exception{
		
		T value = (T) clazz.newInstance();
		if (descMap == null || descMap.size() <= 0) {
			value = directConvert(value,map,clazz,descMap);
		} else {
			value = descConvert(value,map,descMap);
		}
		
		return value;
	}
	
	/**
	 * 根据已有的PropertyDescriptor进行转换
	 * @param t
	 * @param map
	 * @param descMap
	 * @return
	 */
	private static <T> T descConvert(T t ,Map<String,Object> map,Map<String,PropertyDescriptor> descMap){
		
		for (String serverName : map.keySet()) {
			try {
				PropertyDescriptor descriptor = descMap.get(serverName);
				if (descriptor == null)
					continue;
				String type = descriptor.getPropertyType().toString();
				Object serverValue = map.get(serverName);
				Object[] args = new Object[1];   
				 if ("int".equals(type) || "class java.lang.Integer".equals(type)) {
					 args[0] = StringUtil.toInteger(serverValue.toString(), 0); 
				 } else if ("long".equals(type) || "class java.lang.Long".equals(type)) {
					 args[0] = StringUtil.toLong(serverValue.toString(), 0L); 
				 } else if ("double".equals(type) || "class java.lang.Double".equals(type)) {
					 args[0] = StringUtil.toDouble(serverValue.toString(), 0d); 
				 } else if ("class java.lang.String".equals(type)){
					 args[0] = serverValue.toString();  
				 } else if ("class java.util.Date".equals(type)) {
					 args[0] = (Date)serverValue;
				 } else if ("boolean".equals(type)){
					 args[0] = (Boolean)serverValue;
				 }
				 descriptor.getWriteMethod().invoke(t, args);  
			} catch (Exception e) {
				Logs.geterrorLogger().error("ConvertUtil desc convert field error!",e);
			}
			
		}
		
		return t;
	}
	
	/**
	 * 直接转换  并将descMap 赋值
	 * @param t
	 * @param map
	 * @param clazz
	 * @param descMap
	 * @return
	 * @throws Exception
	 */
	private static <T> T directConvert(T t , Map<String,Object> map , Class clazz , Map<String,PropertyDescriptor> descMap) throws Exception{
		
		BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
		PropertyDescriptor[] propertyDescriptors =  beanInfo.getPropertyDescriptors();
		for (int i = 0; i< propertyDescriptors.length; i++) {
			 try {
				// 这一段  try 起来,当一个属性赋值失败的时候就不会影响其他属性赋值。 
				 PropertyDescriptor descriptor = propertyDescriptors[i];   
				 String propertyName = descriptor.getName();
				 String serverName = getServerName(propertyName);
				 String type = descriptor.getPropertyType().toString();
				 if (map.containsKey(serverName)) {   
					 Object v = map.get(serverName);   
					 Object[] args = new Object[1];   
					 if ("int".equals(type) || "class java.lang.Integer".equals(type)) {
						 args[0] = StringUtil.toInteger(v.toString(), 0); 
					 } else if ("long".equals(type) || "class java.lang.Long".equals(type)) {
						 args[0] = StringUtil.toLong(v.toString(), 0L); 
					 } else if ("double".equals(type) || "class java.lang.Double".equals(type)) {
						 args[0] = StringUtil.toDouble(v.toString(), 0d); 
					 } else if ("class java.lang.String".equals(type)){
						 args[0] = v.toString();  
					 } else if ("class java.util.Date".equals(type)) {
						 args[0] = (Date)v;
					 } else if ("boolean".equals(type)){
						 args[0] = (Boolean)v;
					 }
					 descriptor.getWriteMethod().invoke(t, args);  
					 if (descMap != null) {
						 descMap.put(serverName, descriptor);
					 }
				 }   
			} catch (Exception e) {
				Logs.geterrorLogger().error("ConvertUtil direct convert field error!",e);
			}
		}
		return t;
	}
	
	public static String getServerName(String name){
		return getServerName(name,0);
	}
	
	public static String getServerName(String name,int ind){
		int index = ind;
		if (index == 0) {
			index = upperIndex(name);
		}
		if (index <= 0) {
			return name;
		}
		String prev = name.substring(0, index);
		String after = name.substring(index, name.length());
		StringBuffer newStr = new StringBuffer();
		newStr.append(prev);
		newStr.append("_");
		
		String afterHeader = after.substring(0, 1);
		String afterTail = after.substring(1);
		
		int afterIndex = upperIndex(afterTail);
		if (afterIndex > 0) {
			newStr.append(afterHeader.toLowerCase());
			after = getServerName(afterTail,afterIndex);
		}
		
		newStr.append(after.toLowerCase());
		return newStr.toString();
	}
	
	public static int upperIndex(String str){
		
		for (int i=0; i<str.length(); i++){
			char c = str.charAt(i);
			if (Character.isUpperCase(c)){
				return i;
			}
		}
		return 0;
	}
	public static void main(String[] args) throws Exception {

		Map<String,Object> map = new HashMap<String,Object>();
		map.put("age", "123");
		map.put("name", "xxx");
		map.put("age_int", "1");
		map.put("date", new Date());
		map.put("price", "0.1");
		map.put("price_double", "0.11");
		map.put("id", "10000");
		map.put("id_long", "10001");
		
		Map<String,Object> map1 = new HashMap<String,Object>();
		map1.put("age", "223");
		map1.put("name", "2xxx");
		map1.put("age_int", "2");
		map1.put("date", new Date());
		map1.put("price", "0.2");
		map1.put("price_double", "0.22");
		map1.put("id", "20000");
		map1.put("id_long", "20002");
		
		List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
		list.add(map1);
		list.add(map);
		//Stu stu = toJavaBean(Stu.class,map);
		
		List<Stu> res = convertList(list,Stu.class);
		
		for (Stu stu : res) {
			System.out.println("---->"+stu.getName());
			System.out.println("---->"+stu.getAge());
			System.out.println("---->"+stu.getAgeInt());
			System.out.println("---->"+stu.getId());
			System.out.println("---->"+stu.getIdLong());
			System.out.println("---->"+stu.getPrice());
			System.out.println("---->"+stu.getPriceDouble());
			
			System.out.println("----------------");
		}
		
		//Stu stu = convertMap(map,Stu.class);

		
		
	}
}


class Stu{
	private String name;
	private int age;
	private Integer ageInt;
	private Date date;
	private double price;
	private Double priceDouble;
	private long id;
	private Long idLong;
	private boolean isTrue;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	public boolean isTrue() {
		return isTrue;
	}
	public void setTrue(boolean isTrue) {
		this.isTrue = isTrue;
	}
	public Integer getAgeInt() {
		return ageInt;
	}
	public void setAgeInt(Integer ageInt) {
		this.ageInt = ageInt;
	}
	public Double getPriceDouble() {
		return priceDouble;
	}
	public void setPriceDouble(Double priceDouble) {
		this.priceDouble = priceDouble;
	}
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public Long getIdLong() {
		return idLong;
	}
	public void setIdLong(Long idLong) {
		this.idLong = idLong;
	}
	
	
}


评论


暂无评论