欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

ibatis使用工具类,用于将Map转换成Bean,ibatisbean,应用背景:ibatis作

来源: javaer 分享于  点击 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
相关栏目:

用户点评