Mybatis-plus自定义类型处理器实现string[]到mysql text的映射

问题描述:

项目需要,数据库里一个text类型的字段,存储的内容是一个字符串数组,java里想使用string[]类型(当然string类型也行,只是不够优雅)

环境:

使用ruoyi-vue-plus脚手架

解决步骤如下:

自定义一个类型处理器

代码如下:

@MappedTypes({String[].class})
@MappedJdbcTypes({JdbcType.LONGVARCHAR})
public class StringArrayTypeHandler extends BaseTypeHandler<String[]> {
    private static String[] strArray = new String[]{};

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int parameterIndex,
                                    String[] parameter, JdbcType jdbcType) throws SQLException {
        preparedStatement.setString(parameterIndex, JsonUtils.toJsonString(parameter));
    }

    @Override
    public String[] getNullableResult(ResultSet resultSet, String columnName)
        throws SQLException {
        return JsonUtils.parseArray(resultSet.getString(columnName),String.class).toArray(strArray);

    }

    @Override
    public String[] getNullableResult(ResultSet resultSet, int columnIndex)
        throws SQLException {
        return JsonUtils.parseArray(resultSet.getString(columnIndex),String.class).toArray(strArray);
    }

    @Override
    public String[] getNullableResult(CallableStatement callableStatement, int columnIndex)
        throws SQLException {
        return JsonUtils.parseArray(callableStatement.getString(columnIndex),String.class).toArray(strArray);
    }
}

配置

配置有两种方案,全局配置和局部配置

全局配置

application.yml里,mybatis-plus配置项,增加一行:

typeHandlersPackage: com.xxxx.framework.typeHandler

作用是设置 TypeHandler 扫描路径,如果配置了该属性,SqlSessionFactoryBean 会把该包下面的类注册为对应的 TypeHandler

 局部配置

先在mapper.xml里对应的属性上指定类型处理器

 <result property="Imgs" column="imgs" typeHandler="com.xxx.framework.typeHandler.StringArrayTypeHandler"/>

然后在对应的实体类上也通过注解的方式指定类型处理器

@TableField(typeHandler = StringArrayTypeHandler.class)

按理说这样就行了,但是跑起来发现,插入数据是正常的,查询数据的时候该字段是null,调试发现类型处理器没有被调用,还需要自定义mapper接口才行,代码如下:

public interface DetailMapper extends BaseMapperPlus<DetailMapper, Detail, DetailVo> {
    @Results({
        @Result(property = "Imgs", column = "imgs",typeHandler= StringArrayTypeHandler.class),
    })
    @Select("SELECT * FROM detail WHERE id=#{id}")
    DetailVo selectVoById(Serializable id);
}

至于为什么会这样不得而知,欢迎指正

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值