使用mybatis-plus很多时候我们实体类属性String是一个集合,比如数据库存地址希望存入 湖南省,邵阳市,xx县镇以,分割开,
直接上代码
public class positionInfo implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type= IdType.AUTO)
private Long id;
@ApiModelProperty(value = "职级")
@TableField("`rank`")
private String rank;
@ApiModelProperty(value = "星级")
private String starLevel;
@ApiModelProperty(value = "工作地点")
private List<String> workAddress;
}
workAddress是一个集合属性如果直接使用list映射会报如下错误
Type handler was null on parameter mapping for property ‘specPrices’. It was either not specified and/or could not be found for the javaType (java.util.List) : jdbcType (null) combination.
解决方案
使用TypeHandler自定义类型转换器 可以以,分割直接也可以改成/分割
/**
* @author: xxxx
* @date: 2021/11/04 15:24
* @description: 类型转换器,用于数据库的varchar和Java中List<String>类型的相互转换
*/
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class)
public class StringListTypeHandler implements TypeHandler<List<String>> {
@Override
public void setParameter(PreparedStatement preparedStatement, int i, List<String> strings, JdbcType jdbcType) throws SQLException {
// 遍历List类型的入参,拼装为String类型,使用Statement对象插入数据库
StringBuffer sb = new StringBuffer();
for (int j = 0; j < strings.size(); j++) {
if (j == strings.size() - 1) {
sb.append(strings.get(j));
} else {
sb.append(strings.get(j)).append(",");
}
}
preparedStatement.setString(i, sb.toString());
}
@Override
public List<String> getResult(ResultSet resultSet, String s) throws SQLException {
// 获取String类型的结果,使用","分割为List后返回
String resultString = resultSet.getString(s);
if (StringUtils.isNotEmpty(resultString)) {
return Arrays.asList(resultString.split(","));
}
return null;
}
@Override
public List<String> getResult(ResultSet resultSet, int i) throws SQLException {
// 获取String类型的结果,使用","分割为List后返回
String resultString = resultSet.getString(i);
if (StringUtils.isNotEmpty(resultString)) {
return Arrays.asList(resultString.split(","));
}
return null;
}
@Override
public List<String> getResult(CallableStatement callableStatement, int i) throws SQLException {
// 获取String类型的结果,使用","分割为List后返回
String resultString = callableStatement.getString(i);
if (StringUtils.isNotEmpty(resultString)) {
return Arrays.asList(resultString.split(","));
}
return null;
}
}
别忘记属性也要加上注解 @TableField(typeHandler = StringListTypeHandler.class)
这样就行了吗?还不行
由于mybatis-plus新增或者查询用的是两套映射,查询时workAddress是为null
需要再实体类在加上注解
@TableName(value = "对应的表名",autoResultMap = true)
大功告成