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);
}

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