注解形式实现
1.创建注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Constant {
String table_name();
String field_name();
}
2.常量表sql
CREATE TABLE `bd_constant` (
`id` varchar(36) NOT NULL COMMENT '表主键ID,PK',
`table_name` varchar(64) NOT NULL COMMENT '表名',
`field_name` varchar(64) NOT NULL COMMENT '列名',
`display_name` varchar(256) NOT NULL COMMENT '显示名称',
`column_value` varchar(256) NOT NULL COMMENT '列值',
`column_desc` varchar(256) DEFAULT NULL COMMENT '列说明',
`order_num` int(11) NOT NULL DEFAULT '1' COMMENT '显示序号(升序)',
`group_id` varchar(36) NOT NULL COMMENT '集团ID,引用自表:sys_group.id',
`com_id` varchar(36) NOT NULL COMMENT '公司ID,引用自表:sys_company.id',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_user_id` varchar(36) DEFAULT NULL COMMENT '创建人id,引用自表:sys_employee.id',
`create_user_name` varchar(64) DEFAULT NULL COMMENT '创建人姓名冗余',
`modify_time` datetime DEFAULT NULL COMMENT '最后修改时间,用来控制是否被其他人修改过',
`modify_user_id` varchar(36) DEFAULT NULL COMMENT '最后修改人id,引用自表:sys_employee.id',
`modify_user_name` varchar(64) DEFAULT NULL COMMENT '最后修改人姓名冗余',
`enabled` bit(1) NOT NULL DEFAULT b'1' COMMENT '启用标记(0停用,1启用)',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '删除标记(0未删除,1已删除)',
`remark` varchar(256) DEFAULT NULL COMMENT '备注',
`vdef1` varchar(256) DEFAULT NULL COMMENT '自定义字段',
`vdef2` varchar(256) DEFAULT NULL COMMENT '自定义字段',
`vdef3` varchar(256) DEFAULT NULL COMMENT '自定义字段',
`vdef4` varchar(256) DEFAULT NULL COMMENT '自定义字段',
`vdef5` varchar(256) DEFAULT NULL COMMENT '自定义字段',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='常量库';
3.注解的实现类
package com.yonan.bd.utils;
import com.alibaba.fastjson.JSON;
import com.yonan.bd.po.ConstantPO;
import com.yonan.bd.service.ConstantService;
import com.yonan.bd.vo.ConstantVO;
import com.yonan.common.annotations.Constant;
import com.yonan.common.utils.redis.RedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;
@Service
public class ConstantConversion {
@Autowired
ConstantService constantService;
@Autowired
RedisUtils redisUtils;
public void convertSingle(Object obj) {
try {
Map<Object, Object> map = getConstantByRedisCache();
if (null==map||map.size()<1){
setConstantByRedis();
map=getConstantByRedisCache();
}
if (null==map||map.size()<1){
return;
}
Class<?> objClass = obj.getClass();
List<Field> fieldsList = new ArrayList<Field>();
while (objClass != null) {
Field[] declaredFields = objClass.getDeclaredFields();
fieldsList.addAll(Arrays.asList(declaredFields));
objClass = objClass.getSuperclass();
}
for (Field declaredField : fieldsList) {
Constant annotation = declaredField.getAnnotation(Constant.class);
if (null != annotation) {
String objectMethod = getObjectMethod(obj, annotation.field_name());
String key=annotation.table_name()+annotation.field_name()+objectMethod;
ConstantVO constantVO = JSON.parseObject(JSON.toJSONString(map.get(key)), ConstantVO.class);
if (null != constantVO){
String display_name = constantVO.getDisplay_name();
setObjectMethod(obj,declaredField.getName(),display_name);
}
}
}
} catch (Exception e) {
e.printStackTrace();
e.getMessage();
}
}
public <T> void convertSingleList(List<T> list) {
for (Object o : list) {
convertSingle(o);
}
}
public static String getObjectMethod(Object obj, String attribute_name) throws Exception {
String getterName = "get" + firstCharToUpper(attribute_name);
Method method = obj.getClass().getMethod(getterName);
return (String) method.invoke(obj);
}
public static void setObjectMethod(Object obj,String attribute_name,String set_value) throws Exception{
String setterName ="set" +firstCharToUpper(attribute_name);
Method declaredMethod = obj.getClass().getMethod(setterName,String.class);
declaredMethod.invoke(obj, set_value);
}
public static String firstCharToUpper(String str) {
if (str == null || str.equals(""))
return str;
char f = str.charAt(0);
str = String.valueOf(f).toUpperCase() + str.substring(1);
return str;
}
public void setConstantByRedis(){
List<ConstantPO> list = constantService.list();
List<ConstantVO> constantVOS = constantService.poToVo(list);
for (ConstantVO constantVO : constantVOS) {
constantVO.setCreate_time(null);
constantVO.setModify_time(null);
}
Map<String, Object> map = constantService.listToMapByAdd(constantVOS);
redisUtils.hmset("constant",map);
}
public Map<Object, Object> getConstantByRedisCache() {
return redisUtils.hmget("constant");
}
}
4.只需要在新创建的字段上加上注解就行,例如:
@TableField(exist = false)
@Constant(table_name = "bd_employee",field_name ="married")
private String married_name;
5.redis工具类
涉及到RedisUtils的到Redis工具类中查看