项目中因为需求,需要将接收的参数字符串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,然后经过网上查找资料,核对了以下几点:
- 实体类上,需要加上注解 @TableName(autoResultMap = true)
- 自定义TypeHandler类时,@MappedTypes({Object.class})是不生效 的,需要指定具体的type,比如List类型的字段需要指定为@MappedTypes({List.class})
- 自定义TypeHandler类需加注解:
@MappedJdbcTypes(JdbcType.VARCHAR) //数据库类型
@MappedTypes({List.class}) //java数据类型 - 字段上需要注解标注:@TableField( typeHandler = ListTypeHandler.class)
- 配置文件需要加上:mybatis-plus.type-handlers-package=com.package.handler(包名)
核对了以后都没问题,但是坑就在第2点,我写的就是@MappedTypes({List.class}),然后我打印参数类型是ArrayList,我猜想应该不可能是这个原因吧,但是实在没办法,抱着试试的想法,改成了@MappedTypes({ArrayList.class,List.class}),然后可以了。。。。。。