nighty

          折騰的年華
          posts - 37, comments - 143, trackbacks - 0, articles - 0
                  非常喜歡這種輕量級(jí)的JDBC封裝,比起Hibernate和iBatis,可以非常自由和靈活地運(yùn)用和自行二次封裝,由于dbutils的BeanHandler轉(zhuǎn)換方式采取了反射技術(shù),在性能上肯定有所損失,所以項(xiàng)目中基本上都使用MapHandler方式來(lái)轉(zhuǎn)換數(shù)據(jù),當(dāng)然就是自己寫(xiě)的代碼多一點(diǎn),也無(wú)所謂。一般的查詢(xún)、子查詢(xún)、聯(lián)合查詢(xún)、包括視圖查詢(xún)等等都很正常,但是發(fā)現(xiàn)一個(gè)比較小的問(wèn)題,就是在使用聚合函數(shù)的場(chǎng)所,例如:select user_type, count(*) as count from `user` group by user_type這種類(lèi)型查詢(xún)的時(shí)候,MapHandler方式不起作用,as列都變成key為空串的K-V對(duì),導(dǎo)致有許多地方使用map.get("")代碼的情況出現(xiàn),這種寫(xiě)法當(dāng)然是不太好的,容易出問(wèn)題。
                  鑒于前面沒(méi)有時(shí)間了解,就都粗略使用了上面那種粗暴的map.get("")來(lái)處理,最好的情況是讓dbutils組件能自動(dòng)識(shí)別到as類(lèi)型的列名。于是有空了就專(zhuān)門(mén)看了看它的源代碼,發(fā)現(xiàn)最主要的一段代碼如下:
           1public Map<String, Object> toMap(ResultSet rs) throws SQLException {
           2        Map<String, Object> result = new CaseInsensitiveHashMap();
           3        ResultSetMetaData rsmd = rs.getMetaData();
           4        int cols = rsmd.getColumnCount();
           5
           6        for (int i = 1; i <= cols; i++{
           7            result.put(rsmd.getColumnName(i), rs.getObject(i));
           8        }

           9
          10        return result;
          11    }
                  CaseInsensitiveHashMap是dbutils自定義的一個(gè)Map,忽略鍵大小寫(xiě)的K-V字典,但是key使用的是ResultSetMetaData.getColumnName(),我想問(wèn)題大概出在這里,于是認(rèn)真翻了翻java的api文檔(開(kāi)發(fā)做久了容易遺忘基礎(chǔ)),果然,原來(lái)getColumnName()是:獲取指定列的名稱(chēng);而as關(guān)鍵字之后,使列名稱(chēng)變成用于顯示的意義,這個(gè)時(shí)候應(yīng)該使用getColumnLabel():獲取用于打印輸出和顯示的指定列的建議標(biāo)題。建議標(biāo)題通常由 SQL AS 子句來(lái)指定。如果未指定 SQL AS,則從 getColumnLabel 返回的值將和 getColumnName 方法返回的值相同。自己手動(dòng)試驗(yàn)了一下,果然如所料,問(wèn)題就出在這里。
                  所以呢,如果想要dbutils在自動(dòng)轉(zhuǎn)換Map及MapList時(shí)能識(shí)別聚合函數(shù)的列名,那么最好的做法就是重載這種方式,懶一點(diǎn)的,你就干脆修改上面那段代碼,讓它判斷是否使用了as關(guān)鍵字。個(gè)人暫時(shí)搞不清楚官方為什么沒(méi)有考慮這一步,有時(shí)間再思考一下!

          剛進(jìn)場(chǎng)的時(shí)候戲就落幕

          Feedback

          # re: 關(guān)于commons dbutils組件的一個(gè)小缺陷分析  回復(fù)  更多評(píng)論   

          2011-02-12 20:22 by 蒙奇奇
          關(guān)注

          # re: 關(guān)于commons dbutils組件的一個(gè)小缺陷分析  回復(fù)  更多評(píng)論   

          2011-02-13 19:30 by javafan
          本來(lái)就是一個(gè)Bug,無(wú)法識(shí)別別名,低版本沒(méi)問(wèn)題

          # re: 關(guān)于commons dbutils組件的一個(gè)小缺陷分析  回復(fù)  更多評(píng)論   

          2011-02-14 13:56 by retry
          什么版本? 是 1.3 么?

          # re: 關(guān)于commons dbutils組件的一個(gè)小缺陷分析  回復(fù)  更多評(píng)論   

          2011-02-14 18:08 by 寒武紀(jì)
          @retry
          是的,就是1.3

          # re: 關(guān)于commons dbutils組件的一個(gè)小缺陷分析  回復(fù)  更多評(píng)論   

          2011-02-19 12:21 by jacklondon
          我也用 dbutils 進(jìn)行二次封裝成 VelocityWeb, 也用 as , 沒(méi)有發(fā)現(xiàn)這個(gè) bug。 可能是因?yàn)槲覕r截了 map , 因?yàn)槲业男枨蟊容^特別:
          user_name (數(shù)據(jù)庫(kù)列名) 要映射到 userName( java 屬性名), 而 DBUtils 做不到,所以我攔截了重寫(xiě),可能是因?yàn)檫@樣,導(dǎo)致沒(méi)有了這個(gè) bug.
          ----------歡迎大家試用我們的單點(diǎn)登錄 http://zhegui.biz

          # re: 關(guān)于commons dbutils組件的一個(gè)小缺陷分析  回復(fù)  更多評(píng)論   

          2011-02-19 12:25 by jacklondon
          DBUtils 1.3 的 release log 中有如下一段話(huà),按說(shuō)已經(jīng)解決問(wèn)題了:
          BeanProcessor#mapColumnsToProperties now prefers to use column labels over column names (where aliases are not set, these should be identical) Fixes DBUTILS-57.

          你這邊用什么數(shù)據(jù)庫(kù)?是否 JDBC 驅(qū)動(dòng)有問(wèn)題,需要升級(jí)?

          # re: 關(guān)于commons dbutils組件的一個(gè)小缺陷分析  回復(fù)  更多評(píng)論   

          2016-05-02 20:35 by starhe
          dbutils中連傳入到的參數(shù)都不區(qū)分大小寫(xiě)??
          主站蜘蛛池模板: 云林县| 霍州市| 灵山县| 平潭县| 庆云县| 凌源市| 手机| 平安县| 永定县| 信宜市| 防城港市| 通化县| 吴川市| 涪陵区| 和硕县| 泾源县| 公主岭市| 巴彦县| 南京市| 南靖县| 莱阳市| 柳林县| 客服| 徐闻县| 阿鲁科尔沁旗| 登封市| 呼图壁县| 越西县| 稷山县| 天全县| 孝义市| 铅山县| 禄劝| 嘉兴市| 慈溪市| 长泰县| 东阿县| 卢氏县| 榆中县| 扎兰屯市| 罗源县|