Mybatis-Plus使用typeHandler的坑

项目需求要将参数字符串List转换为特定形式存数据库,使用TypeHandler。自测发现update时字段不走handler,经核对需在实体类、自定义TypeHandler类、字段及配置文件做相应注解和配置。最终发现将@MappedTypes改为{ArrayList.class,List.class}问题解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中因为需求,需要将接收的参数字符串List转换成类似于:a,b,c 这样的形式保存到数据库中,所以使用了typeHandler,代码如下:

@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class)
public class ListToVarcharTypeHandler extends BaseTypeHandler<List<String>> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
        StringBuffer roles = new StringBuffer();
        for (int j = 0; j < parameter.size(); j++) {
            if (j == parameter.size() - 1) {
                roles.append(parameter.get(j));
            } else {
                roles.append(parameter.get(j)).append(",");
            }
        }
        ps.setString(i,roles.toString());
    }

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

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

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

自测时却发现update时字段无论如何都不走这个handler,然后经过网上查找资料,核对了以下几点:

  1. 实体类上,需要加上注解 @TableName(autoResultMap = true)
  2. 自定义TypeHandler类时,@MappedTypes({Object.class})是不生效 的,需要指定具体的type,比如List类型的字段需要指定为@MappedTypes({List.class})
  3. 自定义TypeHandler类需加注解:
    @MappedJdbcTypes(JdbcType.VARCHAR) //数据库类型
    @MappedTypes({List.class}) //java数据类型
  4. 字段上需要注解标注:@TableField( typeHandler = ListTypeHandler.class)
  5. 配置文件需要加上:mybatis-plus.type-handlers-package=com.package.handler(包名)

核对了以后都没问题,但是坑就在第2点,我写的就是@MappedTypes({List.class}),然后我打印参数类型是ArrayList,我猜想应该不可能是这个原因吧,但是实在没办法,抱着试试的想法,改成了@MappedTypes({ArrayList.class,List.class}),然后可以了。。。。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值