@AbValueMap 值映射注解
由来
在开发中,数据表中某字段关联自用户、字典、枚举等,查出数据后需要对其转换成视图对象,再加载出关联描述值,此等重复操作遍布各处代码块。为减少这些重复性操作,抽象出了值映射注解@AbValueMap
,该注解只需标注在字段上,配置对应属性,就能实现数据关联查询。
注解属性
属性 | 类型 | 描述 |
---|---|---|
type | AbValueMapType | 值映射类型 ENUM(枚举) DICT(字典) CATEGORY(类别) USER(用户) CUSTOM(自定义加载器) |
loader | AbValueMapLoader | 扩展加载器,运行时从Spring容器中加载 |
fixValue | String | 固定值,不同值映射类型下定义 DICT(字典):字典编码 CATEGORY(类别):类别编码 |
fixClass | Class<?> | 不同值类型下定义 ENUM(枚举),枚举类 |
matchField | String | 匹配字段,不同值映射类型默认定义 ENUM(枚举):key、code、type(从左往右匹配枚举类中属性) DICT(字典):code(字典编码) CATEGORY(类别):code(分类编码) USER(用户):userId(用户编号) |
attrMap | AbValueMap.AttrMap | 字段映射,未配置默认为 标注字段名+加载映射值字段驼峰 |
-- originName | String | 原字段名 |
-- targetName | String | 指定字段名 |
扩展加载器
**实现接口:**com.dstz.base.common.valuemap.AbValueMapLoader
public interface AbValueMapLoader<K, V> {
/**
* 加载映射
*
* @param abValueMap 值映射器
* @param mapKeys 映射键
* @return 数据关联,KEY:引用参数mapKeys,值泛型V
*/
Map<K, V> loading(AbValueMap abValueMap, Collection<K> mapKeys);
}
示例:USER实现
@Component("abUserValueMapLoader")
public class AbUserValueMapLoader implements AbValueMapLoader<String, IUser> {
private static final String DEFAULT_ATTR_NAME = LambdaUtil.getFieldName(IUser::getUserId);
private final UserApi userApi;
public AbUserValueMapLoader(UserApi userApi) {
this.userApi = userApi;
AbValueMapLoaderProvider.register(AbValueMapType.USER, this);
}
@Override
public Map<String, IUser> loading(AbValueMap abValueMap, Collection<String> mapKeys) {
final String attrName = StrUtil.emptyToDefault(abValueMap.matchField(), DEFAULT_ATTR_NAME);
Iterable<? extends IUser> iterable;
// 用户ID
if (DEFAULT_ATTR_NAME.equalsIgnoreCase(attrName)) {
iterable = userApi.getByUserIds(mapKeys);
} else {
iterable = userApi.getByAttribute(attrName, CastUtils.cast(mapKeys));
}
return StreamUtil.of(iterable, true).collect(Collectors.toMap(o -> o.getAttrValue(attrName, String.class), Function.identity()));
}
}
使用案例
值映射类型:Enum(枚举)
SysDataSource.java
public class SysDataSource {
/**
* 类型
*/
@TableField("db_type_")
@AbValueMap(type = AbValueMapType.ENUM, enumClass = AbDbType.class, attrMap = @AbValueMap.AttrMap(originName = "desc"))
private String dbType;
public String getDbType() {
return dbType;
}
public void setDbType(String dbType) {
this.dbType = dbType;
}
}
请求接口
$ curl -X POST -H 'Content-Type: application/json' -d '{}' 'http://localhost:8080/ab-bpm/sys/dataSource/listJson'
{
"isOk": true,
"code": "Success",
"message": "Request Success.",
"data": {
"pageSize": 10,
"page": 1,
"total": 2,
"rows": [
{
"dbType": "mysql",
"dbTypeDesc": "MySQL数据库"
},
{
"dbType": "mysql",
"dbTypeDesc": "MySQL数据库"
}
],
"empty": false
}
}
值映射类型:USER(用户)
OrgUser.java
public class OrgUser {
/**
* 创建人ID
*/
@TableField(value = "create_by_", fill = FieldFill.INSERT)
@AbValueMap(type = AbValueMapType.USER, attrMap = @AbValueMap.AttrMap(originName = "fullName", targetName = "creator"))
private String createBy;
}
请求接口
$ curl -w '\n' -H 'Content-Type: application/json' -d '{}' 'http://localhost:8080/ab-org/user/listJson'
{
"isOk": true,
"code": "Success",
"message": "Request Success.",
"data": {
"pageSize": 1,
"page": 1,
"total": 1,
"rows": [
{
"createBy": "1",
"creator": "新增用户222111"
}
],
"empty": false
},
"requestId": "6e73da76f8044cf9b72571f748906847",
"responseTime": "2022-03-28 09:41:32",
"msg": "Request Success."
}
修改于 2022-03-28 03:26:00