美文网首页
Mybatis之ObjectWrapper接口

Mybatis之ObjectWrapper接口

作者: engineer_tang | 来源:发表于2021-03-30 00:22 被阅读0次

该接口用来对数据库查询到的值设置到实体对象或Map对象的属性中。
接口定义如下:

public interface ObjectWrapper {

  Object get(PropertyTokenizer prop);

  void set(PropertyTokenizer prop, Object value);

  String findProperty(String name, boolean useCamelCaseMapping);

  String[] getGetterNames();

  String[] getSetterNames();

  Class<?> getSetterType(String name);

  Class<?> getGetterType(String name);

  boolean hasSetter(String name);

  boolean hasGetter(String name);

  MetaObject instantiatePropertyValue(String name, PropertyTokenizer prop, ObjectFactory objectFactory);

  boolean isCollection();

  void add(Object element);

  <E> void addAll(List<E> element);

}

实现该接口的类结构图如下所示:


image.png

其中CollectionWrapper只支持3个方法,其他方法都不支持,调用时会抛出UnsupportedOperationException异常:

  @Override
  public boolean isCollection() {
    return true;
  }

  @Override
  public void add(Object element) {
    object.add(element);
  }

  @Override
  public <E> void addAll(List<E> element) {
    object.addAll(element);
  }

1. BeanWrapper类

image.png

从类结构图可以看出,该类继承了BaseWrapper类,其中构造函数方法签名如下:

BeanWrapper(MetaObject metaObject, Object object)

该类主要用来设置Bean对象的值:

  @Override
  public void set(PropertyTokenizer prop, Object value) {
    if (prop.getIndex() != null) {
      Object collection = resolveCollection(prop, object);
      setCollectionValue(prop, collection, value);
    } else {
      setBeanProperty(prop, object, value);
    }
  }

  private void setBeanProperty(PropertyTokenizer prop, Object object, Object value) {
    try {
      Invoker method = metaClass.getSetInvoker(prop.getName());
      Object[] params = {value};
      try {
        method.invoke(object, params);
      } catch (Throwable t) {
        throw ExceptionUtil.unwrapThrowable(t);
      }
    } catch (Throwable t) {
      throw new ReflectionException("Could not set property '" + prop.getName() + "' of '" + object.getClass() + "' with value '" + value + "' Cause: " + t.toString(), t);
    }
  }

3. MapWrapper类

image.png

该类内部维护了一个Map<String, Object> 结构的map对象,设置值的方法:

  @Override
  public void set(PropertyTokenizer prop, Object value) {
    if (prop.getIndex() != null) {
      Object collection = resolveCollection(prop, map);
      setCollectionValue(prop, collection, value);
    } else {
      map.put(prop.getName(), value);
    }
  }

相关文章

网友评论

      本文标题:Mybatis之ObjectWrapper接口

      本文链接:https://www.haomeiwen.com/subject/npuihltx.html