<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    nighty

    折騰的年華
    posts - 37, comments - 143, trackbacks - 0, articles - 0
            非常喜歡這種輕量級的JDBC封裝,比起Hibernate和iBatis,可以非常自由和靈活地運(yùn)用和自行二次封裝,由于dbutils的BeanHandler轉(zhuǎn)換方式采取了反射技術(shù),在性能上肯定有所損失,所以項目中基本上都使用MapHandler方式來轉(zhuǎn)換數(shù)據(jù),當(dāng)然就是自己寫的代碼多一點(diǎn),也無所謂。一般的查詢、子查詢、聯(lián)合查詢、包括視圖查詢等等都很正常,但是發(fā)現(xiàn)一個比較小的問題,就是在使用聚合函數(shù)的場所,例如:select user_type, count(*) as count from `user` group by user_type這種類型查詢的時候,MapHandler方式不起作用,as列都變成key為空串的K-V對,導(dǎo)致有許多地方使用map.get("")代碼的情況出現(xiàn),這種寫法當(dāng)然是不太好的,容易出問題。
            鑒于前面沒有時間了解,就都粗略使用了上面那種粗暴的map.get("")來處理,最好的情況是讓dbutils組件能自動識別到as類型的列名。于是有空了就專門看了看它的源代碼,發(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自定義的一個Map,忽略鍵大小寫的K-V字典,但是key使用的是ResultSetMetaData.getColumnName(),我想問題大概出在這里,于是認(rèn)真翻了翻java的api文檔(開發(fā)做久了容易遺忘基礎(chǔ)),果然,原來getColumnName()是:獲取指定列的名稱;而as關(guān)鍵字之后,使列名稱變成用于顯示的意義,這個時候應(yīng)該使用getColumnLabel():獲取用于打印輸出和顯示的指定列的建議標(biāo)題。建議標(biāo)題通常由 SQL AS 子句來指定。如果未指定 SQL AS,則從 getColumnLabel 返回的值將和 getColumnName 方法返回的值相同。自己手動試驗了一下,果然如所料,問題就出在這里。
            所以呢,如果想要dbutils在自動轉(zhuǎn)換Map及MapList時能識別聚合函數(shù)的列名,那么最好的做法就是重載這種方式,懶一點(diǎn)的,你就干脆修改上面那段代碼,讓它判斷是否使用了as關(guān)鍵字。個人暫時搞不清楚官方為什么沒有考慮這一步,有時間再思考一下!

    剛進(jìn)場的時候戲就落幕

    Feedback

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

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

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

    2011-02-13 19:30 by javafan
    本來就是一個Bug,無法識別別名,低版本沒問題

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

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

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

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

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

    2011-02-19 12:21 by jacklondon
    我也用 dbutils 進(jìn)行二次封裝成 VelocityWeb, 也用 as , 沒有發(fā)現(xiàn)這個 bug。 可能是因為我攔截了 map , 因為我的需求比較特別:
    user_name (數(shù)據(jù)庫列名) 要映射到 userName( java 屬性名), 而 DBUtils 做不到,所以我攔截了重寫,可能是因為這樣,導(dǎo)致沒有了這個 bug.
    ----------歡迎大家試用我們的單點(diǎn)登錄 http://zhegui.biz

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

    2011-02-19 12:25 by jacklondon
    DBUtils 1.3 的 release log 中有如下一段話,按說已經(jīng)解決問題了:
    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ù)庫?是否 JDBC 驅(qū)動有問題,需要升級?

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

    2016-05-02 20:35 by starhe
    dbutils中連傳入到的參數(shù)都不區(qū)分大小寫??
    主站蜘蛛池模板: 亚洲精品无码少妇30P| 图图资源网亚洲综合网站| ZZIJZZIJ亚洲日本少妇JIZJIZ| 亚洲人成色77777在线观看大 | 1000部羞羞禁止免费观看视频| 日本免费人成在线网站| 女人18毛片水真多免费播放| 四虎在线视频免费观看| 亚洲精品乱码久久久久久不卡| 国产亚洲精品资源在线26u| 91精品国产亚洲爽啪在线影院| jiz zz在亚洲| 视频免费1区二区三区| 国产一级淫片a免费播放口| 欧美男同gv免费网站观看| 国产色爽女小说免费看| 亚洲乱码中文字幕久久孕妇黑人| 久久丫精品国产亚洲av不卡| 亚洲日韩AV无码一区二区三区人| 人体大胆做受免费视频| 99久久国产免费中文无字幕| 在线观看永久免费视频网站| 亚洲热线99精品视频| 亚洲一级毛片免费观看| 日本一区二区三区免费高清在线| 精品视频在线免费观看| 成年女人毛片免费播放视频m| 亚洲午夜精品第一区二区8050| 亚洲国产精品自在在线观看| 亚洲人成网站在线播放2019| CAOPORN国产精品免费视频| 在线看片无码永久免费视频| 久久99亚洲综合精品首页| 亚洲成人在线免费观看| 日本一区二区三区在线视频观看免费 | 亚洲综合小说另类图片动图| 久久嫩草影院免费看夜色| 国产精品69白浆在线观看免费| 在线观看亚洲成人| 亚洲一级大黄大色毛片| 精品多毛少妇人妻AV免费久久|