typehandle处理list集合

使用mybatis-plus很多时候我们实体类属性String是一个集合,比如数据库存地址希望存入 湖南省,邵阳市,xx县镇以,分割开,
直接上代码

public class positionInfo implements Serializable {

    private static final long serialVersionUID = 1L;
    @TableId(type= IdType.AUTO)
    private Long id;

    @ApiModelProperty(value = "职级")
    @TableField("`rank`")
    private String rank;

    @ApiModelProperty(value = "星级")
    private String starLevel;

    @ApiModelProperty(value = "工作地点")
    private List<String> workAddress;
    }

workAddress是一个集合属性如果直接使用list映射会报如下错误
Type handler was null on parameter mapping for property ‘specPrices’. It was either not specified and/or could not be found for the javaType (java.util.List) : jdbcType (null) combination.
解决方案
使用TypeHandler自定义类型转换器 可以以,分割直接也可以改成/分割

/**
 * @author: xxxx
 * @date: 2021/11/04 15:24
 * @description: 类型转换器,用于数据库的varchar和Java中List<String>类型的相互转换
 */
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class)
public class StringListTypeHandler implements TypeHandler<List<String>> {
    @Override
    public void setParameter(PreparedStatement preparedStatement, int i, List<String> strings, JdbcType jdbcType) throws SQLException {
        // 遍历List类型的入参,拼装为String类型,使用Statement对象插入数据库
        StringBuffer sb = new StringBuffer();
        for (int j = 0; j < strings.size(); j++) {
            if (j == strings.size() - 1) {
                sb.append(strings.get(j));
            } else {
                sb.append(strings.get(j)).append(",");
            }
        }
        preparedStatement.setString(i, sb.toString());
    }

    @Override
    public List<String> getResult(ResultSet resultSet, String s) throws SQLException {
        // 获取String类型的结果,使用","分割为List后返回
        String resultString = resultSet.getString(s);
        if (StringUtils.isNotEmpty(resultString)) {
            return Arrays.asList(resultString.split(","));
        }
        return null;
    }

    @Override
    public List<String> getResult(ResultSet resultSet, int i) throws SQLException {
        // 获取String类型的结果,使用","分割为List后返回
        String resultString = resultSet.getString(i);
        if (StringUtils.isNotEmpty(resultString)) {
            return Arrays.asList(resultString.split(","));
        }
        return null;
    }

    @Override
    public List<String> getResult(CallableStatement callableStatement, int i) throws SQLException {
        // 获取String类型的结果,使用","分割为List后返回
        String resultString = callableStatement.getString(i);
        if (StringUtils.isNotEmpty(resultString)) {
            return Arrays.asList(resultString.split(","));
        }
        return null;
    }
}
别忘记属性也要加上注解   @TableField(typeHandler = StringListTypeHandler.class)
这样就行了吗?还不行
由于mybatis-plus新增或者查询用的是两套映射,查询时workAddress是为null
需要再实体类在加上注解
@TableName(value = "对应的表名",autoResultMap = true)
大功告成

在MyBatisPlus中,TypeHandler是一种用于将Java对象转换成SQL查询中的字符串或者从数据库结果中解析回Java对象的工具。如果你设置了TypeHandler,但查询结果并未自动映射到MyBatisPlus的Model上(即未使用`@TableId`、`@TableName`等注解),你需要手动配置或者自定义处理。 1. **手动配置**:可以在`GlobalConfig`全局配置里设置实体扫描路径(`baseMapperScan`)和实体全限定名(`global-config-model-cache`),确保MyBatisPlus能识别并关联到正确的Entity。 ```java // GlobalConfig.java public void globalConfig(GlobalConfig config) { // 自定义扫描路径和Entity全限定名 config.setBaseMapperPackage("com.example.mapper"); // 替换为你的mapper包路径 config.setModelCache().setBaseEntityClass(User.class); // 替换为你的User Entity全限定名 } ``` 2. **自定义TypeHandler**:如果需要对某个字段的处理更精细,可以创建自定义的TypeHandler,并注册到对应的字段上。 ```java // 自定义TypeHandler示例 public class CustomTypeHandler implements TypeHandler<User> { @Override public Object handleResult(ResultContext context) { User user = new User(); // 根据数据库数据填充User实例 return user; } @Override public String convertToDatabaseColumn(Object parameter) { // 将Java对象转为数据库插入字符串 return null; } } // 注册TypeHandler TypeHandlerRegistry registry = MyBatisPlus.getSqlSessionTemplate().getMapperFactory().getTypeHandlerRegistry(); registry.registerTypeHandler(User.class, customTypeHandler); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值