阿超
>
mp中typeHandler自动获取字段类型
相熟的人表现出恭而敬之的样子总是叫人感到可笑。——歌德
一般我们在实体类上指定
@TableName(autoResultMap = true)
即可使用typeHandler
指定转换器,然后就可以自动转换了
例如List<XXX>
的Json
可以如下使用:
1 2
| @TableField(typeHandler = JsonListHandler.class) private List<CalcUnitEnum> calcUnits;
|
这里JsonListHandler
如下,JacksonUtil
就懒得赘述了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import java.util.List;
public class JsonListHandler<T> extends AbstractJsonTypeHandler<List<T>> {
private Class<T> clazz;
public void setClazz(Class<T> clazz) { this.clazz = clazz; }
@Override protected List<T> parse(String json) { return JacksonUtil.toList(json, clazz); }
@Override protected String toJson(List<T> obj) { return JacksonUtil.toJson(obj); } }
|
光有这个是不够的,还需要在注入表信息时候,将字段内的泛型拿到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| import com.baomidou.mybatisplus.core.handlers.PostInitTableInfoHandler; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; import io.github.vampireachao.stream.core.reflect.ReflectHelper; import org.apache.ibatis.mapping.ResultMap; import org.apache.ibatis.mapping.ResultMapping; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.type.TypeHandler; import org.springframework.stereotype.Component;
@Component public class JsonPostInitTableInfoHandler implements PostInitTableInfoHandler {
@Override public void postTableInfo(TableInfo tableInfo, Configuration configuration) { for (TableFieldInfo fieldInfo : tableInfo.getFieldList()) { if (fieldInfo.getTypeHandler() == null) { continue; } if (tableInfo.getResultMap() == null) { return; } ResultMap resultMap = configuration.getResultMap(tableInfo.getResultMap()); for (ResultMapping resultMapping : resultMap.getResultMappings()) { TypeHandler<?> handler = resultMapping.getTypeHandler(); if (handler instanceof JsonListHandler) { JsonListHandler<Object> typeHandler = (JsonListHandler<Object>) handler; typeHandler.setClazz((Class<Object>) ReflectHelper.getGenericTypes(fieldInfo.getField().getGenericType())[0]); } } } PostInitTableInfoHandler.super.postTableInfo(tableInfo, configuration); } }
|