使用MyBatis的時候,發現一個神奇bug:DTO裏多個屬性和數據庫的字段一一對應,使用mybatis的resultType自動裝配,會發生部分字段能有值,部分字段爲空的狀況。舉例就是 DTO有 A \ B \ C \D 等字段,數據庫也有對應字段 A \ B \C \D。 用select取值後,發出A ,B有值,C\D爲空。固然數據庫中A\B\C\D都有值的。數據庫
反覆檢查字段拼寫確認沒有錯誤,set/get方法正確後,就把問題懷疑到了DTO裏特殊的字段。DTO由於項目關係,並無真的屬性A,set/get裏操做的父類的jsonObject .而是對於每一個字段,都有多一個String的屬性,如A=「A」。懷疑是由於DTO特殊構造,和mybatis不兼容。因而debug的mabatis字段賦值邏輯。json
查看mybatis 的源碼, debug 調試,DefaultResultSetHandler類的 handleResultSets()方法mybatis
其中ResultSetWrapper rsw = getFirstResultSet(stmt);爲jdbc返回的內容。app
變量 rsw.resultSet._res._res.rowData.rows.get(0).internalRowDatadebug
這裏,能夠用IDEA的 view as->String 看到內容(版本不同,可能須要先create)調試
mybatis把get
public static String TABLENAME = "tableName"; public static String KEY = "key"; public static String VALUE = "value";
放到 Reflector的源碼
caseInsensitivePropertyMap
裏,it
導出取得時候,隨機取。table