Mybaitis之自定义TypeHandler

1,768 阅读1分钟

今天在项目中遇到一个需要从数据中读取一段字符然后转化成list类型。由于忘记了TypeHandler的存在,就定义了一个对象,内部添加了一个StringList类型的成员变量,处理起来比较麻烦。突然想到TypeHandler不就是处理这种情景的吗?!!

概述

TypeHandler是Mybatis中用来将Java数据类型中和数据库类型进行相互转化的,mybatis中已经帮我们封装了大量的类型处理器,够工作中使用了。以下为mybatis中默认的的类型处理器。含有处理日期类型的DateTypeHandler,处理字符创类型的StringTypeHandler等。如下:

但是遇到特殊情景就需要我们自定义类型处理器了。

代码清单

自定义typeHandler有两种实现方式:

  • 实现TypeHandler接口
  • 继承BaseTypeHandler类

实现TypeHandler接口

package com.sxt.typehandler;

import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.type.*;

import java.sql.*;
import java.util.Arrays;
import java.util.List;

@MappedTypes({List.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MyTypeHandler implements TypeHandler<List<String>> {


    @Override
    public void setParameter(PreparedStatement ps, int i, List<String> strings, JdbcType jdbcType) throws SQLException {
        String s = StringUtils.join(strings, ",");
        ps.setString(i,s);
    }

    @Override
    public List<String> getResult(ResultSet resultSet, String s) throws SQLException {

        return Arrays.asList(resultSet.getString(s).split(","));
    }

    @Override
    public List<String> getResult(ResultSet resultSet, int i) throws SQLException {
        String s = resultSet.getString(i);
        return  Arrays.asList(s.split(","));
    }

    @Override
    public List<String> getResult(CallableStatement callableStatement, int i) throws SQLException {
        String s = callableStatement.getString(i);
        return Arrays.asList(s.split(","));
    }
}

注册TypeHandler

  • 方式一:逐个注册
<typeHandlers>
        <typeHandler handler="com.fcl.MyTypeHandler"/>
</typeHandlers>
  • 方式二:扫描包
<typeHandlers>
        <package name="com.fcl"/>
</typeHandlers>

返回结果指定TypeHandler

<resultMap id="query1" type="person">
        <id property="id" column="id"/>
        <result property="hobbys" column="hobbys" typeHandler="com.fcl.MyTypeHandler"/>
</resultMap>