Mybatis 自定义类型处理器

开发中,我们会遇到 Mybatis 本身不支持的数据格式处理,比如自定义对象或者JSON对象等。幸运的是,Mybatis支持重写已有的类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。

具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler, 并且可以(可选地)将它映射到一个 JDBC 类型。

举个栗子🌰:

将 fastjson.JSONObject 对象以字符串形式写入 MySQl。

定义实体类

originMsgBody 对应数据库同名字段。

1
2
3
4
5
6
7
8
public class MessageDO {
    private int msgId;
    // 省略部分字段
    private JSONObject originMsgBody;
    private Date createTime;
    private Date modifyTime;
    // 省略getter setter
}

自定义 JSONObject 类型处理器(JSONObjectTypeHandler)

 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
package com.mangobeta.app.mybatis.handler;

import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JSONObjectTypeHandler extends BaseTypeHandler<JSONObject> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, parameter.toJSONString());
    }

    @Override
    public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return JSONObject.parseObject(rs.getString(columnName));
    }

    @Override
    public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return JSONObject.parseObject(rs.getString(columnIndex));
    }

    @Override
    public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return JSONObject.parseObject(cs.getString(columnIndex));
    }

}

application.yml 配置

这里指定路径为上一步 JSONObjectTypeHandler 包路径。

1
2
mybatis:
  type-handlers-package: com.mangobeta.app.mybatis.handler

mybatis-config.xml 配置

1
2
3
<typeHandlers>
        <typeHandler handler="com.mangobeta.app.mybatis.handler.JSONObjectTypeHandler"/>
    </typeHandlers>

现在 xml 里写入数据就会将 JSON 对象插入时转为字符串了。

参考

updatedupdated2020-10-212020-10-21
Load Comments?