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