ibatis使用工具类,用于将Map转换成Bean,ibatisbean,应用背景:ibatis作
分享于 点击 38484 次 点评:152
ibatis使用工具类,用于将Map转换成Bean,ibatisbean,应用背景:ibatis作
应用背景:ibatis作为数据库访问框架,数据库表定义java程序员做不了主,导致表的列名定义不符合java类属性名定义习惯。最终情况是列名和属性名有联系但又不完全相同,导致ibatis对查询结果自动封装Bean困难。
当然,所有的方案都有其本身假定的适用范围,下面的代码也有如下假定:
1,假定列名忽略某些字符(如:"_")就可以和属性名在不区分大小写情况下完全匹配。
2,假定java Bean的所有属性名在不区分大小写情况下没有重复。
3,假定你和我一样都很懒,懒得在SQL的最终返回列上用as重命名成属性名;你也懒得使用ibatis提供的每个mapper里都要写一次的更强大的resultMap。
使用须知:
1,相比于as重命名,这个工具类虽然更方便,但它运行了更多的代码,理论上当然对速度会有影响(当然我觉得这点影响无关紧要)。
2,这个工具类只是在一个简单的模型下写的(一条查询SQL所返回的结果集),所以你最好别指望它拥有ibatis提供的那么强大的结果集映射能力(把另一个结果集映射到某对象的list属性上)。
3,使用它时,你只要把select的返回值如resultType="hashmap"这样定义,然后再java内接收成List<Map<String,Object>>这样,通过它再转一次就好了。
4,虽然它是伴随我使用ibatis时的需要才被编写的,但它本质就是将map转换成Bean,只是以一种更宽泛的对应关系转换而已。
5,我的情况是列名经常是ABC_DEF,而属性名是abcDef;所以我忽略了"_"字符,你可以根据自己的实际情况自己改要忽略的字符。
import java.lang.reflect.Method;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.apache.log4j.Logger;/*** Copyright (c) 2011 sxgkwei* Author:sxgkwei* Email:sxgkwei@gmail.com* Date: 2012-03-30 12:58:21* JDK : 1.6.2*/public class BeanUtil { private static Logger log = Logger.getLogger(BeanUtil.class); // 日志 /** * 转换时对map中的key里的字符串会做忽略处理的正则串 */ private static final String OMIT_REG = "_"; /** * 将map集合转换成Bean集合,Bean的属性名与map的key值对应时不区分大小写,并对map中key做忽略OMIT_REG正则处理 * * @param <E> * @param cla * @param mapList * @return */ public static <E> List<E> toBeanList(Class<E> cla, List<Map<String, Object>> mapList) { List<E> list = new ArrayList<E>(mapList.size()); for (Map<String, Object> map : mapList) { E obj = toBean(cla, map); list.add(obj); } return list; } /** * 将map转换成Bean,Bean的属性名与map的key值对应时不区分大小写,并对map中key做忽略OMIT_REG正则处理 * * @param <E> * @param cla * @param map * @return */ @SuppressWarnings({ "rawtypes" }) public static <E> E toBean(Class<E> cla, Map<String, Object> map) { // 创建对象 E obj = null; try { obj = cla.newInstance(); if (obj == null) { throw new Exception(); } } catch (Exception e) { log.error("类型实例化对象失败,类型:" + cla); return null; } // 处理map的key Map<String, Object> newmap = new HashMap<String, Object>(); for (Map.Entry<String, Object> en : map.entrySet()) { newmap.put( "set" + en.getKey().trim().replaceAll(OMIT_REG, "") .toLowerCase(), en.getValue()); } // 进行值装入 Method[] ms = cla.getMethods(); for (Method method : ms) { String mname = method.getName().toLowerCase(); if (mname.startsWith("set")) { Class[] clas = method.getParameterTypes(); Object v = newmap.get(mname); if (v != null && clas.length == 1) { try { method.invoke(obj, v); } catch (Exception e) { log.error("属性值装入失败,装入方法:" + cla + "." + method.getName() + ".可装入类型" + clas[0] + ";欲装入值的类型:" + v.getClass()); } } } } return obj; }}//该片段来自于http://byrx.net
用户点评