当我们前端某个字段传入的是数组类型,有两个解决办法;一是创建关系表、二是使用自定义转换类将数组转为String存储。本文介绍的是第二种方法。
话不多说,直接开始
前端数据类型
{
"name":"名称",
"ids":[1,2,3]
}
1、实体类添加
@TableName(autoResultMap = true)
2、需要转换的对象
@TableField(typeHandler = SetTypeHandler.class)
private Set<Integer> ids;
3、自定义转换类:SetTypeHandler
@MappedTypes:数据类型 @MappedJdbcTypes:数据库类型
package com.sunther.document.util;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.type.*;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
/**
* set-string转化类
* @author admin
*/
@MappedTypes(Set.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class SetTypeHandler extends BaseTypeHandler<Set> {
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Set set, JdbcType jdbcType) throws SQLException {
String param = set.toString().replaceAll("\\[|\\]| ", "");
preparedStatement.setString(i, param);
}
@Override
public Set getNullableResult(ResultSet resultSet, String s) throws SQLException {
String sqlSet = resultSet.getString(s);
return getSet(sqlSet);
}
@Override
public Set getNullableResult(ResultSet resultSet, int i) throws SQLException {
String sqlSet = resultSet.getString(i);
return getSet(sqlSet);
}
@Override
public Set getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
String sqlSet = callableStatement.getString(i);
return getSet(sqlSet);
}
private Set<Integer> getSet(String sqlSet) {
if (StringUtils.isNotBlank(sqlSet)) {
return Arrays.asList(sqlSet.split(",")).stream()
.map(Integer::parseInt)
.collect(Collectors.toSet());
}
return new HashSet();
}
}
数据库存储为:1,2,3 varchart
接口返回为数组类型