Mybaitis之自定義TypeHandler

今天在項目中遇到一個須要從數據中讀取一段字符而後轉化成list類型。因爲忘記了TypeHandler的存在,就定義了一個對象,內部添加了一個StringList類型的成員變量,處理起來比較麻煩。忽然想到TypeHandler不就是處理這種情景的嗎?!!java

概述

TypeHandler是Mybatis中用來將Java數據類型中和數據庫類型進行相互轉化的,mybatis中已經幫咱們封裝了大量的類型處理器,夠工做中使用了。如下爲mybatis中默認的的類型處理器。含有處理日期類型的DateTypeHandler,處理字符創類型的StringTypeHandler等。以下: sql

可是遇到特殊情景就須要咱們自定義類型處理器了。

代碼清單

自定義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>
複製代碼
相關文章
相關標籤/搜索