使用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