看见mybatis-mate有这个功能,要授权才能用,所以..
mybatis interceptor使用详见自定义 mybatis interceptor
1,注解标记字段
package com.xyz.reports.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Description 字典绑定
* @Author zhouqibing
* @Create 2021-09-03 13:01
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
public @interface FieldBind {
/**
* 字典类型
* @author zhouqibing
* @date 2021/9/3 13:04
* @return java.lang.String
*/
String type();
/**
* 写字典值目标字段
* @author zhouqibing
* @date 2021/9/3 13:04
* @return java.lang.String
*/
String target();
}
2,@FieldBind使用
@Getter
@Setter
@ToString
@TableName("sys_role")
public class Role implements Serializable {
/**
* id
*/
private Integer id;
/**
* 角色名称
*/
private String name;
@FieldBind(type = "role_type", target = "typeName")
private Integer type;
@TableField(exist = false) // 标记该字段不是表列
private String typeName;
}
3,interceptor负责解析、赋值
package com.xyz.reports.configuration.interceptor;
import cn.hutool.core.util.ReflectUtil;
import com.xyz.reports.common.annotation.FieldBind;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.*;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* @Description 对查询结果
* @Create 2021-09-03 09:20
*/
@Component
@Intercepts({ @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = { Statement.class }) })
public class FieldInterceptor implements Interceptor {
@Resource
private DictService dictService;
@Override
public Object intercept(Invocation invocation) throws Throwable {
return setFieldValue(invocation.proceed());
}
/**
* 处理返回结果值
* @date 2021/9/6 11:20
* @param result
* @return java.lang.Object
*/
private Object setFieldValue(Object result){
if (result instanceof Collection) {
List<Object> list = new ArrayList<>();
for (Object obj : (Collection)result) {
list.add(setFieldValue(obj));
}
return list;
}
// 此处可根据需要加上一些判断优化处理,如result为基本数据类型对象、Map时不再执行后续代码,或只处理限定类等
Field[] fs = ReflectUtil.getFields(result.getClass());
for (Field f : fs) {
FieldBind dictBind = f.getAnnotation(FieldBind.class);
if (dictBind == null) {
continue;
}
// 获取@FieldBind标记字段具体值
Object value = ReflectUtil.getFieldValue(result, f);
// 设置目标字段的转换值
ReflectUtil.setFieldValue(result, dictBind.target(), dictService.get(dictBind.type(), value));
}
return result;
}
@Override
public Object plugin(Object target) {
if (target instanceof ResultSetHandler) {
return Plugin.wrap(target, this);
}
return target;
}
}
@Service
class DictService{
/**
* 获取值
* @date 2021/9/6 11:17
* @param type 类型,对应@FiledBind注解的type值
* @param value 值,对应@FiledBind标记字段的实际值
* @return java.lang.Object
*/
public Object get(String type, Object value){
return type + "-" + value;
}
}