像 MybatisPlus 那样在方法中使用 Lambda 表达式获取对象属性名称

539 阅读1分钟

众所周知,在 Mybatis plus 里可以通过这种方式来查询数据:

QueryWrapper<PositionInfo> query = new QueryWrapper<>();
query.lambda().orderByDesc(PositionInfo::getGmtModified);

其中 PositionInfo::getGmtModified 是通过自定义函数的方式,将对象的属性传递给 QueryWrapper 写法可以说是相当优雅了。

MybatisPlus 对这种优雅的方式做了深度的封装,涉及缓存和多个对象传递,重写一遍会很复杂,不过如果只是拿来使用就很简单了,例子如下:

public class YxtXmlUtil {
    public static <T> String getXmlValue(Map<String, Object> valueMap, Map<String, Field> fieldMap, SFunction<T, ?> func) {
        String name = getColumnName(func);
        String propertyName = fieldMap.get(name).getAnnotation(TableField.class).value();
        return Convert.toStr(valueMap.get(propertyName), "");
    }

    public static <T> String getColumnName(SFunction<T, ?> func) {
        SerializedLambda resolve = LambdaUtils.resolve(func);
        return PropertyNamer.methodToProperty(resolve.getImplMethodName());
    }
}

//使用方式
YxtXmlUtil.getXmlValue(valueMap, fieldMap, OrgOuInfo::getZid)

这个是我获取xml对象时写的工具,核心是getColumnName方法,用到了Mybatis的工具,可以看出依赖MybatisPlus来使用,还是很简单的。