好久沒來更新部落格了,最近一直在忙乎一些亂七八糟的東西.鬱悶,郵政那個從去年做到了現在,一直在催,而我這邊又抽不出手,就算抽出空,但靜不下心,看到就煩.
之前一直在使用 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了.