MyBatis的属性装配

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

里,

导出取得时候,随机取。

猜你喜欢

转载自my.oschina.net/u/2382040/blog/2051613