查詢語句sql:"select b.city_unit_name as disposeunitname,a.city_event_src_name as eventsrcname from to_stat_info t,to_trans_event_src a,to_trans_unit b where t.event_src_name=a.event_src_name and t.dispose_unit_name = b.unit_name"查詢MySQL中顯示信息正常mysql
經過程序將查詢的數據信息轉換成Java類時,類中的屬性所有都是nullsql
經過MySQL中查出來的信息,應該會將字段信息映射到Java類的屬性中,可是好像並非這麼回事,只有深刻到源碼中查詢一下問題所在,以下圖數據庫
代碼中是經過DAORowMapper類將mysql中查詢的字段信息映射到Java類的屬性中,繼續深刻了解這個類bash
繼續向下看這個方法,下圖中標出了關鍵的地方,爲何沒有執行類中的setter方法app
繼續向下查看,就是經過反射將查詢出的字段信息set到映射類的屬性中框架
目前將字段信息映射到Java類中屬性的關鍵代碼地址找到了,debugger查看name值爲"city_unit_name"並非as以後的別名"disposeunitname"學習
繼續深刻發現這邊有一個判斷邏輯,經過useOldAliasBehavior走哪一個業務邏輯,默認爲false,經過getNameNoAliases方法獲取字段名this
查看該方法得知獲取的字段名是originalNameurl
debug得知ResultSetMetaData類的內部屬性信息spa
從上面截圖中發信name是咱們須要獲取的字段別名,查看下圖 咱們應該走上面的判斷邏輯經過this.getField(column).getName() 獲取字段別名,所以須要將useOldAliasBehavior設置爲true
一種經過方法ResultSetMetaData.getColumnLabel(),以下圖 第二種是配置useOldAliasMetadataBehavior值爲true,經過ResultSetMetaData.getColumnName()獲取,該字段是經過數據庫屬性url來進行配置的,經過下面的配置能夠將該字段賦值爲true經過查詢MySQL的相關資料得知獲取字段的別名有兩種方法,
jdbc.url=jdbc:mysql://localhost:3306/egovastat?useOldAliasMetadataBehavior=true
複製代碼
修改完畢以後,查詢的數據信息可以映射到Java類的屬性中,到這裏該問題成功解決
經過此次問題探索和問題解決,感觸較深。咱們對於一些框架的源碼應該放下敬畏之心報以日常的心態查看源碼,經過查看源碼來解決問題。這種方法看似困難,實際上是最簡單、最高效。同時,之後也要多多查看優秀的源碼,學習別人的設計思想和代碼習慣。