mybatis入門與精通-TypeHandler詳解

mybatis為我們定義了很多自定義的Handler架专,以enum這種特殊類型來講解下如何使用内狗,其他類型的類似處理即可。

EnumTypeHandler

mybatis默認處理enum的Handler锅移,將enum的屬性名映射到數(shù)據(jù)庫中债蜜,處理為字符串梨州。

如果沒有配置typeHandler,遇到enum類型的屬性就會用EnumTypeHandler處理,要用其他的需要配置:

<configuration>
    <typeHandlers>
        <typeHandler handler="com.demo.test.service.impl.dao.handler.IdEnumHandler"
                     javaType="com.demo.test.service.type.Module" />
    </typeHandlers>
</configuration>
  • 值得注意的是诞吱,這里如果配置了jdbcType舟奠,preperStatement時就不會生效了,還是會采用EnumTypeHandler處理房维。(原因暫時沒有深究)

EnumOrdinalTypeHandler

mybatis提供的另一個處理enum的Handler沼瘫,將enum的定義順序下標映射到數(shù)據(jù)庫中,處理為整型握巢。

自定義EnumHandler

我們也可以繼承BaseTypeHandler實現(xiàn)自己的Handler晕鹊,

自定義通用EnumHandler

首先定義一個接口,讓所有要使用這個Handler的enum都實現(xiàn)這個接口暴浦。

public interface IdEnum {
    Integer getId();
}

然后可以自定義Handler溅话,主要思路來源于EnumOrdinalTypeHandler,只是他是根據(jù)enum的順序獲得,而我們要定義為根據(jù)某個特殊字段獲得歌焦,所以將他的enum數(shù)組改成Map方便處理飞几。看下他的源碼:

public class EnumOrdinalTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> {

  private Class<E> type;
  private final E[] enums;

  public EnumOrdinalTypeHandler(Class<E> type) {
    if (type == null) throw new IllegalArgumentException("Type argument cannot be null");
    this.type = type;
    /*這行代碼是注入數(shù)組独撇,我們改為Map屑墨,再根據(jù)需求確定key*/
    this.enums = type.getEnumConstants();
    if (this.enums == null) throw new IllegalArgumentException(type.getSimpleName() + " does not represent an enum type.");
  }
}

自定義通用Handler代碼如下:

public class IdEnumHandler<E extends Enum<E>> extends BaseTypeHandler<E> {
    private Class<E> type;
    private Map<Integer, E> map = new HashMap<Integer,E>();
    public IdEnumHandler(Class<E> type) {
        if (type == null) {
            throw new IllegalArgumentException("Type argument cannot be null");
        }
        this.type = type;
        E[] enums = type.getEnumConstants();
        if (enums == null) {
            throw new IllegalArgumentException(type.getSimpleName() + " does not represent an enum type.");
        }
        for (E e : enums) {
            IdEnum idEnum = (IdEnum) e;
            map.put(idEnum.getId(), e);
        }
    }
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
        IdEnum idEnum = (IdEnum) parameter;
        ps.setInt(i, idEnum.getId());
    }
    @Override
    public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
        int i = rs.getInt(columnName);
        if (rs.wasNull()) {
            return null;
        } else {
            return getIdEnum(i);
        }
    }
    @Override
    public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        int i = rs.getInt(columnIndex);
        if (rs.wasNull()) {
            return null;
        } else {
            return getIdEnum(i);
        }
    }
    @Override
    public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        int i = cs.getInt(columnIndex);
        if (cs.wasNull()) {
            return null;
        } else {
            return getIdEnum(i);
        }
    }
    private E getIdEnum(int id) {
        try {
            return map.get(id);
        } catch (Exception ex) {
            throw new IllegalArgumentException(
                    "Cannot convert " + id + " to " + type.getSimpleName() + " by value.", ex);
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纷铣,隨后出現(xiàn)的幾起案子卵史,更是在濱河造成了極大的恐慌,老刑警劉巖搜立,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件以躯,死亡現(xiàn)場離奇詭異,居然都是意外死亡啄踊,警方通過查閱死者的電腦和手機忧设,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颠通,“玉大人址晕,你說我怎么就攤上這事《倜蹋” “怎么了谨垃?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵启搂,是天一觀的道長。 經(jīng)常有香客問我刘陶,道長狐血,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任易核,我火速辦了婚禮,結(jié)果婚禮上浪默,老公的妹妹穿的比我還像新娘牡直。我一直安慰自己,他們只是感情好纳决,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布碰逸。 她就那樣靜靜地躺著,像睡著了一般阔加。 火紅的嫁衣襯著肌膚如雪饵史。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天胜榔,我揣著相機與錄音胳喷,去河邊找鬼。 笑死夭织,一個胖子當著我的面吹牛吭露,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尊惰,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼讲竿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弄屡?” 一聲冷哼從身側(cè)響起题禀,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎膀捷,沒想到半個月后迈嘹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡担孔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年江锨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糕篇。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡啄育,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拌消,到底是詐尸還是另有隱情挑豌,我是刑警寧澤安券,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站氓英,受9級特大地震影響侯勉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜铝阐,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一址貌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧徘键,春花似錦练对、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至它呀,卻和暖如春螺男,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纵穿。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工下隧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人政恍。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓汪拥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親篙耗。 傳聞我的和親對象是個殘疾皇子迫筑,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL宗弯、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,511評論 0 4
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理脯燃,服務發(fā)現(xiàn),斷路器蒙保,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 群里有位抑郁癥患者邓厕,有十年的病史逝嚎,是個記者,說自己所接觸過的心理醫(yī)生大部分都是自己有很多心理問題的详恼,卻治愈不...
    競二閱讀 807評論 6 5
  • 昨天是女生獨立日伟桅,晚上與這三位巨匠去江湖酒吧,聽大瓦哥最最最喜歡的女神劉潤潔唱情歌叽掘,請看此圖楣铁! 人的一生,就是一場...
    北京盛藝閣文化傳媒閱讀 160評論 0 0