继承AbstractListHandler实现自己的 MapListHandler方法

来源:互联网 发布:网络好声音视频 编辑:程序博客网 时间:2024/05/17 02:44

好久没来更新博客了,最近一直在忙乎一些乱七八糟的东西.郁闷,邮政那个从去年做到了现在,一直在催,而我这边又抽不出手,就算抽出空,但静不下心,看到就烦.


之前一直在使用 Apache DbUtils 包,1.4版本新增的异步查询还不错,现 在就说说它提供的MapListHandler类,它默认是交给 BasicRowProcessor类的 toMap处理,可toMap方法执行,然后返回一个Map,问题就出在这个toMap方法里面,它里面是这样写的:

result.put(rsmd.getColumnName(i), rs.getObject(i)); //这里直接用getObject取出值.

在表中有字段是Number(10,2)类型的,它的值是xx.00,由于使用getObject()直接取出值,小数点后面的值就给抹去了,可老大说要显示它后面的二个小数值._ _,没找到,就自己继承AbstractListHandler实现了一个类。


/***自定义的类*/public class MyMapListHandler extends AbstractListHandler<map> {    private static ConvertToMap convert;    //数字格式化    private static java.text.DecimalFormat   df   =new   java.text.DecimalFormat("0.00");      public MyMapListHandler() {        if (CheckUtil.CheckNull(convert)) {            convert = new ConvertToMap();        }    }    @Override    protected Map handleRow(ResultSet rs) throws SQLException {        return convert.toMap(rs);    }    private class ConvertToMap extends BasicRowProcessor {        @Override        public Map toMap(ResultSet rs) throws SQLException {            Map result = new HashMap();            ResultSetMetaData rsmd = rs.getMetaData();            int cols = rsmd.getColumnCount();            for (int i = 1; i <= cols; i++) {                result.put(rsmd.getColumnName(i), getTypeValue(rsmd, rs, i));            }            return result;        }    }   //在这个方法中格式化数字    private Object getTypeValue(ResultSetMetaData rsmd, ResultSet rs, int index)            throws SQLException {        Object result = null;        int type = rsmd.getColumnType(index);//得到字段类型        switch (type) {        case Types.NUMERIC:        case Types.FLOAT:        case Types.DOUBLE:        case Types.INTEGER:            int scale=rsmd.getScale(index);//如果有小数点,则格式化,否则取它的整数            if(scale>0){                result=df.format(rs.getDouble(index));            }else{                result=rs.getInt(index);            }            break;        default:            result = rs.getObject(index);            break;        }        return result;    }}
在调用处:private static AsyncQueryRunner query=new AsyncQueryRunner(Executors.newCachedThreadPool());   data =query.query(getConnnnects(), sql,new MyMapListHandler() ,obj).get(MyUtils.getIntFromStr(pro.getValue("qt")),TimeUnit.SECONDS);    new MyMapListHandler()就OK了.