1.增加Handler数组转换类
编写ArrayAllTypeHandler 继承BaseTypeHandler就行了
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.URL;
import java.sql.Array;
import java.sql.CallableStatement;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.OffsetTime;
import java.util.Calendar;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.apache.ibatis.type.TypeException;
import org.springframework.util.StringUtils;
@MappedTypes({Object.class})
@MappedJdbcTypes({JdbcType.ARRAY})
public class ArrayAllTypeHandler extends BaseTypeHandler<Object[]> {
private static final ConcurrentHashMap<Class<?>, String> STANDARD_MAPPING = new ConcurrentHashMap();
public ArrayAllTypeHandler() {
}
public void setNonNullParameter(PreparedStatement ps, int i, Object[] parameter, JdbcType jdbcType) throws SQLException {
Class<?> componentType = parameter.getClass().getComponentType();
String arrayTypeName = this.resolveTypeName(componentType);
if (StringUtils.isEmpty(arrayTypeName)) {
throw new TypeException("ArrayType Handler requires SQL array or java array parameter and does not support type " + parameter.getClass());
} else {
Array array = ps.getConnection().createArrayOf(arrayTypeName, parameter);
ps.setArray(i, array);
array.free();
}
}
protected String resolveTypeName(Class<?> type) {
return (String)STANDARD_MAPPING.getOrDefault(type, JdbcType.JAVA_OBJECT.name());
}
public Object[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
return this.extractArray(rs.getArray(columnName));
}
public Object[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return this.extractArray(rs.getArray(columnIndex));
}
public Object[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return this.extractArray(cs.getArray(columnIndex));
}
protected Object[] extractArray(Array array) throws SQLException {
if (array == null) {
return null;
} else {
try {
return (Object[])((Object[])array.getArray());
} catch (Exception var3) {
return null;
}
}
}
static {
STANDARD_MAPPING.put(BigDecimal.class, JdbcType.NUMERIC.name());
STANDARD_MAPPING.put(BigInteger.class, JdbcType.BIGINT.name());
STANDARD_MAPPING.put(Boolean.TYPE, JdbcType.BOOLEAN.name());
STANDARD_MAPPING.put(Boolean.class, JdbcType.BOOLEAN.name());
STANDARD_MAPPING.put(byte[].class, JdbcType.VARBINARY.name());
STANDARD_MAPPING.put(Byte.TYPE, JdbcType.TINYINT.name());
STANDARD_MAPPING.put(Byte.class, JdbcType.TINYINT.name());
STANDARD_MAPPING.put(Calendar.class, JdbcType.TIMESTAMP.name());
STANDARD_MAPPING.put(Date.class, JdbcType.DATE.name());
STANDARD_MAPPING.put(java.util.Date.class, JdbcType.TIMESTAMP.name());
STANDARD_MAPPING.put(Double.TYPE, JdbcType.DOUBLE.name());
STANDARD_MAPPING.put(Double.class, JdbcType.DOUBLE.name());
STANDARD_MAPPING.put(Float.TYPE, JdbcType.REAL.name());
STANDARD_MAPPING.put(Float.class, JdbcType.REAL.name());
STANDARD_MAPPING.put(Integer.TYPE, JdbcType.INTEGER.name());
STANDARD_MAPPING.put(Integer.class, JdbcType.INTEGER.name());
STANDARD_MAPPING.put(LocalDate.class, JdbcType.DATE.name());
STANDARD_MAPPING.put(LocalDateTime.class, JdbcType.TIMESTAMP.name());
STANDARD_MAPPING.put(LocalTime.class, JdbcType.TIME.name());
STANDARD_MAPPING.put(Long.TYPE, JdbcType.BIGINT.name());
STANDARD_MAPPING.put(Long.class, JdbcType.BIGINT.name());
STANDARD_MAPPING.put(OffsetDateTime.class, JdbcType.TIMESTAMP_WITH_TIMEZONE.name());
STANDARD_MAPPING.put(OffsetTime.class, JdbcType.TIME_WITH_TIMEZONE.name());
STANDARD_MAPPING.put(Short.class, JdbcType.SMALLINT.name());
STANDARD_MAPPING.put(String.class, JdbcType.VARCHAR.name());
STANDARD_MAPPING.put(Time.class, JdbcType.TIME.name());
STANDARD_MAPPING.put(Timestamp.class, JdbcType.TIMESTAMP.name());
STANDARD_MAPPING.put(URL.class, JdbcType.DATALINK.name());
}
}
2.在mybatis中导出的字段typeHandler属性加上handler类地址
<resultMap id="getLatestDataMap" type="com.dataofx.baseboot.entity.PersonStatisticsEntity">
<result column="total_minute" property="totalMinute" typeHandler="com.dataofx.typehandler.ArrayAllTypeHandler"></result>
<result column="total_company_working" property="totalCompanyWorking"></result>
<result column="statistics_time" property="statisticsTime"></result>
</resultMap>
注意:实体类中的数组必须是Object,比如Integer[]