mp中typeHandler自动获取字段类型

简介: mp中typeHandler自动获取字段类型

相熟的人表现出恭而敬之的样子总是叫人感到可笑。——歌德

一般我们在实体类上指定

@TableName(autoResultMap = true)

即可使用typeHandler指定转换器,然后就可以自动转换了

例如ListJson可以如下使用:

@TableField(typeHandler = JsonListHandler.class)
private List<CalcUnitEnum> calcUnits;


这里JsonListHandler如下,JacksonUtil就懒得赘述了:

import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import java.util.List;
/**
 * @author VampireAchao
 * @since 2023/3/20 17:43
 */
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);
    }
}

光有这个是不够的,还需要在注入表信息时候,将字段内的泛型拿到

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;
/**
 * @author VampireAchao
 * @since 2023/3/20 18:10
 */
@Component
public class JsonPostInitTableInfoHandler implements PostInitTableInfoHandler {
    /**
     * 参与 TableInfo 初始化
     *
     * @param tableInfo     TableInfo
     * @param configuration Configuration
     */
    @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);
    }
}
相关文章
|
Java 数据库连接 mybatis
mybatis返回map类型数据空值字段不显示(三种解决方法)
mybatis返回map类型数据空值字段不显示(三种解决方法)
|
4月前
|
存储 Java 关系型数据库
MyBatisPlus中的TypeHandler | 自定义字段类型转换Handler
MyBatisPlus中的TypeHandler | 自定义字段类型转换Handler
507 0
|
4月前
|
Java 数据库连接 mybatis
mybatis plus字段为null或空字符串把原来的数据也更新了,只需要注解
mybatis plus字段为null或空字符串把原来的数据也更新了,只需要注解
159 0
|
9月前
|
Java
mp方法注入支持typeHandler
mp方法注入支持typeHandler
51 0
|
10月前
|
SQL 算法 关系型数据库
Mybatis-Plus3.0默认主键策略导致自动生成19位长度主键id的坑
Mybatis-Plus3.0默认主键策略导致自动生成19位长度主键id的坑
79 0
|
SQL Java 数据库连接
MyBatis动态设置表名 获取添加功能自增的主键 自定义映射
MyBatis动态设置表名 获取添加功能自增的主键 自定义映射
175 0
|
SQL Java 关系型数据库
Mybatis Map接收数据tinyint(1)类型错误
简要讲述Mybatis使用Map接收返回数据时,tinyint(1)类型数据返回类型错误
Mybatis Map接收数据tinyint(1)类型错误
|
存储 关系型数据库 MySQL
jdbc之操作BLOB类型字段
jdbc之操作BLOB类型字段
jdbc之操作BLOB类型字段
|
前端开发 Java 数据库连接
MyBatis在字段返回为null不返回字段
MyBatis在字段返回为null不返回字段
1108 0
|
存储 SQL Java
【方向盘】MyBatis封装结果集时,Integer类型的id字段被赋值成了Long类型---读源码找原因(上)
【方向盘】MyBatis封装结果集时,Integer类型的id字段被赋值成了Long类型---读源码找原因(上)
【方向盘】MyBatis封装结果集时,Integer类型的id字段被赋值成了Long类型---读源码找原因(上)