Mybatis-TypeHandler<T>的使用

orm框架需要解决的问题之一就是数据库中的数据类型与java数据类型相互转换,以Mysql为例:

JdbcType.Varchar类型与String类型需要相互转换,mybatis内置了StringTypeHandler来处理这种转换

JdbcType.double类型与Double或double类型转换,内置有DoubleTypeHandler

。。。

在实际开发中,会遇到一些特殊类型的转换,例如:

  • JdbcType.Varchar 与 JSON类型
  • JdbcType.int 与 枚举类型
  • JdbcType.Varchar 与 List类型的转换

要实现这些特殊的类型转换,我们一般通过继承BaseTypeHandler 来自定义TypeHandler,泛型 T 表示需要转换的java类型

一个例子: java对象某属性为List类型,存到数据库中需要转换为vachar类型形如“1,2,3”的字符串,自定义handler如下

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
//泛型接收的是java类型
public class MyTypeHandler_2 extends BaseTypeHandler<List<Integer>> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<Integer> parameter, JdbcType jdbcType) throws SQLException {
//该方法用于将list转换成varchar,并设置到PreparedStatement中进行存储
StringBuilder sb = new StringBuilder();
for (int j = 0; j < parameter.size(); j++) {
sb.append(parameter.get(i) + ",");
}
String s = sb.toString();
ps.setString(i,s.substring(0,s.length()-1));
}


//后面三个方法都是将数据库中读取的varchar 转换成java需要的list类型
@Override
public List<Integer> getNullableResult(ResultSet rs, String columnName) throws SQLException {
String str = rs.getString(columnName);
return convert(str);
}

@Override
public List<Integer> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String str = rs.getString(columnIndex);
return convert(str);
}

@Override
public List<Integer> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String str = cs.getString(columnIndex);
return convert(str);
}

private List<Integer> convert(String str){
String[] strArray = str.split(",");
List<Integer> res = new ArrayList<>();
for(String s : strArray){
res.add(Integer.valueOf(s)) ;
}
return res;
}

如何配置自定义的TypeHandler:

1.在Mapper.xml中声明

1
<result column="enum1" jdbcType="INTEGER" property="enum1"typeHandler="com.xxx.handler.EnumTypeHandler"/>

2.在mybatis全局配置文件中设置

1
2
3
<typeHandlers>
<typeHandler handler="com.xxx.handler.EnumTypeHandler"/>
</typeHandlers>

3.在spring-boot的yml配置文件中设置类型处理器所在的包名

1
2
mybatis:
type-handlers-package: com.xxx.handler