Mybatis对应typehandler的操作

文章目录
  1. 1. 如何自定义 TypeHandler
    1. 1.1. 示例代码
    2. 1.2. 在 MyBatis 配置文件中注册
    3. 1.3. 在 configBean下配置

Mybatis在操作 非基础的 Java 对象的时候提供 Type handle 转换类似于字符串转换成 Java 对象,类似 JPA 的 ORM

TypeHandler 是 MyBatis 中用于处理 Java 类型和数据库类型之间转换的接口。通过自定义 TypeHandler,可以实现特定类型的转换逻辑,从而使得 MyBatis 在处理复杂类型时更加灵活。

TypeHandler 是 MyBatis 中用于处理 Java 类型和数据库类型之间转换的接口。通过自定义 TypeHandler,可以实现特定类型的转换逻辑,从而使得 MyBatis 在处理复杂类型时更加灵活。

如何自定义 TypeHandler

创建自定义 TypeHandler 的步骤如下:

  1. 实现 TypeHandler 接口:首先创建一个类并实现 org.apache.ibatis.type.TypeHandler 接口。
  2. 重写接口方法:你需要实现四个方法:setParametergetResult (有三个重载形式)。
  3. 注册 TypeHandler:在 MyBatis 配置文件中注册自定义的 TypeHandler,或者在 Mapper 文件中指定使用该 TypeHandler。

示例代码

下面是一个简单的示例,展示如何将字符串类型转换为自定义的 Java 对象。

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
public class CustomTypeHandler implements TypeHandler<CustomType> {

@Override
public void setParameter(PreparedStatement ps, int i, CustomType parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter.toString());
}

@Override
public CustomType getResult(ResultSet rs, String columnName) throws SQLException {
String columnValue = rs.getString(columnName);
return new CustomType(columnValue);
}

@Override
public CustomType getResult(ResultSet rs, int columnIndex) throws SQLException {
String columnValue = rs.getString(columnIndex);
return new CustomType(columnValue);
}

@Override
public CustomType getResult(CallableStatement cs, int columnIndex) throws SQLException {
String columnValue = cs.getString(columnIndex);
return new CustomType(columnValue);
}
}

在 MyBatis 配置文件中注册

1
2
3
<typeHandlers>
<typeHandler handler="com.example.CustomTypeHandler"/>
</typeHandlers>

在 configBean下配置

1
通过配置注入我们设定的类型处理

通过以上步骤,你可以实现自定义的 TypeHandler,并在 MyBatis 中灵活地处理复杂类型的数据转换。

但是对于 Map<K,V>这种格式的数据需要单独配置后解析所有的 map

需要定义一个

private final Type MAP_TYPE;

public MybatisMapTypeHandler() {

​ this.MAP_TYPE = new TypeToken<Map<K, V>>() {

​ }.getType();

}

否则建了多个 map的 typehand会报错,如果不用

private final Type MAP_TYPE; 来接可能对于复杂的的 map<key,value<List>>这种可能会解析的不一样,

这里我使用 gson 来解析.