自定义泛型TypeHandler的使用

泛型TypeHandler的使用

在上一篇博客中讲述了,TypeHandler的基本使用。但是对于某些结构对应多种类型。例如数据库字段为json结构,映射对象字段为自定义类型,那么难道到每种类型都要分别做处理吗?接下里稍作改造typeHandler,就可以完美适配。

1、将TypeHandler改为泛型的TypeHandler

1
JsonbTypeHandler<T> extends BaseTypeHandler<T>

2、给该类添加参数type并添加构造函数

1
2
3
4
5
6
7

private Class<T> type;

public JsonbTypeHandler(Class<T> type) {
if (type == null) throw new IllegalArgumentException("Type argument cannot be null");
this.type = type;
}

3、添加映射类型

每次添加需要映射的类型,只要在@MappedTypes注解中添加需要映射的类型就可以了

完整的带泛型的TypeHandler代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
@MappedJdbcTypes(value = {JdbcType.OTHER}, includeNullJdbcType = true)
@MappedTypes({ A.class , B[].class})
public class JsonbTypeHandler<T> extends BaseTypeHandler<T> {

private Logger logger = LoggerFactory.getLogger(getClass());

private ObjectMapper objectMapper = new ObjectMapper();

private Class<T> type;

public JsonbTypeHandler(Class<T> type) {
if (type == null) throw new IllegalArgumentException("Type argument cannot be null");
this.type = type;
}

/**
* 设置非空参数
*
* @param ps PreparedStatement
* @param parameterIndex 参数
* @param parameter 参数数组
* @param jdbcType jdbcType
* @throws SQLException
*/
@Override
public void setNonNullParameter(PreparedStatement ps, int parameterIndex, T parameter, JdbcType jdbcType)
throws SQLException {
String jsonText;
try {
jsonText = objectMapper.writeValueAsString(parameter);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}

ps.setString(parameterIndex, jsonText);
}

/**
* 获取可以为null的结果集
*
* @param resultSet 结果集
* @param columnName 列名
*/
@Override
public T getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
String jsonText = resultSet.getString(columnName);
return readToObject(jsonText);
}

/**
* 获取可以为null的结果集
*
* @param resultSet 结果集
* @param columnIndex columnIndex 列标
*/
@Override
public T getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
String jsonText = resultSet.getString(columnIndex);
return readToObject(jsonText);
}

/**
* 获取可以为null的结果集
*
* @param callableStatement CallableStatement
* @param columnIndex 列号
*/
@Override
public T getNullableResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
String jsonText = callableStatement.getString(columnIndex);
return readToObject(jsonText);
}

private T readToObject(String jsonText) {
if (StringUtils.isEmpty(jsonText)) {
return null;
}

try {
T list = objectMapper.readValue(jsonText, type);
return list;
} catch (IOException e) {
logger.error("字符串反序列化失败字符串为{}",jsonText,e);
}

return null;
}
}