2021.4.3:
问题描述:
在写一个数据导入的接口时,由于性能问题需要从单条导入改成mybatis的分批导入,但是由于我的实体类面临如下尴尬点请求给我的是B类,需要我从B中根据几个字段查出属性c,然后再导入数据库中,不想通过A继承B来解决,因为B中很多字段,需要写很多.
A.setxxx(B.getxxx())
之前xml已经写好了,想只改动xml就行 但是发现从来没用过#{A.B.d}这种写法,所以想着去看看mybatis源码,能不能这么用,如果不能想尝试自己改着能这么写.
public class A{
//B中有很多字段
B b;
String c;
}
public class B{
String d;
}
问题解决:
通过源码发现,是可以这么用的
在MetaObject中:会递归调用getValue一直到PropertyTokenizer没有孩子
//通过PropertyTokenizer解析递归调用拿对象
public Object getValue(String name) {
PropertyTokenizer prop = new PropertyTokenizer(name);
if (prop.hasNext()) {
MetaObject metaValue = metaObjectForProperty(prop.getIndexedName());
if (metaValue == SystemMetaObject.NULL_META_OBJECT) {
return null;
} else {
return metaValue.getValue(prop.getChildren());
}
} else {
return objectWrapper.get(prop);
}
}
PropertyTokenizer是一个用来分隔param.childparam.childparam这种参数的
//解析 param.param
public PropertyTokenizer(String fullname) {
int delim = fullname.indexOf('.');
if (delim > -1) {
name = fullname.substring(0, delim);
children = fullname.substring(delim + 1);
} else {
name = fullname;
children = null;
}
indexedName = name;
delim = name.indexOf('[');
if (delim > -1) {
index = name.substring(delim + 1, name.length() - 1);
name = name.substring(0, delim);
}
}
看了还是大佬们考虑周全,不然就有我展示的机会了!