MyBatis typeHandler類型處理器

Java 枚舉enum
官方文檔TypeHandler

  1. orm框架干厚,從Javabean獲取數(shù)據(jù)插入數(shù)據(jù)庫(kù),從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)創(chuàng)建Javabean象缀。
  2. 當(dāng)Javabean和數(shù)據(jù)庫(kù)表字段類型一致時(shí)顾腊,普通映射就可以處理轉(zhuǎn)換。
  3. 當(dāng)Javabean和數(shù)據(jù)庫(kù)表字段不同時(shí)鞋怀,就需要TypeHandler來(lái)處理轉(zhuǎn)換。Javabean字段類型叫javaType,數(shù)據(jù)庫(kù)字段類型叫 jdbcType,例如jdbcType為varchar 或者int 想轉(zhuǎn)為javaType為Enum時(shí)持搜;jdbcType為varchar,javaType為Date時(shí)密似。
  4. JavaType轉(zhuǎn)為jdbc想要的參數(shù)時(shí)機(jī)就是在PreparedStatement中設(shè)置參數(shù)時(shí),把jdbcType轉(zhuǎn)為javaType就是在ResultSet中取出值后葫盼。

下面以Enum類型為例残腌,文章開頭有官方文檔可以參考
1. org.apache.ibatis.type.EnumOrdinalTypeHandler
按照Enum類中出現(xiàn)順序0,1,2...
1.0 EnumSex.java

package com.company.combine.model;

/**
 * Created by liuqun on 2017/8/27.
 */
public enum EnumSex {
    MALE(1,"男"), FEMALE(2, "女");

    private int id;
    private String name;

    private EnumSex(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static EnumSex getEnumSex(int id) {
        if (id == 1) {
            return MALE;
        } else if (id == 2) {
            return FEMALE;
        }
        return null;
    }
}
public class User {
   ...
    private EnumSex enumSex;
   ...

    public EnumSex getEnumSex() {
        return enumSex;
    }

    public void setEnumSex(EnumSex enumSex) {
        this.enumSex = enumSex;
    }
}

1.1 在sqlMapConfig.xml中配置

<typeHandlers>
        <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="com.company.combine.model.EnumSex"/>
        <!--<typeHandler handler="org.apache.ibatis.type.EnumTypeHandler" javaType="com.company.combine.model.EnumSex"/>-->
        <!--<typeHandler handler="com.company.combine.model.EnumSexTypeHandler" javaType="com.company.combine.model.EnumSex"/>-->
</typeHandlers>

1.2 mapper.xml insert

 <insert id="insert" parameterType="com.company.combine.model.User"
            useGeneratedKeys="true" keyProperty="id">
        <!--<selectKey resultType="Integer" keyProperty="id" order="AFTER">-->
        <!--SELECT LAST_INSERT_ID()-->
        <!--</selectKey>-->

        INSERT INTO USER (username,sex,address,enumsex) VALUES (#{username},#{sex},#{address},#{enumSex,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler})
        <!-- INSERT INTO USER (username,sex,address,enumsex) VALUES (#{username},#{sex},#{address},#{enumSex,typeHandler=org.apache.ibatis.type.EnumTypeHandler})-->
        <!--INSERT INTO USER (username,sex,address,enumsex) VALUES (#{username},#{sex},#{address},#{enumSex,typeHandler=com.company.combine.model.EnumSexTypeHandler})-->
    </insert>

1.3 mapper.xml select

 <resultMap id="result" type="com.company.combine.model.User">
        <id property="id" column="id"/>
        <!--<result property="enumSex" column="enumsex" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>-->
        <!--<result property="enumSex" column="enumsex" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>-->
        <result property="enumSex" column="enumsex" typeHandler="com.company.combine.model.EnumSexTypeHandler"/>
    </resultMap>
    <!-- 根據(jù)類別代碼查詢數(shù)據(jù) -->
    <select id="selectAll"
            resultType="com.company.combine.model.User">
        SELECT * FROM USER
    </select>

2. org.apache.ibatis.type.EnumTypeHandler,配置如第一點(diǎn)贫导,這個(gè)是按照類型抛猫,數(shù)據(jù)庫(kù)直接是MALE,FEMALE
可以繼承TypeHandler也可以繼承BaseTypeHandler

3. 自定義的TypeHander EnumSexTypeHandler,配置如第一點(diǎn)

public class EnumSexTypeHandler implements TypeHandler<EnumSex>{
    Logger logManager = LogManager.getLogger(EnumSexTypeHandler.class);
    @Override
    public void setParameter(PreparedStatement preparedStatement, int i, EnumSex enumSex, JdbcType jdbcType) throws SQLException {
        preparedStatement.setInt(i,enumSex.getId());
        logManager.info("setParameter(PreparedStatement preparedStatement, int i, EnumSex enumSex, JdbcType jdbcType)");
    }

    @Override
    public EnumSex getResult(ResultSet resultSet, String s) throws SQLException {
        logManager.info("getResult(ResultSet resultSet, String s)");

        int id = resultSet.getInt(s);
        return EnumSex.getEnumSex(id);
    }

    @Override
    public EnumSex getResult(ResultSet resultSet, int i) throws SQLException {
        logManager.info("getResult(ResultSet resultSet, int i)");
        int id = resultSet.getInt(i);
        return EnumSex.getEnumSex(id);
    }

    @Override
    public EnumSex getResult(CallableStatement callableStatement, int i) throws SQLException {
        logManager.info("getResult(CallableStatement callableStatement, int i)");
        int id = callableStatement.getInt(i);
        return EnumSex.getEnumSex(id);
    }
}
  1. setParameter() JavaType轉(zhuǎn)為jdbc想要的參數(shù)就是在PreparedStatement中設(shè)置參數(shù)時(shí)
  2. getResult() 把jdbcType轉(zhuǎn)為javaType就是在ResultSet中取出值后孩灯。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闺金,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子峰档,更是在濱河造成了極大的恐慌败匹,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讥巡,死亡現(xiàn)場(chǎng)離奇詭異掀亩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)欢顷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門槽棍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說我怎么就攤上這事刹泄⊥饫铮” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵特石,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我鳖链,道長(zhǎng)姆蘸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任芙委,我火速辦了婚禮逞敷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘灌侣。我一直安慰自己推捐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布侧啼。 她就那樣靜靜地躺著牛柒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪痊乾。 梳的紋絲不亂的頭發(fā)上皮壁,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音哪审,去河邊找鬼蛾魄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛湿滓,可吹牛的內(nèi)容都是我干的滴须。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叽奥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扔水!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起而线,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤铭污,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后膀篮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘹狞,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年誓竿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了磅网。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡筷屡,死狀恐怖涧偷,靈堂內(nèi)的尸體忽然破棺而出簸喂,到底是詐尸還是另有隱情,我是刑警寧澤燎潮,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布喻鳄,位于F島的核電站,受9級(jí)特大地震影響确封,放射性物質(zhì)發(fā)生泄漏除呵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一爪喘、第九天 我趴在偏房一處隱蔽的房頂上張望颜曾。 院中可真熱鬧,春花似錦秉剑、人聲如沸泛豪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)诡曙。三九已至,卻和暖如春种柑,著一層夾襖步出監(jiān)牢的瞬間岗仑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工聚请, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荠雕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓驶赏,卻偏偏與公主長(zhǎng)得像炸卑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子煤傍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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

  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis 盖文? MyBatis 是支持定制化 SQL、存儲(chǔ)過程以及高級(jí)映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,523評(píng)論 0 4
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法蚯姆,類相關(guān)的語(yǔ)法五续,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法龄恋,異常的語(yǔ)法疙驾,線程的語(yǔ)...
    子非魚_t_閱讀 31,634評(píng)論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,811評(píng)論 0 11
  • 1 引言# 本文主要講解JDBC怎么演變到Mybatis的漸變過程,重點(diǎn)講解了為什么要將JDBC封裝成Mybait...
    七寸知架構(gòu)閱讀 76,469評(píng)論 36 980
  • 有存有取郭毕,不要拒絕別人幫助它碎,也要主動(dòng)去幫助別人,警惕無(wú)意識(shí)取款行為
    隔壁小志龍閱讀 193評(píng)論 2 2