背景
转换结果数据:
1.方案:数据库表存储关系表的ID,如作者ID、机构ID、部门ID等,前面显示需要名称。通常通过关系表查询名称来解决,但这可能会导致查询执行效率低下和SQL复杂性,您可以定义名称字段来存储名称。
2.策略:数据库表存储关联表的ID,但字段类型定义为字符串类型(为代码生成器生成字符串类型字段)。服务层向外部提供的统一是身份查询结果,如果需要展示,controller将通过DataConverter转换为名称,并返回前端演示文稿
3.如果查询结果对象是POJO(DTO\VO\ENTITY)并定义了名称字段(名称字段必须以Name结尾,如userid-"userName,org-" orgName)
4.如果查询结果对象是Map,则会添加“名称”字段(名称字段必须以Name结尾,例如userID-"username,org-" org Name),名称存储在“名称”字段中,并且不会复盖“ID”字段。
5.DataConverter调用并缓存关系表中的服务查询名称,从而提供转换效率
调用方法
//转换分页对象数据
Da,第页);
//转换单个对象
Da、obj);
//集合对象转换
Da,名单);其中DataType是支持的数据类型(请参阅源代码)。如果对默认转换字段不满意,请临时调用以下代码;要比较公用字段,请要求管理员将它们添加到数据类型配置中。
数据预转换
在要转换的字典值之前添加字典编码的SQL查询语句。例如:其中yes_no、user_type是字典编码。
Select concat ('yes _ no ''-'t.status),concat ('user _ type ''-'t.tatus)
DA;“状态”、“类型”);具体实现
DataConverter:生成的数据转换器
Package com
Importcn。
import com . baomidou . myba;
Import com。
Import com。
Import com。
Import com。
Import com。
Import lombok.ex
Import java.u
Import java.u
Import java.u
Import java.u
/* *
*结果数据转换器
*
* @Author: lincl
* @ date3360 2019/2/28 16336011
*/
@Slf4j
Public class DataConverter {
/* *
*最大缓存数
*/
private final static int max _ size=10000;
/* *
* redis
*/
private static redis util redis util;
/* *
*初始化
*/
Public static void init() {
//初始化导入bean
If (redisUtil==null) {
RedisUtil=S);
}
}
/* *
*抽取名称
*
* @param dataType
* @param id
* @return
*/
public static string getname(datatype datatype,string id) {
//初始化
init();
ListString idList=S(id,'');
//查询结果
ListString result=redi(),id list);
//请求服务后,如果没有数据,则返回id
If (result==null) {
Return id
}
Return S(''re)
sult); } /** * 更新缓存 * * @param dataType 数据类型 * @param list 数据集合 */ public static void setName(DataType dataType, List<OptionDTO> list) { // 初始化 init(); Map<String, String> map = new HashMap<>()); for (OptionDTO item : list) { map.pu(), i()); } // 更新缓存 redi(), map); log.info("“ {} ” 缓存设置成功!共 {} 个数据!", da(), li()); } /** * 更新名称 * * @param dataType 数据类型 * @param id id * @param name 名称 */ public static void updName(DataType dataType, String id, String name) { // 初始化 init(); // 更新缓存 redi(), id, name); } /** * 删除名称 * * @param dataType 数据类型 * @param ids ids */ public static void delName(DataType dataType, String... ids) { // 初始化 init(); redi(), Arrays.asList(ids)); } /** * 单个对象转换 * * @param dataType 数据类型 * @param obj 数据对象 * @param <T> * @return */ public static <T> T toName(DataType dataType, T obj) { return Da(dataType, obj, null); } /** * 集合转换 * * @param list 数据集合 * @param <T> * @return */ public static <T> List<T> toName(DataType dataType, List<T> list) { return Da(dataType, list, null); } /** * 分页对象转换 * * @param page * @return */ public static Page toName(DataType dataType, Page page) { return Da(dataType, page, null); } /** * 单个对象转换 * * @param dataType 数据类型 * @param obj 数据对象 * @param fieldNames 转换字段名称 * @param <T> * @return */ public static <T> T toName(DataType dataType, T obj, String[] fieldNames) { if (obj == null) { return null; } // 默认转换字段 if (fieldNames)) { fieldNames = da(); } if (fieldNames)) { for (int i = 0; i < ; i++) { String fieldName = fieldNames[i]; // 存储名称的字段名 String labelField = ("Id", "") + "Name"; try { //Map对象 if (obj instanceof Map) { if (((Map) obj).get(fieldName) != null) { String userId = ((Map) obj).get(fieldName) + ""; String nickName = Da(dataType, userId); ((Map) obj).put(labelField, nickName); } } else { Class clz = obj.getClass(); if (clz, fieldName)) { String id = (String) Re(obj, fieldName); if (id)) { String nickName = Da(dataType, id); if (clz, labelField)) { // 定义了额外的字段来存储名称 Re(obj, labelField, nickName); } else { Re(obj, fieldName, nickName); } } } } } catch (Exception e) { log.error(), e); } } } return obj; } /** * 集合转换 * * @param list 数据集合 * @param fieldNames 字段名称 * @param <T> * @return */ public static <T> List<T> toName(DataType dataType, List<T> list, String[] fieldNames) { if (list != null && li() > 0) { for (int i = 0; i < li(); i++) { Da(dataType, li(i), fieldNames); } } return list; } /** * 分页对象转换 * * @param page * @param fieldNames 字段名称 * @return */ public static Page toName(DataType dataType, Page page, String[] fieldNames) { if () != null && ().size() > 0) { Da(dataType, (), fieldNames); } return page; } }DataType:数据类型
package com.;
/**
* 数据类型枚举类
*
* @author lincl
*/
public enum DataType {
/**
* 用户账号昵称,默认转换字段:"createBy", "updateBy", "operator", "orderUserId", "pushUserId"
*/
USER_NICK_NAME("用户账号昵称", "userId", "createBy", "updateBy", "operator", "orderUserId", "pushUserId", "returnUserId", "optionUserId", "sendUserId", "receiveUserId", "receiveUserIds"),
/**
* 机构名称,默认转换字段:"orgId", "hospitalOrgId"
*/
ORG_NAME("机构名称", "orgId","reqOrgId", "userBuyerId", "userSupplierId"),
/**
* 厂家名称,默认转换字段:"factoryId"
*/
FACTORY_NAME("厂家名称", "factoryId", "factory", "userFactoryId"),
/**
* 部门名称,默认转换字段:"deptId"
*/
DEPT_NAME("部门名称", "deptId", "departmentId"),
/**
* 部门合并名称,默认转换字段:"deptMergeId"
*/
DEPT_MERGE_NAME("部门合并名称", "deptMergeId", "deptId", "departmentId"),
/**
* 行政区域名称
*/
REGION_NAME("行政区域名称", "province", "city", "district", "region", "provinceId", "cityId", "districtId"),
/**
* 药械网:数据字典
*/
YAOXIE_DICT_ITEM("数据字典", null),
/**
* 统一认证:数据字典
*/
AUTH_DICT_ITEM("数据字典", null),
/**
* 权限名称
*/
PERMISSION("权限名称", "permissionId");
/**
* 类型
*/
private String type;
/**
* 默认转换字段
*/
private String[] fieldNames;
DataType(String type, String... fieldNames) {
= type;
= fieldNames;
}
/**
* 获取数据类型
*
* @return
*/
public String getType() {
return type;
}
/**
* 获取默认转换字段
*
* @return
*/
public String[] getFieldNames() {
return fieldNames;
}
/**
* 获取缓存前缀
*
* @return
*/
public String getCachePrefix() {
return "ID_NAME:" + ();
}
}