自定义注解+反射 注入字典值到实体类
2019-01-09 本文已影响0人
HarryChoy
一.情况
开发中某个数据表查询出来的数据中有多个字段为字典码,需要从字典表中取出对应的字典值返回到前端。比如省份ID为01,产品品牌为C000,展示到前端希望是对应的省份名称,产品品牌名称。
数据表如下:

字典表数据样例如下:

二.思考与实现
字典表记录数据不多,可以考虑使用自定义注解+反射。在实体需要获取值的字段上加自定义注解,通过反射把值注入到对应的字段。
核心:通过实体类的字典码和注解类型找到对应的字典值,然后注入到对应要注入的字段。
具体实现:
1.自定义注解

2.实体类
public class CustInfo {
@BaseDataAnnotation(fieldType ="SALES_BRAND", fieldName ="custTypeName")
private StringcustType;
@BaseDataAnnotation(fieldType ="PROV_ID", fieldName ="provinceName")
private StringprovinceCode;
}
3.转换工具类

三.总结
数据表实现了转义功能,但是有可以优化的空间。
1.可以把字典表数据load到redis,设置失效时间,读取字典数据从redis取,取不到则从数据库load字典数据到redis,避免每次查询从数据库把字典数据放到内存,也可以在准确性要求不是特别高情况下使用。
2.可以在mybatis拦截器中把数据转换,需要转换的加上拦截器即可,方便调用。
3.在不考虑系统分库分表情况下,可以使用函数解决。