Mybaitis之自定義TypeHandler

玉獅子發表於2019-04-25

今天在專案中遇到一個需要從資料中讀取一段字元然後轉化成list型別。由於忘記了TypeHandler的存在,就定義了一個物件,內部新增了一個StringList型別的成員變數,處理起來比較麻煩。突然想到TypeHandler不就是處理這種情景的嗎?!!

概述

TypeHandler是Mybatis中用來將Java資料型別中和資料庫型別進行相互轉化的,mybatis中已經幫我們封裝了大量的型別處理器,夠工作中使用了。以下為mybatis中預設的的型別處理器。含有處理日期型別的DateTypeHandler,處理字元創型別的StringTypeHandler等。如下:

Mybaitis之自定義TypeHandler
但是遇到特殊情景就需要我們自定義型別處理器了。

程式碼清單

自定義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>
複製程式碼

相關文章