使用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字段赋值逻辑。
查看mybatis 的源码, debug 调试,DefaultResultSetHandler类的 handleResultSets()方法
其中ResultSetWrapper rsw = getFirstResultSet(stmt);为jdbc返回的内容。
变量 rsw.resultSet._res._res.rowData.rows.get(0).internalRowData
这里,可以用IDEA的 view as->String 看到内容(版本不一样,可能需要先create)
mybatis把
public static String TABLENAME = "tableName"; public static String KEY = "key"; public static String VALUE = "value";
放到 Reflector的
caseInsensitivePropertyMap
里,
导出取得时候,随机取。