问题描述:
项目需要,数据库里一个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);
}
至于为什么会这样不得而知,欢迎指正